ZGlmZiAtLWdpdCBhL2hscnN5bmMvaGxyc3luYy5weSBiL2hscnN5bmMvaGxyc3luYy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNGE0OTU1Ci0tLSAvZGV2L251bGwKKysrIGIvaGxyc3luYy9obHJzeW5jLnB5CkBAIC0wLDAgKzEsMTI1IEBACisjIS91c3IvYmluL3B5dGhvbjIuNQorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50CisKK2Zyb20gcHlzcWxpdGUyIGltcG9ydCBkYmFwaTIgYXMgc3FsaXRlMworaW1wb3J0IHN5cworCitobHIgPSBzcWxpdGUzLmNvbm5lY3Qoc3lzLmFyZ3ZbMV0pCit3ZWIgPSBzcWxpdGUzLmNvbm5lY3Qoc3lzLmFyZ3ZbMl0pCisKKyMgc3dpdGNoIHRvIGF1dG9jb21taXQKK2hsci5pc29sYXRpb25fbGV2ZWwgPSBOb25lCit3ZWIuaXNvbGF0aW9uX2xldmVsID0gTm9uZQorCitobHIucm93X2ZhY3RvcnkgPSBzcWxpdGUzLlJvdword2ViLnJvd19mYWN0b3J5ID0gc3FsaXRlMy5Sb3cKKword2l0aCBobHI6CisJaGxyX3N1YnNjcnMgPSBobHIuZXhlY3V0ZSgiIiIKKwkJU0VMRUNUICogRlJPTSBTdWJzY3JpYmVyCisJIiIiKS5mZXRjaGFsbCgpCisJaGxyX3Rva2VucyA9IGhsci5leGVjdXRlKCIiIgorCQlTRUxFQ1QgKiBGUk9NIEF1dGhUb2tlbgorCSIiIikuZmV0Y2hhbGwoKQorCit3aXRoIHdlYjoKKwl3ZWJfdG9rZW5zID0gd2ViLmV4ZWN1dGUoIiIiCisJCVNFTEVDVCAqIEZST00gcmVnX3Rva2VucworCSIiIikuZmV0Y2hhbGwoKQorCXdlYl9zbXMgPSB3ZWIuZXhlY3V0ZSgiIiIKKwkJU0VMRUNUICogRlJPTSBzbXNfcXVldWUKKwkiIiIpLmZldGNoYWxsKCkKKworIyBpbmRleCBieSBzdWJzY3IgaWQKK2hscl9zdWJzY3JzX2J5X2lkID0ge30KK2hscl9zdWJzY3JzX2J5X2V4dCA9IHt9CitobHJfdG9rZW5zX2J5X3N1YnNjcl9pZCA9IHt9Citmb3IgeCBpbiBobHJfc3Vic2NyczoKKwlobHJfc3Vic2Nyc19ieV9pZFt4WydpZCddXSA9IHgKKwlobHJfc3Vic2Nyc19ieV9leHRbeFsnZXh0ZW5zaW9uJ11dID0geAorZGVsIGhscl9zdWJzY3JzCitmb3IgeCBpbiBobHJfdG9rZW5zOgorCWhscl90b2tlbnNfYnlfc3Vic2NyX2lkW3hbJ3N1YnNjcmliZXJfaWQnXV0gPSB4CitkZWwgaGxyX3Rva2VucworCit3ZWJfdG9rZW5zX2J5X3N1YnNjcl9pZCA9IHt9Citmb3IgeCBpbiB3ZWJfdG9rZW5zOgorCXdlYl90b2tlbnNfYnlfc3Vic2NyX2lkW3hbJ3N1YnNjcmliZXJfaWQnXV0gPSB4CitkZWwgd2ViX3Rva2VucworCisjIHJlbW92ZSBsZWZ0b3ZlciB3ZWJfdG9rZW5zIGFuZCBjb3JyZWN0IGluY29uc2lzdGVudCBmaWVsZHMKK3dpdGggd2ViOgorCWZvciB4IGluIHdlYl90b2tlbnNfYnlfc3Vic2NyX2lkLnZhbHVlcygpOgorCQlzdWJzY3IgPSBobHJfc3Vic2Nyc19ieV9pZC5nZXQoeFsnc3Vic2NyaWJlcl9pZCddLCBOb25lKQorCQlpZiBzdWJzY3IgaXMgTm9uZToKKwkJCXdlYi5leGVjdXRlKCIiIgorCQkJCSAgICAgIERFTEVURSBGUk9NIHJlZ190b2tlbnMgV0hFUkUgc3Vic2NyaWJlcl9pZCA9ID8KKwkJCQkgICAiIiIsICh4WydzdWJzY3JpYmVyX2lkJ10sKSkKKwkJCWRlbCB3ZWJfdG9rZW5zX2J5X3N1YnNjcl9pZFt4WydzdWJzY3JpYmVyX2lkJ11dCisJCQljb250aW51ZQorCQlpZiBzdHIoeFsnaW1zaSddKSAhPSBzdHIoc3Vic2NyWydpbXNpJ10pIG9yIFwKKwkJICAgeFsnZXh0ZW5zaW9uJ10gIT0gc3Vic2NyWydleHRlbnNpb24nXSBvciBcCisJCSAgIHhbJ3Rtc2knXSAhPSBzdWJzY3JbJ3Rtc2knXSBvciBcCisJCSAgIHhbJ2xhYyddICE9IHN1YnNjclsnbGFjJ106CisJCQl3ZWIuZXhlY3V0ZSgiIiIKKwkJCQkgICAgICBVUERBVEUgcmVnX3Rva2VucworCQkJCSAgICAgIFNFVCBpbXNpID0gPywgZXh0ZW5zaW9uID0gPywgdG1zaSA9ID8sIGxhYyA9ID8KKwkJCQkgICAgICBXSEVSRSBzdWJzY3JpYmVyX2lkID0gPworCQkJCSAgICIiIiwgKHN0cihzdWJzY3JbJ2ltc2knXSksIHN1YnNjclsnZXh0ZW5zaW9uJ10sCisJCQkJICAgc3Vic2NyWyd0bXNpJ10sIHN1YnNjclsnbGFjJ10sIHhbJ3N1YnNjcmliZXJfaWQnXSkpCisKKyMgYWRkIG1pc3Npbmcgd2ViX3Rva2Vucword2l0aCB3ZWI6CisJZm9yIHggaW4gaGxyX3Rva2Vuc19ieV9zdWJzY3JfaWQudmFsdWVzKCk6CisJCXN1YnNjciA9IGhscl9zdWJzY3JzX2J5X2lkLmdldCh4WydzdWJzY3JpYmVyX2lkJ10sIE5vbmUpCisJCWlmIHN1YnNjciBpcyBOb25lOgorCQkJaGxyLmV4ZWN1dGUoIiIiCisJCQkJICAgICAgREVMRVRFIEZST00gQXV0aFRva2VuIFdIRVJFIHN1YnNjcmliZXJfaWQgPSA/CisJCQkJICAgIiIiLCAoeFsnc3Vic2NyaWJlcl9pZCddLCkpCisJCQlkZWwgaGxyX3Rva2Vuc19ieV9zdWJzY3JfaWRbeFsnc3Vic2NyaWJlcl9pZCddXQorCQkJY29udGludWUKKwkJd2VidG9rZW4gPSB3ZWJfdG9rZW5zX2J5X3N1YnNjcl9pZC5nZXQoeFsnc3Vic2NyaWJlcl9pZCddLCBOb25lKQorCQlpZiB3ZWJ0b2tlbiBpcyBOb25lOgorCQkJd2ViLmV4ZWN1dGUoIiIiCisJCQkJICAgICAgSU5TRVJUIElOVE8gcmVnX3Rva2VucworCQkJCSAgICAgIChzdWJzY3JpYmVyX2lkLCBleHRlbnNpb24sIHJlZ19jb21wbGV0ZWQsIG5hbWUsIGVtYWlsLCBsYWMsIGltc2ksIHRva2VuLCB0bXNpKQorCQkJCSAgICAgIFZBTFVFUworCQkJCSAgICAgICg/LCA/LCAwLCA/LCAnJywgPywgPywgPywgPykKKwkJCQkgICAiIiIsICh4WydzdWJzY3JpYmVyX2lkJ10sIHN1YnNjclsnZXh0ZW5zaW9uJ10sIHN1YnNjclsnbmFtZSddLAorCQkJCSAgIHN1YnNjclsnbGFjJ10sIHN0cihzdWJzY3JbJ2ltc2knXSksIHhbJ3Rva2VuJ10sIHN1YnNjclsndG1zaSddKSkKKworIyBhdXRob3JpemUgc3Vic2NyaWJlcnMKK3dpdGggaGxyOgorCWZvciB4IGluIHdlYl90b2tlbnNfYnlfc3Vic2NyX2lkLnZhbHVlcygpOgorCQlzdWJzY3IgPSBobHJfc3Vic2Nyc19ieV9pZC5nZXQoeFsnc3Vic2NyaWJlcl9pZCddLCBOb25lKQorCQlpZiB4WydyZWdfY29tcGxldGVkJ10gYW5kIG5vdCBzdWJzY3JbJ2F1dGhvcml6ZWQnXToKKwkJCWhsci5leGVjdXRlKCIiIgorCQkJCSAgICAgIFVQREFURSBTdWJzY3JpYmVyCisJCQkJICAgICAgU0VUIGF1dGhvcml6ZWQgPSAxCisJCQkJICAgICAgV0hFUkUgaWQgPSA/CisJCQkJICAgIiIiLCAoeFsnc3Vic2NyaWJlcl9pZCddLCkpCisKKyMgU3luYyBTTVMgZnJvbSB3ZWIgdG8gaGxyCit3aXRoIGhscjoKKwlmb3Igc21zIGluIHdlYl9zbXM6CisJCXN1YnNjciA9IGhscl9zdWJzY3JzX2J5X2V4dC5nZXQoc21zWydyZWNlaXZlcl9leHQnXSkKKwkJaWYgc3Vic2NyIGlzIE5vbmU6CisJCQlwcmludCAnJXMgbm90IGZvdW5kJyAlIHNtc1sncmVjZWl2ZXJfZXh0J10KKwkJCWNvbnRpbnVlCisJCWhsci5leGVjdXRlKCIiIgorCQkJCSAgICAgIElOU0VSVCBJTlRPIFNNUworCQkJCSAgICAgIChjcmVhdGVkLCBzZW5kZXJfaWQsIHJlY2VpdmVyX2lkLCByZXBseV9wYXRoX3JlcSwgc3RhdHVzX3JlcF9yZXEsIHByb3RvY29sX2lkLCBkYXRhX2NvZGluZ19zY2hlbWUsIHVkX2hkcl9pbmQsIHRleHQpCisJCQkJICAgICAgVkFMVUVTCisJCQkJICAgICAgKD8sIDEsID8sIDAsIDAsIDAsIDAsIDAsID8pCisJCQkJICAgIiIiLCAoc21zWydjcmVhdGVkJ10sIHN1YnNjclsnaWQnXSwgc21zWyd0ZXh0J10pKQord2l0aCB3ZWI6CisJZm9yIHNtcyBpbiB3ZWJfc21zOgorCQl3ZWIuZXhlY3V0ZSgiIiIKKwkJCQkgICAgICBERUxFVEUgRlJPTSBzbXNfcXVldWUgV0hFUkUgaWQgPSA/CisJCQkJICAgIiIiLCAoc21zWydpZCddLCkpCisKKworaGxyLmNsb3NlKCkKK3dlYi5jbG9zZSgpCisKZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi9saWJvc21vY29yZS8uZ2l0aWdub3JlCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSAuZ2l0aWdub3JlCnJlbmFtZSB0byBsaWJvc21vY29yZS8uZ2l0aWdub3JlCmRpZmYgLS1naXQgYS9DT1BZSU5HIGIvbGlib3Ntb2NvcmUvQ09QWUlORwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gQ09QWUlORwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvQ09QWUlORwpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuYW0gYi9saWJvc21vY29yZS9NYWtlZmlsZS5hbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gTWFrZWZpbGUuYW0KcmVuYW1lIHRvIGxpYm9zbW9jb3JlL01ha2VmaWxlLmFtCmRpZmYgLS1naXQgYS9jb25maWd1cmUuaW4gYi9saWJvc21vY29yZS9jb25maWd1cmUuaW4Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvbmZpZ3VyZS5pbgpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvY29uZmlndXJlLmluCmRpZmYgLS1naXQgYS9naXQtdmVyc2lvbi1nZW4gYi9saWJvc21vY29yZS9naXQtdmVyc2lvbi1nZW4Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGdpdC12ZXJzaW9uLWdlbgpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvZ2l0LXZlcnNpb24tZ2VuCmRpZmYgLS1naXQgYS9pbmNsdWRlL01ha2VmaWxlLmFtIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9NYWtlZmlsZS5hbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9NYWtlZmlsZS5hbQpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9NYWtlZmlsZS5hbQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9NYWtlZmlsZS5hbSBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvTWFrZWZpbGUuYW0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvTWFrZWZpbGUuYW0KcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvTWFrZWZpbGUuYW0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvYml0dmVjLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2JpdHZlYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL2JpdHZlYy5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2JpdHZlYy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL2NvbXAxMjguaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvY29tcDEyOC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL2NvbXAxMjguaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9jb21wMTI4LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtMDgwOC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9nc20wODA4LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvZ3NtMDgwOC5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbTA4MDguaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9nc200OC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9nc200OC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL2dzbTQ4LmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtNDguaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9nc200OF9pZS5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9nc200OF9pZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL2dzbTQ4X2llLmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtNDhfaWUuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9nc21fdXRpbHMuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtX3V0aWxzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvZ3NtX3V0aWxzLmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtX3V0aWxzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtdGFwLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbXRhcC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL2dzbXRhcC5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbXRhcC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL2xpbnV4bGlzdC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9saW51eGxpc3QuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9saW51eGxpc3QuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9saW51eGxpc3QuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9sb2dnaW5nLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2xvZ2dpbmcuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9sb2dnaW5nLmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvbG9nZ2luZy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL21uY2MuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvbW5jYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL21uY2MuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9tbmNjLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvbXNnYi5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9tc2diLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvbXNnYi5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL21zZ2IuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9NYWtlZmlsZS5hbSBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvTWFrZWZpbGUuYW0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvTWFrZWZpbGUuYW0KcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvTWFrZWZpbGUuYW0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzA4LmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF8wOC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF8wOC5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF8wOC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF8xMS5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfMTEuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfMTEuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfMTEuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfODAuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzgwLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzgwLmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzgwLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA4XzA4LmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wOF8wOC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wOF8wOC5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wOF8wOC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wOF81OC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDhfNTguaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDhfNTguaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDhfNTguaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMTJfMjEuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzEyXzIxLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzEyXzIxLmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzEyXzIxLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvcnNsLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3JzbC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL3JzbC5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3JzbC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL3J4bGV2X3N0YXQuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcnhsZXZfc3RhdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL3J4bGV2X3N0YXQuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9yeGxldl9zdGF0LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvc2VsZWN0LmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3NlbGVjdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL3NlbGVjdC5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3NlbGVjdC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL3NpZ25hbC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9zaWduYWwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9zaWduYWwuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9zaWduYWwuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9zdGF0aXN0aWNzLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3N0YXRpc3RpY3MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9zdGF0aXN0aWNzLmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvc3RhdGlzdGljcy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL3RhbGxvYy5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS90YWxsb2MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS90YWxsb2MuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS90YWxsb2MuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS90aW1lci5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS90aW1lci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL3RpbWVyLmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvdGltZXIuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS90bHYuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvdGx2LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvdGx2LmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvdGx2LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvdXRpbHMuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvdXRpbHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS91dGlscy5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3V0aWxzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvd3JpdGVfcXVldWUuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvd3JpdGVfcXVldWUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS93cml0ZV9xdWV1ZS5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3dyaXRlX3F1ZXVlLmgKZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlLnBjLmluIGIvbGlib3Ntb2NvcmUvbGlib3Ntb2NvcmUucGMuaW4Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYm9zbW9jb3JlLnBjLmluCnJlbmFtZSB0byBsaWJvc21vY29yZS9saWJvc21vY29yZS5wYy5pbgpkaWZmIC0tZ2l0IGEvbTQvRFVNTVkgYi9saWJvc21vY29yZS9tNC9EVU1NWQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbTQvRFVNTVkKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL200L0RVTU1ZCmRpZmYgLS1naXQgYS9zcmMvTWFrZWZpbGUuYW0gYi9saWJvc21vY29yZS9zcmMvTWFrZWZpbGUuYW0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9NYWtlZmlsZS5hbQpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL01ha2VmaWxlLmFtCmRpZmYgLS1naXQgYS9zcmMvYml0dmVjLmMgYi9saWJvc21vY29yZS9zcmMvYml0dmVjLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9iaXR2ZWMuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL2JpdHZlYy5jCmRpZmYgLS1naXQgYS9zcmMvY29tcDEyOC5jIGIvbGlib3Ntb2NvcmUvc3JjL2NvbXAxMjguYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2NvbXAxMjguYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL2NvbXAxMjguYwpkaWZmIC0tZ2l0IGEvc3JjL2dzbTA4MDguYyBiL2xpYm9zbW9jb3JlL3NyYy9nc20wODA4LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9nc20wODA4LmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3NyYy9nc20wODA4LmMKZGlmZiAtLWdpdCBhL3NyYy9nc200OC5jIGIvbGlib3Ntb2NvcmUvc3JjL2dzbTQ4LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9nc200OC5jCnJlbmFtZSB0byBsaWJvc21vY29yZS9zcmMvZ3NtNDguYwpkaWZmIC0tZ2l0IGEvc3JjL2dzbTQ4X2llLmMgYi9saWJvc21vY29yZS9zcmMvZ3NtNDhfaWUuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2dzbTQ4X2llLmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3NyYy9nc200OF9pZS5jCmRpZmYgLS1naXQgYS9zcmMvZ3NtX3V0aWxzLmMgYi9saWJvc21vY29yZS9zcmMvZ3NtX3V0aWxzLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9nc21fdXRpbHMuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL2dzbV91dGlscy5jCmRpZmYgLS1naXQgYS9zcmMvbG9nZ2luZy5jIGIvbGlib3Ntb2NvcmUvc3JjL2xvZ2dpbmcuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2xvZ2dpbmcuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL2xvZ2dpbmcuYwpkaWZmIC0tZ2l0IGEvc3JjL21zZ2IuYyBiL2xpYm9zbW9jb3JlL3NyYy9tc2diLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9tc2diLmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3NyYy9tc2diLmMKZGlmZiAtLWdpdCBhL3NyYy9yc2wuYyBiL2xpYm9zbW9jb3JlL3NyYy9yc2wuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3JzbC5jCnJlbmFtZSB0byBsaWJvc21vY29yZS9zcmMvcnNsLmMKZGlmZiAtLWdpdCBhL3NyYy9yeGxldl9zdGF0LmMgYi9saWJvc21vY29yZS9zcmMvcnhsZXZfc3RhdC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvcnhsZXZfc3RhdC5jCnJlbmFtZSB0byBsaWJvc21vY29yZS9zcmMvcnhsZXZfc3RhdC5jCmRpZmYgLS1naXQgYS9zcmMvc2VsZWN0LmMgYi9saWJvc21vY29yZS9zcmMvc2VsZWN0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9zZWxlY3QuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL3NlbGVjdC5jCmRpZmYgLS1naXQgYS9zcmMvc2lnbmFsLmMgYi9saWJvc21vY29yZS9zcmMvc2lnbmFsLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9zaWduYWwuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL3NpZ25hbC5jCmRpZmYgLS1naXQgYS9zcmMvc3RhdGlzdGljcy5jIGIvbGlib3Ntb2NvcmUvc3JjL3N0YXRpc3RpY3MuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3N0YXRpc3RpY3MuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL3N0YXRpc3RpY3MuYwpkaWZmIC0tZ2l0IGEvc3JjL3RhbGxvYy5jIGIvbGlib3Ntb2NvcmUvc3JjL3RhbGxvYy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGFsbG9jLmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3NyYy90YWxsb2MuYwpkaWZmIC0tZ2l0IGEvc3JjL3RpbWVyLmMgYi9saWJvc21vY29yZS9zcmMvdGltZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RpbWVyLmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3NyYy90aW1lci5jCmRpZmYgLS1naXQgYS9zcmMvdGx2X3BhcnNlci5jIGIvbGlib3Ntb2NvcmUvc3JjL3Rsdl9wYXJzZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3Rsdl9wYXJzZXIuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL3Rsdl9wYXJzZXIuYwpkaWZmIC0tZ2l0IGEvc3JjL3V0aWxzLmMgYi9saWJvc21vY29yZS9zcmMvdXRpbHMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3V0aWxzLmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3NyYy91dGlscy5jCmRpZmYgLS1naXQgYS9zcmMvd3JpdGVfcXVldWUuYyBiL2xpYm9zbW9jb3JlL3NyYy93cml0ZV9xdWV1ZS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvd3JpdGVfcXVldWUuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL3dyaXRlX3F1ZXVlLmMKZGlmZiAtLWdpdCBhL3Rlc3RzL01ha2VmaWxlLmFtIGIvbGlib3Ntb2NvcmUvdGVzdHMvTWFrZWZpbGUuYW0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL01ha2VmaWxlLmFtCnJlbmFtZSB0byBsaWJvc21vY29yZS90ZXN0cy9NYWtlZmlsZS5hbQpkaWZmIC0tZ2l0IGEvdGVzdHMvc21zL01ha2VmaWxlLmFtIGIvbGlib3Ntb2NvcmUvdGVzdHMvc21zL01ha2VmaWxlLmFtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9zbXMvTWFrZWZpbGUuYW0KcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3Rlc3RzL3Ntcy9NYWtlZmlsZS5hbQpkaWZmIC0tZ2l0IGEvdGVzdHMvc21zL3Ntc190ZXN0LmMgYi9saWJvc21vY29yZS90ZXN0cy9zbXMvc21zX3Rlc3QuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvc21zL3Ntc190ZXN0LmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3Rlc3RzL3Ntcy9zbXNfdGVzdC5jCmRpZmYgLS1naXQgYS90ZXN0cy90aW1lci9NYWtlZmlsZS5hbSBiL2xpYm9zbW9jb3JlL3Rlc3RzL3RpbWVyL01ha2VmaWxlLmFtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy90aW1lci9NYWtlZmlsZS5hbQpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvdGVzdHMvdGltZXIvTWFrZWZpbGUuYW0KZGlmZiAtLWdpdCBhL3Rlc3RzL3RpbWVyL3RpbWVyX3Rlc3QuYyBiL2xpYm9zbW9jb3JlL3Rlc3RzL3RpbWVyL3RpbWVyX3Rlc3QuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvdGltZXIvdGltZXJfdGVzdC5jCnJlbmFtZSB0byBsaWJvc21vY29yZS90ZXN0cy90aW1lci90aW1lcl90ZXN0LmMKZGlmZiAtLWdpdCBhL2xpbnV4LWtlcm5lbC9saW51eC0yLjYuMjcuNC1taXNkbi1hYmlzLmRpZmYgYi9saW51eC1rZXJuZWwvbGludXgtMi42LjI3LjQtbWlzZG4tYWJpcy5kaWZmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2OTFlZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC1rZXJuZWwvbGludXgtMi42LjI3LjQtbWlzZG4tYWJpcy5kaWZmCkBAIC0wLDAgKzEsMTQ0IEBACitkaWZmIC1OcnUgLS1leGNsdWRlLWZyb20gL3N1bmJlYW0vaG9tZS9sYWZvcmdlL3NjcmlwdHMvZG9udGRpZmYgbGludXgtMi42LjI3LjQtY2xlYW4vZHJpdmVycy9pc2RuL21JU0ROL2xheWVyMi5jIGxpbnV4LTIuNi4yNy40L2RyaXZlcnMvaXNkbi9tSVNETi9sYXllcjIuYworLS0tIGxpbnV4LTIuNi4yNy40LWNsZWFuL2RyaXZlcnMvaXNkbi9tSVNETi9sYXllcjIuYwkyMDA4LTEwLTI2IDAwOjA1OjA3LjAwMDAwMDAwMCArMDIwMAorKysrIGxpbnV4LTIuNi4yNy40L2RyaXZlcnMvaXNkbi9tSVNETi9sYXllcjIuYwkyMDA4LTEyLTIzIDE2OjE2OjI5LjAwMDAwMDAwMCArMDEwMAorQEAgLTk0LDggKzk0LDEwIEBACisgCXN0cnVjdCBsYXllcjIgKmwyID0gZmktPnVzZXJkYXRhOworIAl2YV9saXN0IHZhOworIAorKyNpZiAwCisgCWlmICghKCpkZWJ1ZyAmIERFQlVHX0wyX0ZTTSkpCisgCQlyZXR1cm47CisrI2VuZGlmCisgCXZhX3N0YXJ0KHZhLCBmbXQpOworIAlwcmludGsoS0VSTl9ERUJVRyAibDIgKHRlaSAlZCk6ICIsIGwyLT50ZWkpOworIAl2cHJpbnRrKGZtdCwgdmEpOworQEAgLTg4Miw2ICs4ODQsOCBAQAorIAlsMi0+dmEgPSAwOworIAlsMi0+dnIgPSAwOworIAlsMi0+c293ID0gMDsKKysJbDItPnNhcGkgPSBza2ItPmRhdGFbMF0gPj4gMjsKKysJc2V0X2NoYW5uZWxfYWRkcmVzcygmbDItPmNoLCBsMi0+c2FwaSwgbDItPnRlaSk7CisgCWNsZWFyX2V4Y2VwdGlvbihsMik7CisgCXNlbmRfdWZyYW1lKGwyLCBOVUxMLCBVQSB8IGdldF9Qb2xsRmxhZyhsMiwgc2tiKSwgUlNQKTsKKyAJbUlTRE5fRnNtQ2hhbmdlU3RhdGUoZmksIFNUX0wyXzcpOworQEAgLTg5OCw2ICs5MDIsNyBAQAorIAlzdHJ1Y3QgbGF5ZXIyICpsMiA9IGZpLT51c2VyZGF0YTsKKyAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGFyZzsKKyAKKysJcHJpbnRrKEtFUk5fREVCVUcgImwyX3NlbmRfVUEoKVxuIik7CisgCXNlbmRfdWZyYW1lKGwyLCBza2IsIFVBIHwgZ2V0X1BvbGxGbGFnKGwyLCBza2IpLCBSU1ApOworIH0KKyAKK0BAIC05MzEsNiArOTM2LDggQEAKKyAJbDItPnZhID0gMDsKKyAJbDItPnZyID0gMDsKKyAJbDItPnNvdyA9IDA7CisrCWwyLT5zYXBpID0gc2tiLT5kYXRhWzBdID4+IDI7CisrCXNldF9jaGFubmVsX2FkZHJlc3MoJmwyLT5jaCwgbDItPnNhcGksIGwyLT50ZWkpOworIAltSVNETl9Gc21DaGFuZ2VTdGF0ZShmaSwgU1RfTDJfNyk7CisgCXN0b3BfdDIwMChsMiwgMyk7CisgCW1JU0ROX0ZzbVJlc3RhcnRUaW1lcigmbDItPnQyMDMsIGwyLT5UMjAzLCBFVl9MMl9UMjAzLCBOVUxMLCAzKTsKK0BAIC05ODIsNiArOTg5LDggQEAKKyAJfSBlbHNlIGlmIChsMi0+dnMgIT0gbDItPnZhKSB7CisgCQlza2JfcXVldWVfcHVyZ2UoJmwyLT5pX3F1ZXVlKTsKKyAJCXByID0gRExfRVNUQUJMSVNIX0lORDsKKysJCS8vbDItPnNhcGkgPSBza2ItPmRhdGFbMF0gPj4gMjsKKysJCS8vc2V0X2NoYW5uZWxfYWRkcmVzcygmbDItPmNoLCBsMi0+c2FwaSwgbDItPnRlaSk7CisgCX0KKyAJc3RvcF90MjAwKGwyLCA1KTsKKyAJbDItPnZyID0gMDsKK0BAIC0xODQxLDExICsxODUwLDE0IEBACisgCXVfaW50CWw7CisgCWludAljID0gMDsKKyAKKysJcHJpbnRrKEtFUk5fREVCVUcgInBoX2RhdGFfaW5kaWNhdGlvbiAweCV4IDB4JXggMHgleFxuIiwgZGF0YXBbMF0sIGRhdGFwWzFdLCBkYXRhcFsyXSk7CisrCisgCWwgPSBsMmFkZHJzaXplKGwyKTsKKyAJaWYgKHNrYi0+bGVuIDw9IGwpIHsKKyAJCW1JU0ROX0ZzbUV2ZW50KCZsMi0+bDJtLCBFVl9MMl9GUkFNRV9FUlJPUiwgKHZvaWQgKikgJ04nKTsKKyAJCXJldHVybiByZXQ7CisgCX0KKysjaWYgMAorIAlpZiAodGVzdF9iaXQoRkxHX0xBUEQsICZsMi0+ZmxhZykpIHsgLyogTWF5YmUgbm90IG5lZWRlZCAqLworIAkJcHNhcGkgPSAqZGF0YXArKzsKKyAJCXB0ZWkgPSAqZGF0YXArKzsKK0BAIC0xODc1LDYgKzE4ODcsNyBAQAorIAkJCXJldHVybiAwOworIAkJfQorIAl9IGVsc2UKKysjZW5kaWYKKyAJCWRhdGFwICs9IGw7CisgCWlmICghKCpkYXRhcCAmIDEpKSB7CS8qIEktRnJhbWUgKi8KKyAJCWMgPSBpZnJhbWVfZXJyb3IobDIsIHNrYik7CitAQCAtMTg5MCw2ICsxOTAzLDcgQEAKKyAJCQlyZXQgPSBtSVNETl9Gc21FdmVudCgmbDItPmwybSwgRVZfTDJfVUksIHNrYik7CisgCX0gZWxzZSBpZiAoSXNTQUJNRShkYXRhcCwgbDIpKSB7CisgCQljID0gdW5udW1fZXJyb3IobDIsIHNrYiwgQ01EKTsKKysJCXByaW50ayhLRVJOX0RFQlVHICJJc1NBQk1FKCkgcmV0dXJuZWQgdHJ1ZSwgdW5udW1fZXJyb3I9JWRcbiIsIGMpOworIAkJaWYgKCFjKQorIAkJCXJldCA9IG1JU0ROX0ZzbUV2ZW50KCZsMi0+bDJtLCBFVl9MMl9TQUJNRSwgc2tiKTsKKyAJfSBlbHNlIGlmIChJc1VBKGRhdGFwKSkgeworQEAgLTIwODcsNyArMjEwMSw3IEBACisgCQl0ZXN0X2FuZF9zZXRfYml0KEZMR19MQVBELCAmbDItPmZsYWcpOworIAkJdGVzdF9hbmRfc2V0X2JpdChGTEdfTEFQRF9ORVQsICZsMi0+ZmxhZyk7CisgCQl0ZXN0X2FuZF9zZXRfYml0KEZMR19NT0QxMjgsICZsMi0+ZmxhZyk7CistCQlsMi0+c2FwaSA9IDA7CisrCQlsMi0+c2FwaSA9IDYyOworIAkJbDItPm1heGxlbiA9IE1BWF9ERlJBTUVfTEVOOworIAkJaWYgKHRlc3RfYml0KE9QVElPTl9MMl9QTVgsICZvcHRpb25zKSkKKyAJCQlsMi0+d2luZG93ID0gNzsKK2RpZmYgLU5ydSAtLWV4Y2x1ZGUtZnJvbSAvc3VuYmVhbS9ob21lL2xhZm9yZ2Uvc2NyaXB0cy9kb250ZGlmZiBsaW51eC0yLjYuMjcuNC1jbGVhbi9kcml2ZXJzL2lzZG4vbUlTRE4vdGVpLmMgbGludXgtMi42LjI3LjQvZHJpdmVycy9pc2RuL21JU0ROL3RlaS5jCistLS0gbGludXgtMi42LjI3LjQtY2xlYW4vZHJpdmVycy9pc2RuL21JU0ROL3RlaS5jCTIwMDgtMTAtMjYgMDA6MDU6MDcuMDAwMDAwMDAwICswMjAwCisrKysgbGludXgtMi42LjI3LjQvZHJpdmVycy9pc2RuL21JU0ROL3RlaS5jCTIwMDgtMTItMjMgMTY6MzI6NTkuMDAwMDAwMDAwICswMTAwCitAQCAtODMwLDE4ICs4MzAsMjkgQEAKKyAJaW50CQl0ZWksIHJpOworIAlzdHJ1Y3QgbGF5ZXIyCSpsMjsKKyAKKysJcHJpbnRrKEtFUk5fREVCVUcgIm5ldyB0ZWkgcmVxdWVzdDogdGVpPSVkXG4iLCBkcFszXSA+PiAxKTsKKysKKyAJcmkgPSBkcFswXSA8PCA4OworIAlyaSArPSBkcFsxXTsKKy0JaWYgKCFtZ3ItPnVwKQorLQkJZ290byBkZW5pZWQ7CistCXRlaSA9IGdldF9mcmVlX3RlaShtZ3IpOworLQlpZiAodGVpIDwgMCkgeworLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6Tm8gZnJlZSB0ZWlcbiIsIF9fZnVuY19fKTsKKysJaWYgKCFtZ3ItPnVwKSB7CisrCQlwcmludGsoS0VSTl9ERUJVRyAibWdyLT51cCA9PSBOVUxMXG4iKTsKKyAJCWdvdG8gZGVuaWVkOworIAl9CisrCWlmIChkcFszXSAhPSAweGZmKSB7CisrCQkvKiBUaGlzIGlzIGEgVEVJIHJlcXVlc3QgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMDguNTYgNi4xLjExLjIgKi8KKysJCXRlaSA9IGRwWzNdID4+IDE7CisrCX0gZWxzZSB7CisrCQl0ZWkgPSBnZXRfZnJlZV90ZWkobWdyKTsKKysJCWlmICh0ZWkgPCAwKSB7CisrCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6Tm8gZnJlZSB0ZWlcbiIsIF9fZnVuY19fKTsKKysJCQlnb3RvIGRlbmllZDsKKysJCX0KKysJfQorIAlsMiA9IGNyZWF0ZV9uZXdfdGVpKG1nciwgdGVpKTsKKy0JaWYgKCFsMikKKysJaWYgKCFsMikgeworKwkJcHJpbnRrKEtFUk5fREVCVUcgImNyZWF0ZV9uZXdfdGVpID09IE5VTExcbiIpOworIAkJZ290byBkZW5pZWQ7CisrCX0KKyAJZWxzZQorIAkJbUlTRE5fRnNtRXZlbnQoJmwyLT50bS0+dGVpX20sIEVWX0FTU0lHTl9SRVEsIGRwKTsKKyAJcmV0dXJuOworQEAgLTExNTksMTIgKzExNzAsMTQgQEAKKyAJCXJldHVybiAtRU5PVENPTk47CisgCWlmIChza2ItPmxlbiAhPSAzKQorIAkJcmV0dXJuIC1FTk9UQ09OTjsKKysjaWYgMAorIAlpZiAoc2tiLT5kYXRhWzBdICE9IDApCisgCQkvKiBvbmx5IFNBUEkgMCBjb21tYW5kICovCisgCQlyZXR1cm4gLUVOT1RDT05OOworKyNlbmRpZgorIAlpZiAoIShza2ItPmRhdGFbMV0gJiAxKSkgLyogaW52YWxpZCBFQTEgKi8KKyAJCXJldHVybiAtRUlOVkFMOworLQl0ZWkgPSBza2ItPmRhdGFbMV0gPj4gMDsKKysJdGVpID0gc2tiLT5kYXRhWzFdID4+IDE7CisgCWlmICh0ZWkgPiA2MykgLyogbm90IGEgZml4ZWQgdGVpICovCisgCQlyZXR1cm4gLUVOT1RDT05OOworIAlpZiAoKHNrYi0+ZGF0YVsyXSAmIH4weDEwKSAhPSBTQUJNRSkKZGlmZiAtLWdpdCBhL2xpbnV4LWtlcm5lbC9saW51eC0yLjYuMzAtaGZjbXVsdGktbXVsdGlidHMucGF0Y2ggYi9saW51eC1rZXJuZWwvbGludXgtMi42LjMwLWhmY211bHRpLW11bHRpYnRzLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiOTRkMzQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC1rZXJuZWwvbGludXgtMi42LjMwLWhmY211bHRpLW11bHRpYnRzLnBhdGNoCkBAIC0wLDAgKzEsNDg2IEBACitUaGlzIGV4cGVyaW1lbnRhbCBwYXRjaCBzcGxpdHMgb25lIEUxIGNhcmQgaW50byB0aHJlZSB2aXJ0dWFsIGNhcmRzLAorCitUUyAxLDIsMyw0LDUgaXMgY2FyZCAwCitUUyA2LDcsOCw5LDEwIGlzIGNhcmQgMQorVFMgMTEsMTIsMTMsMTQgaXMgY2FyZCAyCisKK1RoaXMgYWxsb3dzIHlvdSB0byBydW4gb25lIEwyIFRFSSBoYW5kbGVyIG9uIGVhY2ggb2YgdGhlIHZpcnR1YWwgY2FyZHMsCit3aGljaCBpcyByZXF1aXJlZCBpZiB5b3Ugd2FudCB0byBydW4gbXVsdGlwbGUgQlRTIG9uIGEgc2luZ2xlIEUxIGxpbmsuCisKK1RoYW5rcyB0byBBbmRyZWFzIEV2ZXJzYmVyZyBmb3IgdGhpcyBwYXRjaC4KKworZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNfbXVsdGkuaCBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNfbXVsdGkuaAoraW5kZXggMGM3NzM4Ni4uMDJkZDRhMSAxMDA2NDQKKy0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNfbXVsdGkuaAorKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY19tdWx0aS5oCitAQCAtMjA5LDE0ICsyMDksMTcgQEAgc3RydWN0IGhmY19tdWx0aSB7CisgCXVfbG9uZwkJbGVkc3RhdGU7IC8qIHNhdmUgbGFzdCBzdGF0ZSBvZiBsZWRzICovCisgCWludAkJb3B0aWNhbHN1cHBvcnQ7IC8qIGhhcyB0aGUgZTEgYm9hcmQgKi8KKyAJCQkJCS8qIGFuIG9wdGljYWwgSW50ZXJmYWNlICovCistCWludAkJZHNsb3Q7CS8qIGNoYW5uZWwgIyBvZiBkLWNoYW5uZWwgKEUxKSBkZWZhdWx0IDE2ICovCisrCisrCXVfaW50CQlibWFza1szMl07IC8qIGJpdG1hc2sgb2YgYmNoYW5uZWxzIGZvciBwb3J0ICovCisrCXVfY2hhcgkJZG51bVszMl07IC8qIGFycmF5IG9mIHVzZWQgZGNoYW5uZWwgbnVtYmVycyBmb3IgcG9ydCAqLworKwl1X2NoYXIJCWNyZWF0ZWRbMzJdOyAvKiB3aGF0IHBvcnQgaXMgY3JlYXRlZCAqLworKwl1X2ludAkJYWN0aXZpdHlbMzJdOyAJLyogaWYgdGhlcmUgaXMgYW55IGFjdGlvbiBvbiB0aGlzICovCisrCQkJCQkvKiBwb3J0ICh3aWxsIGJlIGNsZWFyZWQgYWZ0ZXIgKi8KKysJCQkJCS8qIHNob3dpbmcgbGVkLXN0YXRlcykgKi8KKyAKKyAJdV9sb25nCQl3ZGNvdW50OyAJLyogZXZlcnkgNTAwIG1zIHdlIG5lZWQgdG8gKi8KKyAJCQkJCS8qIHNlbmQgdGhlIHdhdGNoZG9nIGEgc2lnbmFsICovCisgCXVfY2hhcgkJd2RieXRlOyAvKiB3YXRjaGRvZyB0b2dnbGUgYnl0ZSAqLworLQl1X2ludAkJYWN0aXZpdHlbOF07IAkvKiBpZiB0aGVyZSBpcyBhbnkgYWN0aW9uIG9uIHRoaXMgKi8KKy0JCQkJCS8qIHBvcnQgKHdpbGwgYmUgY2xlYXJlZCBhZnRlciAqLworLQkJCQkJLyogc2hvd2luZyBsZWQtc3RhdGVzKSAqLworIAlpbnQJCWUxX3N0YXRlOyAvKiBrZWVwIHRyYWNrIG9mIGxhc3Qgc3RhdGUgKi8KKyAJaW50CQllMV9nZXRjbG9jazsgLyogaWYgc3luYyBpcyByZXRyaWV2ZWQgZnJvbSBpbnRlcmZhY2UgKi8KKyAJaW50CQlzeW5jcm9uaXplZDsgLyoga2VlcCB0cmFjayBvZiBleGlzdGluZyBzeW5jIGludGVyZmFjZSAqLworQEAgLTIzMyw3ICsyMzYsNiBAQCBzdHJ1Y3QgaGZjX211bHRpIHsKKyAJICogdGhlIGJjaC0+Y2hhbm5lbCBpcyBlcXV2YWxlbnQgdG8gdGhlIGhmYy1jaGFubmVsCisgCSAqLworIAlzdHJ1Y3QgaGZjX2NoYW4JY2hhblszMl07CistCXVfY2hhcgkJY3JlYXRlZFs4XTsgLyogd2hhdCBwb3J0IGlzIGNyZWF0ZWQgKi8KKyAJc2lnbmVkIGNoYXIJc2xvdF9vd25lclsyNTZdOyAvKiBvd25lciBjaGFubmVsIG9mIHNsb3QgKi8KKyB9OworIAorZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNtdWx0aS5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY211bHRpLmMKK2luZGV4IGUxZGFiMzAuLjRmZTJkMjcgMTAwNjQ0CistLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjbXVsdGkuYworKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY211bHRpLmMKK0BAIC0xNjE5LDggKzE2MTksOCBAQCBoZmNtdWx0aV9sZWRzKHN0cnVjdCBoZmNfbXVsdGkgKmhjKQorIAkJICogbGVmdCByZWQ6ICAgICAgIGZyYW1lIHN5bmMsIGJ1dCBubyBMMQorIAkJICogcmlnaHQgZ3JlZW46ICAgIEwyIGFjdGl2ZQorIAkJICovCistCQlpZiAoaGMtPmNoYW5baGMtPmRzbG90XS5zeW5jICE9IDIpIHsgLyogbm8gZnJhbWUgc3luYyAqLworLQkJCWlmIChoYy0+Y2hhbltoYy0+ZHNsb3RdLmRjaC0+ZGV2LkQucHJvdG9jb2wKKysJCWlmIChoYy0+Y2hhbltoYy0+ZG51bVswXV0uc3luYyAhPSAyKSB7IC8qIG5vIGZyYW1lIHN5bmMgKi8KKysJCQlpZiAoaGMtPmNoYW5baGMtPmRudW1bMF1dLmRjaC0+ZGV2LkQucHJvdG9jb2wKKyAJCQkJIT0gSVNETl9QX05UX0UxKSB7CisgCQkJCWxlZFswXSA9IDE7CisgCQkJCWxlZFsxXSA9IDE7CitAQCAtMjQyOCw1NSArMjQyOCw1NiBAQCBoYW5kbGVfdGltZXJfaXJxKHN0cnVjdCBoZmNfbXVsdGkgKmhjKQorIAkJCX0KKyAJCX0KKyAJaWYgKGhjLT5jdHlwZSA9PSBIRkNfVFlQRV9FMSAmJiBoYy0+Y3JlYXRlZFswXSkgeworLQkJZGNoID0gaGMtPmNoYW5baGMtPmRzbG90XS5kY2g7CistCQlpZiAodGVzdF9iaXQoSEZDX0NGR19SRVBPUlRfTE9TLCAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpKSB7CisrI3dhcm5pbmcgdG9kbzogcHV0IGludGVyZmFjZSBwYXJhbWV0ZXJzIHRvIGhjCisrCQlkY2ggPSBoYy0+Y2hhbltoYy0+ZG51bVswXV0uZGNoOworKwkJaWYgKHRlc3RfYml0KEhGQ19DRkdfUkVQT1JUX0xPUywgJmhjLT5jaGFuW2hjLT5kbnVtWzBdXS5jZmcpKSB7CisgCQkJLyogTE9TICovCisgCQkJdGVtcCA9IEhGQ19pbmJfbm9kZWJ1ZyhoYywgUl9TWU5DX1NUQSkgJiBWX1NJR19MT1M7CistCQkJaWYgKCF0ZW1wICYmIGhjLT5jaGFuW2hjLT5kc2xvdF0ubG9zKQorKwkJCWlmICghdGVtcCAmJiBoYy0+Y2hhbltoYy0+ZG51bVswXV0ubG9zKQorIAkJCQlzaWduYWxfc3RhdGVfdXAoZGNoLCBMMV9TSUdOQUxfTE9TX09OLAorIAkJCQkgICAgIkxPUyBkZXRlY3RlZCIpOworLQkJCWlmICh0ZW1wICYmICFoYy0+Y2hhbltoYy0+ZHNsb3RdLmxvcykKKysJCQlpZiAodGVtcCAmJiAhaGMtPmNoYW5baGMtPmRudW1bMF1dLmxvcykKKyAJCQkJc2lnbmFsX3N0YXRlX3VwKGRjaCwgTDFfU0lHTkFMX0xPU19PRkYsCisgCQkJCSAgICAiTE9TIGdvbmUiKTsKKy0JCQloYy0+Y2hhbltoYy0+ZHNsb3RdLmxvcyA9IHRlbXA7CisrCQkJaGMtPmNoYW5baGMtPmRudW1bMF1dLmxvcyA9IHRlbXA7CisgCQl9CistCQlpZiAodGVzdF9iaXQoSEZDX0NGR19SRVBPUlRfQUlTLCAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpKSB7CisrCQlpZiAodGVzdF9iaXQoSEZDX0NGR19SRVBPUlRfQUlTLCAmaGMtPmNoYW5baGMtPmRudW1bMF1dLmNmZykpIHsKKyAJCQkvKiBBSVMgKi8KKyAJCQl0ZW1wID0gSEZDX2luYl9ub2RlYnVnKGhjLCBSX1NZTkNfU1RBKSAmIFZfQUlTOworLQkJCWlmICghdGVtcCAmJiBoYy0+Y2hhbltoYy0+ZHNsb3RdLmFpcykKKysJCQlpZiAoIXRlbXAgJiYgaGMtPmNoYW5baGMtPmRudW1bMF1dLmFpcykKKyAJCQkJc2lnbmFsX3N0YXRlX3VwKGRjaCwgTDFfU0lHTkFMX0FJU19PTiwKKyAJCQkJICAgICJBSVMgZGV0ZWN0ZWQiKTsKKy0JCQlpZiAodGVtcCAmJiAhaGMtPmNoYW5baGMtPmRzbG90XS5haXMpCisrCQkJaWYgKHRlbXAgJiYgIWhjLT5jaGFuW2hjLT5kbnVtWzBdXS5haXMpCisgCQkJCXNpZ25hbF9zdGF0ZV91cChkY2gsIEwxX1NJR05BTF9BSVNfT0ZGLAorIAkJCQkgICAgIkFJUyBnb25lIik7CistCQkJaGMtPmNoYW5baGMtPmRzbG90XS5haXMgPSB0ZW1wOworKwkJCWhjLT5jaGFuW2hjLT5kbnVtWzBdXS5haXMgPSB0ZW1wOworIAkJfQorLQkJaWYgKHRlc3RfYml0KEhGQ19DRkdfUkVQT1JUX1NMSVAsICZoYy0+Y2hhbltoYy0+ZHNsb3RdLmNmZykpIHsKKysJCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX1JFUE9SVF9TTElQLCAmaGMtPmNoYW5baGMtPmRudW1bMF1dLmNmZykpIHsKKyAJCQkvKiBTTElQICovCisgCQkJdGVtcCA9IEhGQ19pbmJfbm9kZWJ1ZyhoYywgUl9TTElQKSAmIFZfRk9TTElQX1JYOworLQkJCWlmICghdGVtcCAmJiBoYy0+Y2hhbltoYy0+ZHNsb3RdLnNsaXBfcngpCisrCQkJaWYgKCF0ZW1wICYmIGhjLT5jaGFuW2hjLT5kbnVtWzBdXS5zbGlwX3J4KQorIAkJCQlzaWduYWxfc3RhdGVfdXAoZGNoLCBMMV9TSUdOQUxfU0xJUF9SWCwKKyAJCQkJICAgICIgYml0IFNMSVAgZGV0ZWN0ZWQgUlgiKTsKKy0JCQloYy0+Y2hhbltoYy0+ZHNsb3RdLnNsaXBfcnggPSB0ZW1wOworKwkJCWhjLT5jaGFuW2hjLT5kbnVtWzBdXS5zbGlwX3J4ID0gdGVtcDsKKyAJCQl0ZW1wID0gSEZDX2luYl9ub2RlYnVnKGhjLCBSX1NMSVApICYgVl9GT1NMSVBfVFg7CistCQkJaWYgKCF0ZW1wICYmIGhjLT5jaGFuW2hjLT5kc2xvdF0uc2xpcF90eCkKKysJCQlpZiAoIXRlbXAgJiYgaGMtPmNoYW5baGMtPmRudW1bMF1dLnNsaXBfdHgpCisgCQkJCXNpZ25hbF9zdGF0ZV91cChkY2gsIEwxX1NJR05BTF9TTElQX1RYLAorIAkJCQkgICAgIiBiaXQgU0xJUCBkZXRlY3RlZCBUWCIpOworLQkJCWhjLT5jaGFuW2hjLT5kc2xvdF0uc2xpcF90eCA9IHRlbXA7CisrCQkJaGMtPmNoYW5baGMtPmRudW1bMF1dLnNsaXBfdHggPSB0ZW1wOworIAkJfQorLQkJaWYgKHRlc3RfYml0KEhGQ19DRkdfUkVQT1JUX1JESSwgJmhjLT5jaGFuW2hjLT5kc2xvdF0uY2ZnKSkgeworKwkJaWYgKHRlc3RfYml0KEhGQ19DRkdfUkVQT1JUX1JESSwgJmhjLT5jaGFuW2hjLT5kbnVtWzBdXS5jZmcpKSB7CisgCQkJLyogUkRJICovCisgCQkJdGVtcCA9IEhGQ19pbmJfbm9kZWJ1ZyhoYywgUl9SWF9TTDBfMCkgJiBWX0E7CistCQkJaWYgKCF0ZW1wICYmIGhjLT5jaGFuW2hjLT5kc2xvdF0ucmRpKQorKwkJCWlmICghdGVtcCAmJiBoYy0+Y2hhbltoYy0+ZG51bVswXV0ucmRpKQorIAkJCQlzaWduYWxfc3RhdGVfdXAoZGNoLCBMMV9TSUdOQUxfUkRJX09OLAorIAkJCQkgICAgIlJESSBkZXRlY3RlZCIpOworLQkJCWlmICh0ZW1wICYmICFoYy0+Y2hhbltoYy0+ZHNsb3RdLnJkaSkKKysJCQlpZiAodGVtcCAmJiAhaGMtPmNoYW5baGMtPmRudW1bMF1dLnJkaSkKKyAJCQkJc2lnbmFsX3N0YXRlX3VwKGRjaCwgTDFfU0lHTkFMX1JESV9PRkYsCisgCQkJCSAgICAiUkRJIGdvbmUiKTsKKy0JCQloYy0+Y2hhbltoYy0+ZHNsb3RdLnJkaSA9IHRlbXA7CisrCQkJaGMtPmNoYW5baGMtPmRudW1bMF1dLnJkaSA9IHRlbXA7CisgCQl9CisgCQl0ZW1wID0gSEZDX2luYl9ub2RlYnVnKGhjLCBSX0pBVFRfRElSKTsKKy0JCXN3aXRjaCAoaGMtPmNoYW5baGMtPmRzbG90XS5zeW5jKSB7CisrCQlzd2l0Y2ggKGhjLT5jaGFuW2hjLT5kbnVtWzBdXS5zeW5jKSB7CisgCQljYXNlIDA6CisgCQkJaWYgKCh0ZW1wICYgMHg2MCkgPT0gMHg2MCkgeworIAkJCQlpZiAoZGVidWcgJiBERUJVR19IRkNNVUxUSV9TWU5DKQorQEAgLTI0ODUsMTAgKzI0ODYsMTAgQEAgaGFuZGxlX3RpbWVyX2lycShzdHJ1Y3QgaGZjX211bHRpICpoYykKKyAJCQkJCSAgICAiaW4gY2xvY2sgc3luY1xuIiwKKyAJCQkJCSAgICBfX2Z1bmNfXywgaGMtPmlkKTsKKyAJCQkJSEZDX291dGIoaGMsIFJfUlhfT0ZGLAorLQkJCQkgICAgaGMtPmNoYW5baGMtPmRzbG90XS5qaXR0ZXIgfCBWX1JYX0lOSVQpOworKwkJCQkgICAgaGMtPmNoYW5baGMtPmRudW1bMF1dLmppdHRlciB8IFZfUlhfSU5JVCk7CisgCQkJCUhGQ19vdXRiKGhjLCBSX1RYX09GRiwKKy0JCQkJICAgIGhjLT5jaGFuW2hjLT5kc2xvdF0uaml0dGVyIHwgVl9SWF9JTklUKTsKKy0JCQkJaGMtPmNoYW5baGMtPmRzbG90XS5zeW5jID0gMTsKKysJCQkJICAgIGhjLT5jaGFuW2hjLT5kbnVtWzBdXS5qaXR0ZXIgfCBWX1JYX0lOSVQpOworKwkJCQloYy0+Y2hhbltoYy0+ZG51bVswXV0uc3luYyA9IDE7CisgCQkJCWdvdG8gY2hlY2tfZnJhbWVzeW5jOworIAkJCX0KKyAJCQlicmVhazsKK0BAIC0yNDk5LDcgKzI1MDAsNyBAQCBoYW5kbGVfdGltZXJfaXJxKHN0cnVjdCBoZmNfbXVsdGkgKmhjKQorIAkJCQkJICAgICIlczogKGlkPSVkKSBFMSAiCisgCQkJCQkgICAgImxvc3QgY2xvY2sgc3luY1xuIiwKKyAJCQkJCSAgICBfX2Z1bmNfXywgaGMtPmlkKTsKKy0JCQkJaGMtPmNoYW5baGMtPmRzbG90XS5zeW5jID0gMDsKKysJCQkJaGMtPmNoYW5baGMtPmRudW1bMF1dLnN5bmMgPSAwOworIAkJCQlicmVhazsKKyAJCQl9CisgY2hlY2tfZnJhbWVzeW5jOgorQEAgLTI1MTAsNyArMjUxMSw3IEBAIGNoZWNrX2ZyYW1lc3luYzoKKyAJCQkJCSAgICAiJXM6IChpZD0lZCkgRTEgIgorIAkJCQkJICAgICJub3cgaW4gZnJhbWUgc3luY1xuIiwKKyAJCQkJCSAgICBfX2Z1bmNfXywgaGMtPmlkKTsKKy0JCQkJaGMtPmNoYW5baGMtPmRzbG90XS5zeW5jID0gMjsKKysJCQkJaGMtPmNoYW5baGMtPmRudW1bMF1dLnN5bmMgPSAyOworIAkJCX0KKyAJCQlicmVhazsKKyAJCWNhc2UgMjoKK0BAIC0yNTIwLDcgKzI1MjEsNyBAQCBjaGVja19mcmFtZXN5bmM6CisgCQkJCQkgICAgIiVzOiAoaWQ9JWQpIEUxIGxvc3QgIgorIAkJCQkJICAgICJjbG9jayAmIGZyYW1lIHN5bmNcbiIsCisgCQkJCQkgICAgX19mdW5jX18sIGhjLT5pZCk7CistCQkJCWhjLT5jaGFuW2hjLT5kc2xvdF0uc3luYyA9IDA7CisrCQkJCWhjLT5jaGFuW2hjLT5kbnVtWzBdXS5zeW5jID0gMDsKKyAJCQkJYnJlYWs7CisgCQkJfQorIAkJCXRlbXAgPSBIRkNfaW5iX25vZGVidWcoaGMsIFJfU1lOQ19TVEEpOworQEAgLTI1MzAsNyArMjUzMSw3IEBAIGNoZWNrX2ZyYW1lc3luYzoKKyAJCQkJCSAgICAiJXM6IChpZD0lZCkgRTEgIgorIAkJCQkJICAgICJsb3N0IGZyYW1lIHN5bmNcbiIsCisgCQkJCQkgICAgX19mdW5jX18sIGhjLT5pZCk7CistCQkJCWhjLT5jaGFuW2hjLT5kc2xvdF0uc3luYyA9IDE7CisrCQkJCWhjLT5jaGFuW2hjLT5kbnVtWzBdXS5zeW5jID0gMTsKKyAJCQl9CisgCQkJYnJlYWs7CisgCQl9CitAQCAtMjc0Niw3ICsyNzQ3LDggQEAgaGZjbXVsdGlfaW50ZXJydXB0KGludCBpbnRubywgdm9pZCAqZGV2X2lkKQorIAkJaWYgKHJfaXJxX21pc2MgJiBWX1NUQV9JUlEpIHsKKyAJCQlpZiAoaGMtPmN0eXBlID09IEhGQ19UWVBFX0UxKSB7CisgCQkJCS8qIHN0YXRlIG1hY2hpbmUgKi8KKy0JCQkJZGNoID0gaGMtPmNoYW5baGMtPmRzbG90XS5kY2g7CisrI3dhcm5pbmcgdG9kbworKwkJCQlkY2ggPSBoYy0+Y2hhbltoYy0+ZG51bVswXV0uZGNoOworIAkJCQllMV9zeW5jc3RhID0gSEZDX2luYl9ub2RlYnVnKGhjLCBSX1NZTkNfU1RBKTsKKyAJCQkJaWYgKHRlc3RfYml0KEhGQ19DSElQX1BMWFNELCAmaGMtPmNoaXApCisgCQkJCSAmJiBoYy0+ZTFfZ2V0Y2xvY2spIHsKK0BAIC0yNzY4LDcgKzI3NzAsMTUgQEAgaGZjbXVsdGlfaW50ZXJydXB0KGludCBpbnRubywgdm9pZCAqZGV2X2lkKQorIAkJCQl9CisgCQkJCWRjaC0+c3RhdGUgPSBIRkNfaW5iX25vZGVidWcoaGMsIFJfRTFfUkRfU1RBKQorIAkJCQkJJiAweDc7CisrI3dhcm5pbmcgdG9kbyBoYWNrISEhIGJyb2FkY2FzdCBzdGF0ZSBjaGFuZ2UhISEKKysJCQkJZGNoID0gaGMtPmNoYW5baGMtPmRudW1bMF1dLmRjaDsKKyAJCQkJc2NoZWR1bGVfZXZlbnQoZGNoLCBGTEdfUEhDSEFOR0UpOworKwkJCQlkY2ggPSBoYy0+Y2hhbltoYy0+ZG51bVsxXV0uZGNoOworKwkJCQlkY2gtPnN0YXRlID0gSEZDX2luYl9ub2RlYnVnKGhjLCBSX0UxX1JEX1NUQSkKKysJCQkJCSYgMHg3OworKwkJCQlzY2hlZHVsZV9ldmVudChkY2gsIEZMR19QSENIQU5HRSk7CisrCisrCisgCQkJCWlmIChkZWJ1ZyAmIERFQlVHX0hGQ01VTFRJX1NUQVRFKQorIAkJCQkJcHJpbnRrKEtFUk5fREVCVUcKKyAJCQkJCSAgICAiJXM6IEUxIChpZD0lZCkgbmV3c3RhdGUgJXhcbiIsCitAQCAtMzg1MSwzMSArMzg2MSwzNSBAQCBoZmNtdWx0aV9pbml0bW9kZShzdHJ1Y3QgZGNoYW5uZWwgKmRjaCkKKyAJaWYgKGRlYnVnICYgREVCVUdfSEZDTVVMVElfSU5JVCkKKyAJCXByaW50ayhLRVJOX0RFQlVHICIlczogZW50ZXJlZFxuIiwgX19mdW5jX18pOworIAorKwlpID0gZGNoLT5zbG90OworKwlwdCA9IGhjLT5jaGFuW2ldLnBvcnQ7CisgCWlmIChoYy0+Y3R5cGUgPT0gSEZDX1RZUEVfRTEpIHsKKy0JCWhjLT5jaGFuW2hjLT5kc2xvdF0uc2xvdF90eCA9IC0xOworLQkJaGMtPmNoYW5baGMtPmRzbG90XS5zbG90X3J4ID0gLTE7CistCQloYy0+Y2hhbltoYy0+ZHNsb3RdLmNvbmYgPSAtMTsKKy0JCWlmIChoYy0+ZHNsb3QpIHsKKy0JCQltb2RlX2hmY211bHRpKGhjLCBoYy0+ZHNsb3QsIGRjaC0+ZGV2LkQucHJvdG9jb2wsCisrCQkvKiBFMSAqLworKyN3YXJuaW5nIHRvZG86IGRvbicndCBkbyBpdCBpZiBkbnVtID09IDAKKysJCWhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uc2xvdF90eCA9IC0xOworKwkJaGMtPmNoYW5baGMtPmRudW1bcHRdXS5zbG90X3J4ID0gLTE7CisrCQloYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmNvbmYgPSAtMTsKKysJCWlmIChoYy0+ZG51bVtwdF0pIHsKKysJCQltb2RlX2hmY211bHRpKGhjLCBkY2gtPnNsb3QsIGRjaC0+ZGV2LkQucHJvdG9jb2wsCisgCQkJCS0xLCAwLCAtMSwgMCk7CisgCQkJZGNoLT50aW1lci5mdW5jdGlvbiA9ICh2b2lkICopIGhmY211bHRpX2RidXN5X3RpbWVyOworIAkJCWRjaC0+dGltZXIuZGF0YSA9IChsb25nKSBkY2g7CisgCQkJaW5pdF90aW1lcigmZGNoLT50aW1lcik7CisgCQl9CisgCQlmb3IgKGkgPSAxOyBpIDw9IDMxOyBpKyspIHsKKy0JCQlpZiAoaSA9PSBoYy0+ZHNsb3QpCisrCQkJaWYgKCEoKDEgPDwgaSkgJiBoYy0+Ym1hc2tbcHRdKSkgLyogc2tpcCB1bnVzZWQgY2hhbm5lbCAqLworIAkJCQljb250aW51ZTsKKyAJCQloYy0+Y2hhbltpXS5zbG90X3R4ID0gLTE7CisgCQkJaGMtPmNoYW5baV0uc2xvdF9yeCA9IC0xOworIAkJCWhjLT5jaGFuW2ldLmNvbmYgPSAtMTsKKyAJCQltb2RlX2hmY211bHRpKGhjLCBpLCBJU0ROX1BfTk9ORSwgLTEsIDAsIC0xLCAwKTsKKyAJCX0KKy0JCS8qIEUxICovCistCQlpZiAodGVzdF9iaXQoSEZDX0NGR19SRVBPUlRfTE9TLCAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpKSB7CisrI3dhcm5pbmcgdG9kbyAoZ2xvYmFsKQorKwkJaWYgKHRlc3RfYml0KEhGQ19DRkdfUkVQT1JUX0xPUywgJmhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uY2ZnKSkgeworIAkJCUhGQ19vdXRiKGhjLCBSX0xPUzAsIDI1NSk7IC8qIDIgbXMgKi8KKyAJCQlIRkNfb3V0YihoYywgUl9MT1MxLCAyNTUpOyAvKiA1MTIgbXMgKi8KKyAJCX0KKy0JCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX09QVElDQUwsICZoYy0+Y2hhbltoYy0+ZHNsb3RdLmNmZykpIHsKKysJCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX09QVElDQUwsICZoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmNmZykpIHsKKyAJCQlIRkNfb3V0YihoYywgUl9SWDAsIDApOworIAkJCWhjLT5ody5yX3R4MCA9IDAgfCBWX09VVF9FTjsKKyAJCX0gZWxzZSB7CitAQCAtMzg4OCwxMiArMzkwMiwxMiBAQCBoZmNtdWx0aV9pbml0bW9kZShzdHJ1Y3QgZGNoYW5uZWwgKmRjaCkKKyAJCUhGQ19vdXRiKGhjLCBSX1RYX0ZSMCwgMHgwMCk7CisgCQlIRkNfb3V0YihoYywgUl9UWF9GUjEsIDB4ZjgpOworIAorLQkJaWYgKHRlc3RfYml0KEhGQ19DRkdfQ1JDNCwgJmhjLT5jaGFuW2hjLT5kc2xvdF0uY2ZnKSkKKysJCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX0NSQzQsICZoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmNmZykpCisgCQkJSEZDX291dGIoaGMsIFJfVFhfRlIyLCBWX1RYX01GIHwgVl9UWF9FIHwgVl9ORUdfRSk7CisgCisgCQlIRkNfb3V0YihoYywgUl9SWF9GUjAsIFZfQVVUT19SRVNZTkMgfCBWX0FVVE9fUkVDTyB8IDApOworIAorLQkJaWYgKHRlc3RfYml0KEhGQ19DRkdfQ1JDNCwgJmhjLT5jaGFuW2hjLT5kc2xvdF0uY2ZnKSkKKysJCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX0NSQzQsICZoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmNmZykpCisgCQkJSEZDX291dGIoaGMsIFJfUlhfRlIxLCBWX1JYX01GIHwgVl9SWF9NRl9TWU5DKTsKKyAKKyAJCWlmIChkY2gtPmRldi5ELnByb3RvY29sID09IElTRE5fUF9OVF9FMSkgeworQEAgLTM5NTcsNyArMzk3MSw3IEBAIGhmY211bHRpX2luaXRtb2RlKHN0cnVjdCBkY2hhbm5lbCAqZGNoKQorIAkJCXBseHNkX2NoZWNrc3luYyhoYywgMCk7CisgCQl9CisgCX0gZWxzZSB7CistCQlpID0gZGNoLT5zbG90OworKwkJLyogU1QgKi8KKyAJCWhjLT5jaGFuW2ldLnNsb3RfdHggPSAtMTsKKyAJCWhjLT5jaGFuW2ldLnNsb3RfcnggPSAtMTsKKyAJCWhjLT5jaGFuW2ldLmNvbmYgPSAtMTsKK0BAIC0zOTczLDggKzM5ODcsNiBAQCBoZmNtdWx0aV9pbml0bW9kZShzdHJ1Y3QgZGNoYW5uZWwgKmRjaCkKKyAJCWhjLT5jaGFuW2kgLSAxXS5zbG90X3J4ID0gLTE7CisgCQloYy0+Y2hhbltpIC0gMV0uY29uZiA9IC0xOworIAkJbW9kZV9oZmNtdWx0aShoYywgaSAtIDEsIElTRE5fUF9OT05FLCAtMSwgMCwgLTEsIDApOworLQkJLyogU1QgKi8KKy0JCXB0ID0gaGMtPmNoYW5baV0ucG9ydDsKKyAJCS8qIHNlbGVjdCBpbnRlcmZhY2UgKi8KKyAJCUhGQ19vdXRiKGhjLCBSX1NUX1NFTCwgcHQpOworIAkJLyogdW5kb2N1bWVudGVkOiBkZWxheSBhZnRlciBSX1NUX1NFTCAqLworQEAgLTQ1NTcsNiArNDU2OSw4IEBAIHJlbGVhc2VfcG9ydChzdHJ1Y3QgaGZjX211bHRpICpoYywgc3RydWN0IGRjaGFubmVsICpkY2gpCisgCQl9CisgCQkvKiBmcmVlIGNoYW5uZWxzICovCisgCQlmb3IgKGkgPSAwOyBpIDw9IDMxOyBpKyspIHsKKysJCQlpZiAoISgoMSA8PCBpKSAmIGhjLT5ibWFza1twdF0pKSAvKiBza2lwIHVudXNlZCBjaGFubmVsICovCisrCQkJCWNvbnRpbnVlOworIAkJCWlmIChoYy0+Y2hhbltpXS5iY2gpIHsKKyAJCQkJaWYgKGRlYnVnICYgREVCVUdfSEZDTVVMVElfSU5JVCkKKyAJCQkJCXByaW50ayhLRVJOX0RFQlVHCitAQCAtNDY4MCwxMiArNDY5NCwxMyBAQCByZWxlYXNlX2NhcmQoc3RydWN0IGhmY19tdWx0aSAqaGMpCisgfQorIAorIHN0YXRpYyBpbnQKKy1pbml0X2UxX3BvcnQoc3RydWN0IGhmY19tdWx0aSAqaGMsIHN0cnVjdCBobV9tYXAgKm0pCisraW5pdF9lMV9wb3J0KHN0cnVjdCBoZmNfbXVsdGkgKmhjLCBzdHJ1Y3QgaG1fbWFwICptLCBpbnQgcHQpCisgeworIAlzdHJ1Y3QgZGNoYW5uZWwJKmRjaDsKKyAJc3RydWN0IGJjaGFubmVsCSpiY2g7CisgCWludAkJY2gsIHJldCA9IDA7CisgCWNoYXIJCW5hbWVbTUlTRE5fTUFYX0lETEVOXTsKKysJaW50CQliY291bnQgPSAwOworIAorIAlkY2ggPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGNoYW5uZWwpLCBHRlBfS0VSTkVMKTsKKyAJaWYgKCFkY2gpCitAQCAtNDY5OCwxMyArNDcxMywxMiBAQCBpbml0X2UxX3BvcnQoc3RydWN0IGhmY19tdWx0aSAqaGMsIHN0cnVjdCBobV9tYXAgKm0pCisgCSAgICAoMSA8PCAoSVNETl9QX0JfSERMQyAmIElTRE5fUF9CX01BU0spKTsKKyAJZGNoLT5kZXYuRC5zZW5kID0gaGFuZGxlX2Rtc2c7CisgCWRjaC0+ZGV2LkQuY3RybCA9IGhmY21fZGN0cmw7CistCWRjaC0+ZGV2Lm5yYmNoYW4gPSAoaGMtPmRzbG90KSA/IDMwIDogMzE7CistCWRjaC0+c2xvdCA9IGhjLT5kc2xvdDsKKy0JaGMtPmNoYW5baGMtPmRzbG90XS5kY2ggPSBkY2g7CistCWhjLT5jaGFuW2hjLT5kc2xvdF0ucG9ydCA9IDA7CistCWhjLT5jaGFuW2hjLT5kc2xvdF0ubnRfdGltZXIgPSAtMTsKKysJZGNoLT5zbG90ID0gaGMtPmRudW1bcHRdOworKwloYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmRjaCA9IGRjaDsKKysJaGMtPmNoYW5baGMtPmRudW1bcHRdXS5wb3J0ID0gcHQ7CisrCWhjLT5jaGFuW2hjLT5kbnVtW3B0XV0ubnRfdGltZXIgPSAtMTsKKyAJZm9yIChjaCA9IDE7IGNoIDw9IDMxOyBjaCsrKSB7CistCQlpZiAoY2ggPT0gaGMtPmRzbG90KSAvKiBza2lwIGRjaGFubmVsICovCisrCQlpZiAoISgoMSA8PCBjaCkgJiBoYy0+Ym1hc2tbcHRdKSkgLyogc2tpcCB1bnVzZWQgY2hhbm5lbCAqLworIAkJCWNvbnRpbnVlOworIAkJYmNoID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJjaGFubmVsKSwgR0ZQX0tFUk5FTCk7CisgCQlpZiAoIWJjaCkgeworQEAgLTQ3MzMsNyArNDc0NywxMCBAQCBpbml0X2UxX3BvcnQoc3RydWN0IGhmY19tdWx0aSAqaGMsIHN0cnVjdCBobV9tYXAgKm0pCisgCQloYy0+Y2hhbltjaF0uYmNoID0gYmNoOworIAkJaGMtPmNoYW5bY2hdLnBvcnQgPSAwOworIAkJc2V0X2NoYW5uZWxtYXAoYmNoLT5uciwgZGNoLT5kZXYuY2hhbm5lbG1hcCk7CisrCQliY291bnQrKzsKKyAJfQorKwlkY2gtPmRldi5ucmJjaGFuID0gYmNvdW50OworKyN3YXJuaW5nIHRvZG86IG11c3QgYmUgc2V0IGdsb2JhbGx5LCBhbmQgbXVzdCBiZSBhIHNlcGVyYXRlIGZ1bmN0aW9uCisgCS8qIHNldCBvcHRpY2FsIGxpbmUgdHlwZSAqLworIAlpZiAocG9ydFtQb3J0X2NudF0gJiAweDAwMSkgeworIAkJaWYgKCFtLT5vcHRpY2Fsc3VwcG9ydCkgIHsKK0BAIC00NzQ5LDcgKzQ3NjYsNyBAQCBpbml0X2UxX3BvcnQoc3RydWN0IGhmY19tdWx0aSAqaGMsIHN0cnVjdCBobV9tYXAgKm0pCisgCQkJCSAgICBfX2Z1bmNfXywKKyAJCQkJICAgIEhGQ19jbnQgKyAxLCAxKTsKKyAJCQl0ZXN0X2FuZF9zZXRfYml0KEhGQ19DRkdfT1BUSUNBTCwKKy0JCQkgICAgJmhjLT5jaGFuW2hjLT5kc2xvdF0uY2ZnKTsKKysJCQkgICAgJmhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uY2ZnKTsKKyAJCX0KKyAJfQorIAkvKiBzZXQgTE9TIHJlcG9ydCAqLworQEAgLTQ3NTksNyArNDc3Niw3IEBAIGluaXRfZTFfcG9ydChzdHJ1Y3QgaGZjX211bHRpICpoYywgc3RydWN0IGhtX21hcCAqbSkKKyAJCQkgICAgIkxPUyByZXBvcnQ6IGNhcmQoJWQpIHBvcnQoJWQpXG4iLAorIAkJCSAgICBfX2Z1bmNfXywgSEZDX2NudCArIDEsIDEpOworIAkJdGVzdF9hbmRfc2V0X2JpdChIRkNfQ0ZHX1JFUE9SVF9MT1MsCistCQkgICAgJmhjLT5jaGFuW2hjLT5kc2xvdF0uY2ZnKTsKKysJCSAgICAmaGMtPmNoYW5baGMtPmRudW1bcHRdXS5jZmcpOworIAl9CisgCS8qIHNldCBBSVMgcmVwb3J0ICovCisgCWlmIChwb3J0W1BvcnRfY250XSAmIDB4MDA4KSB7CitAQCAtNDc2OCw3ICs0Nzg1LDcgQEAgaW5pdF9lMV9wb3J0KHN0cnVjdCBoZmNfbXVsdGkgKmhjLCBzdHJ1Y3QgaG1fbWFwICptKQorIAkJCSAgICAiQUlTIHJlcG9ydDogY2FyZCglZCkgcG9ydCglZClcbiIsCisgCQkJICAgIF9fZnVuY19fLCBIRkNfY250ICsgMSwgMSk7CisgCQl0ZXN0X2FuZF9zZXRfYml0KEhGQ19DRkdfUkVQT1JUX0FJUywKKy0JCSAgICAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpOworKwkJICAgICZoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmNmZyk7CisgCX0KKyAJLyogc2V0IFNMSVAgcmVwb3J0ICovCisgCWlmIChwb3J0W1BvcnRfY250XSAmIDB4MDEwKSB7CitAQCAtNDc3OCw3ICs0Nzk1LDcgQEAgaW5pdF9lMV9wb3J0KHN0cnVjdCBoZmNfbXVsdGkgKmhjLCBzdHJ1Y3QgaG1fbWFwICptKQorIAkJCSAgICAiY2FyZCglZCkgcG9ydCglZClcbiIsCisgCQkJICAgIF9fZnVuY19fLCBIRkNfY250ICsgMSwgMSk7CisgCQl0ZXN0X2FuZF9zZXRfYml0KEhGQ19DRkdfUkVQT1JUX1NMSVAsCistCQkgICAgJmhjLT5jaGFuW2hjLT5kc2xvdF0uY2ZnKTsKKysJCSAgICAmaGMtPmNoYW5baGMtPmRudW1bcHRdXS5jZmcpOworIAl9CisgCS8qIHNldCBSREkgcmVwb3J0ICovCisgCWlmIChwb3J0W1BvcnRfY250XSAmIDB4MDIwKSB7CitAQCAtNDc4OCw3ICs0ODA1LDcgQEAgaW5pdF9lMV9wb3J0KHN0cnVjdCBoZmNfbXVsdGkgKmhjLCBzdHJ1Y3QgaG1fbWFwICptKQorIAkJCSAgICAiY2FyZCglZCkgcG9ydCglZClcbiIsCisgCQkJICAgIF9fZnVuY19fLCBIRkNfY250ICsgMSwgMSk7CisgCQl0ZXN0X2FuZF9zZXRfYml0KEhGQ19DRkdfUkVQT1JUX1JESSwKKy0JCSAgICAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpOworKwkJICAgICZoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmNmZyk7CisgCX0KKyAJLyogc2V0IENSQy00IE1vZGUgKi8KKyAJaWYgKCEocG9ydFtQb3J0X2NudF0gJiAweDEwMCkpIHsKK0BAIC00Nzk3LDcgKzQ4MTQsNyBAQCBpbml0X2UxX3BvcnQoc3RydWN0IGhmY19tdWx0aSAqaGMsIHN0cnVjdCBobV9tYXAgKm0pCisgCQkJCSIgY2FyZCglZCkgcG9ydCglZClcbiIsCisgCQkJCV9fZnVuY19fLCBIRkNfY250ICsgMSwgMSk7CisgCQl0ZXN0X2FuZF9zZXRfYml0KEhGQ19DRkdfQ1JDNCwKKy0JCSAgICAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpOworKwkJICAgICZoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmNmZyk7CisgCX0gZWxzZSB7CisgCQlpZiAoZGVidWcgJiBERUJVR19IRkNNVUxUSV9JTklUKQorIAkJCXByaW50ayhLRVJOX0RFQlVHICIlczogUE9SVCB0dXJuIG9mZiBDUkM0IgorQEAgLTQ4MjksMjAgKzQ4NDYsMjMgQEAgaW5pdF9lMV9wb3J0KHN0cnVjdCBoZmNfbXVsdGkgKmhjLCBzdHJ1Y3QgaG1fbWFwICptKQorIAl9CisgCS8qIHNldCBlbGFzdGljIGppdHRlciBidWZmZXIgKi8KKyAJaWYgKHBvcnRbUG9ydF9jbnRdICYgMHgzMDAwKSB7CistCQloYy0+Y2hhbltoYy0+ZHNsb3RdLmppdHRlciA9IChwb3J0W1BvcnRfY250XT4+MTIpICYgMHgzOworKwkJaGMtPmNoYW5baGMtPmRudW1bcHRdXS5qaXR0ZXIgPSAocG9ydFtQb3J0X2NudF0+PjEyKSAmIDB4MzsKKyAJCWlmIChkZWJ1ZyAmIERFQlVHX0hGQ01VTFRJX0lOSVQpCisgCQkJcHJpbnRrKEtFUk5fREVCVUcKKyAJCQkgICAgIiVzOiBQT1JUIHNldCBlbGFzdGljICIKKyAJCQkgICAgImJ1ZmZlciB0byAlZDogY2FyZCglZCkgcG9ydCglZClcbiIsCistCQkJICAgIF9fZnVuY19fLCBoYy0+Y2hhbltoYy0+ZHNsb3RdLmppdHRlciwKKysJCQkgICAgX19mdW5jX18sIGhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uaml0dGVyLAorIAkJCSAgICBIRkNfY250ICsgMSwgMSk7CisgCX0gZWxzZQorLQkJaGMtPmNoYW5baGMtPmRzbG90XS5qaXR0ZXIgPSAyOyAvKiBkZWZhdWx0ICovCistCXNucHJpbnRmKG5hbWUsIE1JU0ROX01BWF9JRExFTiAtIDEsICJoZmMtZTEuJWQiLCBIRkNfY250ICsgMSk7CisrCQloYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmppdHRlciA9IDI7IC8qIGRlZmF1bHQgKi8KKysJaWYgKGhjLT5wb3J0cyA+IDEpCisrCQlzbnByaW50ZihuYW1lLCBNSVNETl9NQVhfSURMRU4gLSAxLCAiaGZjLWUxLiVkLSVkIiwgSEZDX2NudCArIDEsIHB0KzEpOworKwllbHNlCisrCQlzbnByaW50ZihuYW1lLCBNSVNETl9NQVhfSURMRU4gLSAxLCAiaGZjLWUxLiVkIiwgSEZDX2NudCArIDEpOworIAlyZXQgPSBtSVNETl9yZWdpc3Rlcl9kZXZpY2UoJmRjaC0+ZGV2LCAmaGMtPnBjaV9kZXYtPmRldiwgbmFtZSk7CisgCWlmIChyZXQpCisgCQlnb3RvIGZyZWVfY2hhbjsKKy0JaGMtPmNyZWF0ZWRbMF0gPSAxOworKwloYy0+Y3JlYXRlZFtwdF0gPSAxOworIAlyZXR1cm4gcmV0OworIGZyZWVfY2hhbjoKKyAJcmVsZWFzZV9wb3J0KGhjLCBkY2gpOworQEAgLTUwMDksMTggKzUwMjksMzAgQEAgaGZjbXVsdGlfaW5pdChzdHJ1Y3QgaG1fbWFwICptLCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKyAJaGMtPmlkID0gSEZDX2NudDsKKyAJaGMtPnBjbSA9IHBjbVtIRkNfY250XTsKKyAJaGMtPmlvX21vZGUgPSBpb21vZGVbSEZDX2NudF07CisrI3dhcm5pbmcgdG9kbzogcmV3b3JrIG1vZHVsZSBwYXJhbWV0ZXJzIGZvciBjdXN0b21pemluZyBlMSBmcmFnbWVudHMuLi4uIHllYSwgbGV0JydzIGNhbGwgaXQ6IGZyYWdtZW50cworIAlpZiAoZHNsb3RbSEZDX2NudF0gPCAwICYmIGhjLT5jdHlwZSA9PSBIRkNfVFlQRV9FMSkgeworLQkJaGMtPmRzbG90ID0gMDsKKysJCWhjLT5kbnVtWzBdID0gMDsKKyAJCXByaW50ayhLRVJOX0lORk8gIkhGQy1FMSBjYXJkIGhhcyBkaXNhYmxlZCBELWNoYW5uZWwsIGJ1dCAiCisgCQkJIjMxIEItY2hhbm5lbHNcbiIpOworIAl9CisgCWlmIChkc2xvdFtIRkNfY250XSA+IDAgJiYgZHNsb3RbSEZDX2NudF0gPCAzMgorIAkgICAgJiYgaGMtPmN0eXBlID09IEhGQ19UWVBFX0UxKSB7CistCQloYy0+ZHNsb3QgPSBkc2xvdFtIRkNfY250XTsKKysJCWhjLT5kbnVtWzBdID0gZHNsb3RbSEZDX2NudF07CisgCQlwcmludGsoS0VSTl9JTkZPICJIRkMtRTEgY2FyZCBoYXMgYWx0ZXJuYXRpbmcgRC1jaGFubmVsIG9uICIKKyAJCQkidGltZSBzbG90ICVkXG4iLCBkc2xvdFtIRkNfY250XSk7CisgCX0gZWxzZQorLQkJaGMtPmRzbG90ID0gMTY7CisrCQloYy0+ZG51bVswXSA9IDE2OworKworKyN3YXJuaW5nIHRvZG8gSEFDSyEhISBqdXN0IGEgc21hbGwgbWFwIG9mIHR3byAiZnJhZ21lbnRzIgorKwlpZiAoaGMtPmN0eXBlID09IEhGQ19UWVBFX0UxKSB7CisrCQloYy0+ZG51bVswXSA9IDE7CisrCQloYy0+Ym1hc2tbMF0gPSAweDAwMDAwMDNjOworKwkJaGMtPmRudW1bMV0gPSA2OworKwkJaGMtPmJtYXNrWzFdID0gMHgwMDAwMDc4MDsKKysJCWhjLT5kbnVtWzJdID0gMTE7CisrCQloYy0+Ym1hc2tbMl0gPSAweDAwMDA3ODAwOworKwkJaGMtPnBvcnRzID0gMzsKKysJfQorIAorIAkvKiBzZXQgY2hpcCBzcGVjaWZpYyBmZWF0dXJlcyAqLworIAloYy0+bWFzdGVyY2xrID0gLTE7CitAQCAtNTEwMyw3ICs1MTM1LDcgQEAgaGZjbXVsdGlfaW5pdChzdHJ1Y3QgaG1fbWFwICptLCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKyAJCQlnb3RvIGZyZWVfY2FyZDsKKyAJCX0KKyAJCWlmIChoYy0+Y3R5cGUgPT0gSEZDX1RZUEVfRTEpCistCQkJcmV0X2VyciA9IGluaXRfZTFfcG9ydChoYywgbSk7CisrCQkJcmV0X2VyciA9IGluaXRfZTFfcG9ydChoYywgbSwgcHQpOworIAkJZWxzZQorIAkJCXJldF9lcnIgPSBpbml0X211bHRpX3BvcnQoaGMsIHB0KTsKKyAJCWlmIChkZWJ1ZyAmIERFQlVHX0hGQ01VTFRJX0lOSVQpCitAQCAtNTExNSwxMCArNTE0NywxNCBAQCBoZmNtdWx0aV9pbml0KHN0cnVjdCBobV9tYXAgKm0sIHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorIAkJaWYgKHJldF9lcnIpIHsKKyAJCQl3aGlsZSAocHQpIHsgLyogcmVsZWFzZSBhbHJlYWR5IHJlZ2lzdGVyZWQgcG9ydHMgKi8KKyAJCQkJcHQtLTsKKy0JCQkJcmVsZWFzZV9wb3J0KGhjLCBoYy0+Y2hhblsocHQgPDwgMikgKyAyXS5kY2gpOworKwkJCQlpZiAoaGMtPmN0eXBlID09IEhGQ19UWVBFX0UxKQorKwkJCQkJcmVsZWFzZV9wb3J0KGhjLCBoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmRjaCk7CisrCQkJCWVsc2UKKysJCQkJCXJlbGVhc2VfcG9ydChoYywgaGMtPmNoYW5bKHB0IDw8IDIpICsgMl0uZGNoKTsKKyAJCQl9CisgCQkJZ290byBmcmVlX2NhcmQ7CisgCQl9CisrI3dhcm5pbmcgdG9kbzogY291bnQgaXQgcmlnaHQsIGFkZCBhZGRpdGlvbmFsICJmcmFnbWVudCIgY291bnRlci4uLgorIAkJUG9ydF9jbnQrKzsKKyAJfQorIApkaWZmIC0tZ2l0IGEvb3BlbmJzYy8uZ2l0aWdub3JlIGIvb3BlbmJzYy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NjgxMTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjLy5naXRpZ25vcmUKQEAgLTAsMCArMSw0OCBAQAorKi5vCisqLmEKKy5kZXBzCitNYWtlZmlsZQorTWFrZWZpbGUuaW4KK2JzY2NvbmZpZy5oCitic2Njb25maWcuaC5pbgorb3BlbmJzYy5wYworYnNjX2hhY2sKK2JzY19tc2NfaXAKK2JzY19tZ2NwCisqLip+CisqLnN3PworCisjY29uZmlndXJlCithY2xvY2FsLm00CithdXRvbTR0ZS5jYWNoZS8KK2NvbmZpZy5sb2cKK2NvbmZpZy5zdGF0dXMKK2NvbmZpZ3VyZQorZGVwY29tcAoraW5zdGFsbC1zaAorbWlzc2luZworc3RhbXAtaDEKKworIyBnaXQtdmVyc2lvbi1nZW4gbWFnaWMKKy50YXJiYWxsLXZlcnNpb24KKy52ZXJzaW9uCisKKworIyBhcHBzIGFuZCBhcHAgZGF0YQoraGxyLnNxbGl0ZTMKK2JzMTFfY29uZmlnCitpcGFjY2Vzcy1jb25maWcKK2lwYWNjZXNzLWZpbmQKK2lwYWNjZXNzLWZpcm13YXJlCitpcGFjY2Vzcy1wcm94eQoraXNkbnN5bmMKKworI3Rlc3RzCit0ZXN0cy9jaGFubmVsL2NoYW5uZWxfdGVzdAordGVzdHMvZGIvZGJfdGVzdAordGVzdHMvZGVidWcvZGVidWdfdGVzdAordGVzdHMvZ3NtMDQwOC9nc20wNDA4X3Rlc3QKK3Rlc3RzL3NjY3Avc2NjcF90ZXN0Cit0ZXN0cy9zbXMvc21zX3Rlc3QKK3Rlc3RzL3RpbWVyL3RpbWVyX3Rlc3QKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9BVVRIT1JTIGIvb3BlbmJzYy9BVVRIT1JTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZjYwZTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL0FVVEhPUlMKQEAgLTAsMCArMSw3IEBACitIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorSG9sZ2VyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KK0phbiBMdWViYmUgPGpsdWViYmVAZGViaWFuLm9yZz4KK1N0ZWZhbiBTY2htaWR0IDxzdGVmYW5AZGF0ZW5mcmVpaGFmZW4ub3JnPgorRGFuaWVsIFdpbGxtYW5uIDxkYW5pZWxAdG90YWx1ZWJlcndhY2h1bmcuZGU+CitBbmRyZWFzIEV2ZXJzYmVyZyA8QW5kcmVhcy5FdmVyc2JlcmdAdmVyc2F0ZWwuZGU+CitTeWx2YWluIE11bmF1dCA8MjQ2dG50QGdtYWlsLmNvbT4KZGlmZiAtLWdpdCBhL0NPUFlJTkcgYi9vcGVuYnNjL0NPUFlJTkcKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBDT1BZSU5HCmNvcHkgdG8gb3BlbmJzYy9DT1BZSU5HCmRpZmYgLS1naXQgYS9vcGVuYnNjL01ha2VmaWxlLmFtIGIvb3BlbmJzYy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2UxMWNlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDEzIEBACitBVVRPTUFLRV9PUFRJT05TID0gZm9yZWlnbiBkaXN0LWJ6aXAyIDEuNgorCitJTkNMVURFUyA9ICQoYWxsX2luY2x1ZGVzKSAtSSQodG9wX3NyY2RpcikvaW5jbHVkZQorU1VCRElSUyA9IGluY2x1ZGUgc3JjIHRlc3RzCisKK3BrZ2NvbmZpZ2RpciA9ICQobGliZGlyKS9wa2djb25maWcKK3BrZ2NvbmZpZ19EQVRBID0gb3BlbmJzYy5wYyBsaWJzY2NwLnBjCisKK0JVSUxUX1NPVVJDRVMgPSAkKHRvcF9zcmNkaXIpLy52ZXJzaW9uCiskKHRvcF9zcmNkaXIpLy52ZXJzaW9uOgorCWVjaG8gJChWRVJTSU9OKSA+ICRALXQgJiYgbXYgJEAtdCAkQAorZGlzdC1ob29rOgorCWVjaG8gJChWRVJTSU9OKSA+ICQoZGlzdGRpcikvLnRhcmJhbGwtdmVyc2lvbgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9SRUFETUUgYi9vcGVuYnNjL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAxZmY0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9SRUFETUUKQEAgLTAsMCArMSwzMiBAQAorQWJvdXQgT3BlbkJTQworPT09PT09PT09PT09PQorCitPcGVuQlNDIGlzIGEgbWluaW1hbGlzdGljIGltcGxlbWVudGF0aW9uIG9mIHRoZSBHU00gTmV0d29yaywgd2l0aAorcGFydGljdWxhciBlbXBoYXNpcyBvbiB0aGUgZnVuY3Rpb25hbGl0eSB0eXBpY2FsbHkgcHJvdmlkZWQgYnkgdGhlIEJTQywKK01TQywgSExSLCBWTFIgYW5kIFNNU0MuCisKK0l0cyBjdXJyZW50bHkgc3VwcG9ydGVkIGludGVyZmFjZXMgdG93YXJkcyB0aGUgQlRTIGFyZToKKworICogQ2xhc3NpYyBBLWJpcyBvdmVyIEUxIHVzaW5nIGEgbUlTRE4gYmFzZWQgRTEgaW50ZXJmYWNlLiBJbiBvdGhlcgorICAgd29yZHMsIHlvdSBjYW4gY29ubmVjdCBleGlzdGluZyBHU00gQmFzZSBUcmFuc2NlaXZlciBTdGF0aW9uIChCVFMpCisgICB0aHJvdWdoIEUxIHRvIE9wZW5CU0MuICBTbyBmYXIsIHdlIGhhdmUgb25seSB0ZXN0ZWQgdGhlIFNpZW1lbnMgQlMtMTEKKyAgIFRlc3QgcmVwb3J0cyB3aXRoIG90aGVyIEJUUyBhcmUgbXVjaCBhcHByZWNpYXRlZCEKKworICogQS1iaXMgb3ZlciBJUCBhcyB1c2VkIGJ5IHRoZSBpcC5hY2Nlc3MgbmFub0JUUyBwcm9kdWN0IGZhbWlseQorCitZb3UgY2FuIGZpbmQgdGhlIHByb2plY3QgZG9jdW1lbnRhdGlvbiBhdCBodHRwOi8vb3BlbmJzYy5nbnVtb25rcy5vcmcvCisKK1RoaXMgcHJvamVjdCBpcyBzdGlsbCBpbiBpdHMgZWFybHkgZGF5cywgYW5kIHRoZXJlIGFyZSBsb3RzIG9mIGFyZWFzIHdoZXJlIGl0Citkb2Vzbid0IGJlaGF2ZSBhcyBwZXIgR1NNIHNwZWMuCisKKwlIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorCisKK2xpYm9zbW9jb3JlCis9PT09PT09PT09PQorCitQbGVhc2Ugbm90ZSB0aGF0IGFzIG9mIE1hcmNoIDIwMTAsIE9wZW5CU0MgaGFzIGEgZGVwZW5kZW5jeSB0byBhIGxpYnJhcnkKK2NhbGxlZCAibGlib3Ntb2NvcmUiLiAgWW91IGNhbiBvYnRhaW4gdGhhdCBsaWJyYXJ5IGZyb20KKworCWdpdDovL2dpdC5vc21vY29tLm9yZy9saWJvc21vY29yZS5naXQKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9jb25maWd1cmUuaW4gYi9vcGVuYnNjL2NvbmZpZ3VyZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjAxOTgzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9jb25maWd1cmUuaW4KQEAgLTAsMCArMSw1OSBAQAorZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQKK0FDX0lOSVQoW29wZW5ic2NdLAorCW00X2VzeXNjbWQoWy4vZ2l0LXZlcnNpb24tZ2VuIC50YXJiYWxsLXZlcnNpb25dKSwKKwlbb3BlbmJzYy1kZXZlbEBsaXN0cy5vcGVuYnNjLm9yZ10pCisKK0FNX0lOSVRfQVVUT01BS0UoW2Rpc3QtYnppcDJdKQorCitkbmwga2VybmVsIHN0eWxlIGNvbXBpbGUgbWVzc2FnZXMKK200X2lmZGVmKFtBTV9TSUxFTlRfUlVMRVNdLCBbQU1fU0lMRU5UX1JVTEVTKFt5ZXNdKV0pCisKK2RubCBjaGVja3MgZm9yIHByb2dyYW1zCitBQ19QUk9HX01BS0VfU0VUCitBQ19QUk9HX0NDCitBQ19QUk9HX0lOU1RBTEwKK0FDX1BST0dfUkFOTElCCisKK2RubCBjaGVja3MgZm9yIGxpYnJhcmllcworQUNfU0VBUkNIX0xJQlMoY3J5cHQsIGNyeXB0LAorICAgIFtMSUJDUllQVD0iLWxjcnlwdCI7IEFDX0RFRklORShbVlRZX0NSWVBUX1BXXSwgW10sIFtVc2UgY3J5cHQgZnVuY3Rpb25hbGl0eSBvZiB2dHkuXSldKQorCitQS0dfQ0hFQ0tfTU9EVUxFUyhMSUJPU01PQ09SRSwgbGlib3Ntb2NvcmUgPj0gMC4xLjMpCisKK2RubCBjaGVja3MgZm9yIGhlYWRlciBmaWxlcworQUNfSEVBREVSX1NUREMKKworZG5sIENoZWNrcyBmb3IgdHlwZWRlZnMsIHN0cnVjdHVyZXMgYW5kIGNvbXBpbGVyIGNoYXJhY3RlcmlzdGljcworCisjIFRoZSBmb2xsb3dpbmcgdGVzdCBpcyB0YWtlbiBmcm9tIFdlYktpdCdzIHdlYmtpdC5tNAorc2F2ZWRfQ0ZMQUdTPSIkQ0ZMQUdTIgorQ0ZMQUdTPSIkQ0ZMQUdTIC1mdmlzaWJpbGl0eT1oaWRkZW4gIgorQUNfTVNHX0NIRUNLSU5HKFtpZiAke0NDfSBzdXBwb3J0cyAtZnZpc2liaWxpdHk9aGlkZGVuXSkKK0FDX0NPTVBJTEVfSUZFTFNFKFtjaGFyIGZvbztdLAorICAgICAgWyBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorICAgICAgICBTWU1CT0xfVklTSUJJTElUWT0iLWZ2aXNpYmlsaXR5PWhpZGRlbiJdLAorICAgICAgICBBQ19NU0dfUkVTVUxUKFtub10pKQorQ0ZMQUdTPSIkc2F2ZWRfQ0ZMQUdTIgorQUNfU1VCU1QoU1lNQk9MX1ZJU0lCSUxJVFkpCisKKworZG5sIEdlbmVyYXRlIHRoZSBvdXRwdXQKK0FNX0NPTkZJR19IRUFERVIoYnNjY29uZmlnLmgpCisKK0FDX09VVFBVVCgKKyAgICBvcGVuYnNjLnBjCisgICAgbGlic2NjcC5wYworICAgIGluY2x1ZGUvb3BlbmJzYy9NYWtlZmlsZQorICAgIGluY2x1ZGUvdnR5L01ha2VmaWxlCisgICAgaW5jbHVkZS9zY2NwL01ha2VmaWxlCisgICAgaW5jbHVkZS9NYWtlZmlsZQorICAgIHNyYy9NYWtlZmlsZQorICAgIHNyYy9pcGFjY2Vzcy9NYWtlZmlsZQorICAgIHNyYy9ncHJzL01ha2VmaWxlCisgICAgdGVzdHMvTWFrZWZpbGUKKyAgICB0ZXN0cy9kZWJ1Zy9NYWtlZmlsZQorICAgIHRlc3RzL2dzbTA0MDgvTWFrZWZpbGUKKyAgICB0ZXN0cy9kYi9NYWtlZmlsZQorICAgIHRlc3RzL2NoYW5uZWwvTWFrZWZpbGUKKyAgICB0ZXN0cy9zY2NwL01ha2VmaWxlCisgICAgTWFrZWZpbGUpCmRpZmYgLS1naXQgYS9vcGVuYnNjL2NvbnRyaWIvYnQucHkgYi9vcGVuYnNjL2NvbnRyaWIvYnQucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWIxMTFlZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvY29udHJpYi9idC5weQpAQCAtMCwwICsxLDMzIEBACisjIS91c3IvYmluL2VudiBweXRob24KKworaW1wb3J0IG9zCisKK2YgPSBvcGVuKCJ1bmJhbGFuY2VkIikKK2xpbmVzID0gW10KK2ZvciBsaW5lIGluIGY6CisgICAgbGluZXMuYXBwZW5kKGxpbmUpCisKK2ZpbGVuYW1lcyA9IHt9CisKK291dHB1dCA9IFtdCitmb3IgbGluZSBpbiBsaW5lczoKKyAgICBpZiAiWzB4IiBpbiBsaW5lOgorICAgICAgICBzdGFydCA9IGxpbmUuZmluZCgiWyIpCisgICAgICAgIGVuZCA9IGxpbmUuZmluZCgiXSIpCisgICAgICAgIGFkZHIgPSBsaW5lW3N0YXJ0KzE6ZW5kXQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmaWxlID0gZmlsZW5hbWVzW2FkZHJdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHIgPSBvcy5wb3BlbigiYWRkcjJsaW5lIC1mcyAtZSAuL2JzY19oYWNrICVzIiAlIGFkZHIpCisgICAgICAgICAgICBhbGwgPSByLnJlYWQoKS5yZXBsYWNlKCJcbiIsICIsIikKKyAgICAgICAgICAgIGZpbGUgPSBhbGwKKyAgICAgICAgICAgIGZpbGVuYW1lc1thZGRyXSA9IGZpbGUKKworICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlKGFkZHIsIGZpbGUpCisgICAgb3V0cHV0LmFwcGVuZChsaW5lKQorCitnID0gb3BlbigidW5iYWxhbmNlZC4yIiwgInciKQorZy53cml0ZSgiIi5qb2luKG91dHB1dCkpCisKKworCmRpZmYgLS1naXQgYS9vcGVuYnNjL2NvbnRyaWIvY29udmVydF90b19lbnVtLnB5IGIvb3BlbmJzYy9jb250cmliL2NvbnZlcnRfdG9fZW51bS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iY2Q2ZjJjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9jb250cmliL2NvbnZlcnRfdG9fZW51bS5weQpAQCAtMCwwICsxLDM3IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIworIyBDb252ZXJ0IEVUU0kgZG9jdW1lbnRzIHRvIGFuIGVudW0KKyMKKworaW1wb3J0IHJlLCBzeXMKKworZGVmIGNvbnZlcnQoc3RyaW5nKToKKyAgICBzdHJpbmcgPSBzdHJpbmcuc3RyaXAoKS5yZXBsYWNlKCIgIiwgIiIpLnJqdXN0KDgsICIwIikKKyAgICB2YXIgPSAwCisgICAgb2Zmc2V0ID0gNworICAgIGZvciBjaGFyIGluIHN0cmluZzoKKyAgICAgICAgYXNzZXJ0IG9mZnNldCA+PSAwCisgICAgICAgIHZhciA9IHZhciB8IChpbnQoY2hhcikgPDwgb2Zmc2V0KQorICAgICAgICBvZmZzZXQgPSBvZmZzZXQgLSAxCisKKyAgICByZXR1cm4gdmFyCisKK2RlZiBzdHJpbmcobmFtZSk6CisgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgiICIsICJfIikKKyAgICBuYW1lID0gbmFtZS5yZXBsYWNlKCciJywgIiIpCisgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgnLycsICdfJykKKyAgICBuYW1lID0gbmFtZS5yZXBsYWNlKCcoJywgJ18nKQorICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJyknLCAnXycpCisgICAgcmV0dXJuICIlc18lcyIgJSAoc3lzLmFyZ3ZbMl0sIG5hbWUudXBwZXIoKSkKKworZmlsZSA9IG9wZW4oc3lzLmFyZ3ZbMV0pCisKKworZm9yIGxpbmUgaW4gZmlsZToKKyAgICBtID0gcmUubWF0Y2gociJbIFx0XSooP1A8dmFsdWU+WzAxIF0rKVsgXSsoP1A8bmFtZT5bYS16QS1aIC8wLTkoKV0rKSIsIGxpbmVbOi0xXSkKKworICAgIGlmIG06CisgICAgICAgIHByaW50ICJcdCVzXHRcdD0gJWQsIiAlIChzdHJpbmcobS5ncm91cGRpY3QoKVsibmFtZSJdKSwgY29udmVydChtLmdyb3VwZGljdCgpWyJ2YWx1ZSJdKSkKKyAgICBlbHNlOgorICAgICAgICBwcmludCBsaW5lWzotMV0KZGlmZiAtLWdpdCBhL29wZW5ic2MvY29udHJpYi9tZ2NwX3NlcnZlci5weSBiL29wZW5ic2MvY29udHJpYi9tZ2NwX3NlcnZlci5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNWM0ODlkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9jb250cmliL21nY3Bfc2VydmVyLnB5CkBAIC0wLDAgKzEsNjAgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBTaW1wbGUgc2VydmVyIGZvciBtZ2NwLi4uIHNlbmQgYXVkaXQsIHJlY2VpdmUgcmVzcG9uc2UuLgorCitpbXBvcnQgc29ja2V0LCB0aW1lCisKK01HQ1BfR0FURVdBWV9QT1JUID0gMjQyNworTUdDUF9DQUxMQUdFTlRfUE9SVCA9IDI3MjcKKworcnNpcF9yZXNwID0gIiIiMjAwIDMyMTMyMTMzMlxyXG4iIiIKK2F1ZGl0X3BhY2tldCA9ICIiIkFVRVAgJWQgMTNAbWd3IE1HQ1AgMS4wXHJcbiIiIgorY3JjeF9wYWNrZXQgPSAiIiJDUkNYICVkIDE0QG1ndyBNR0NQIDEuMFxyXG5DOiA0YTg0YWQ1ZDI1ZlxyXG5MOiBwOjIwLCBhOkdTTS1FRlIsIG50OklOXHJcbk06IHJlY3Zvbmx5XHJcbiIiIgorZGxjeF9wYWNrZXQgPSAiIiJETENYICVkIDE0QG1ndyBNR0NQIDEuMFxyXG5DOiA0YTg0YWQ1ZDI1ZlxyXG5JOiAlZFxyXG4iIiIKK21kY3hfcGFja2V0ID0gIiIiTURDWCAlZCAxNEBtZ3cgTUdDUCAxLjBcclxuQzogNGE4NGFkNWQyNWZcclxuSTogJWRcclxuTDogcDoyMCwgYTpHU00tRUZSLCBudDpJTlxyXG5NOiByZWN2b25seVxyXG5cclxudj0wXHJcbm89LSAyNTg2OTY0NzcgMCBJTiBJUDQgMTcyLjE2LjEuMTA3XHJcbnM9LVxyXG5jPUlOIElQNCAxNzIuMTYuMS4xMDdcclxudD0wIDBcclxubT1hdWRpbyA2NjY2IFJUUC9BVlAgMTI3XHJcbmE9cnRwbWFwOjEyNyBHU00tRUZSLzgwMDAvMVxyXG5hPXB0aW1lOjIwXHJcbmE9cmVjdm9ubHlcclxubT1pbWFnZSA0NDAyIHVkcHRsIHQzOFxyXG5hPVQzOEZheFZlcnNpb246MFxyXG5hPVQzOE1heEJpdFJhdGU6MTQ0MDBcclxuIiIiCisKK2RlZiBoZXhkdW1wKHNyYywgbGVuZ3RoPTgpOgorICAgICIiIlJlY2lwZSBpcyBmcm9tIGh0dHA6Ly9jb2RlLmFjdGl2ZXN0YXRlLmNvbS9yZWNpcGVzLzE0MjgxMi8iIiIKKyAgICByZXN1bHQgPSBbXQorICAgIGRpZ2l0cyA9IDQgaWYgaXNpbnN0YW5jZShzcmMsIHVuaWNvZGUpIGVsc2UgMgorICAgIGZvciBpIGluIHhyYW5nZSgwLCBsZW4oc3JjKSwgbGVuZ3RoKToKKyAgICAgICBzID0gc3JjW2k6aStsZW5ndGhdCisgICAgICAgaGV4YSA9IGInICcuam9pbihbIiUwKlgiICUgKGRpZ2l0cywgb3JkKHgpKSAgZm9yIHggaW4gc10pCisgICAgICAgdGV4dCA9IGInJy5qb2luKFt4IGlmIDB4MjAgPD0gb3JkKHgpIDwgMHg3RiBlbHNlIGInLicgIGZvciB4IGluIHNdKQorICAgICAgIHJlc3VsdC5hcHBlbmQoIGIiJTA0WCAgICUtKnMgICAlcyIgJSAoaSwgbGVuZ3RoKihkaWdpdHMgKyAxKSwgaGV4YSwgdGV4dCkgKQorICAgIHJldHVybiBiJ1xuJy5qb2luKHJlc3VsdCkKKworc2VydmVyX3NvY2tldCA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX0RHUkFNKQorc2VydmVyX3NvY2tldC5iaW5kKCgiMTI3LjAuMC4xIiwgTUdDUF9DQUxMQUdFTlRfUE9SVCkpCitzZXJ2ZXJfc29ja2V0LnNldGJsb2NraW5nKDEpCisKK2xhc3RfY2kgPSAxCitkZWYgc2VuZF9hbmRfcmVjZWl2ZShwYWNrZXQpOgorICAgIGdsb2JhbCBsYXN0X2NpCisgICAgc2VydmVyX3NvY2tldC5zZW5kdG8ocGFja2V0LCAoIjEyNy4wLjAuMSIsIE1HQ1BfR0FURVdBWV9QT1JUKSkKKyAgICB0cnk6CisgICAgICAgIGRhdGEsIGFkZHIgPSBzZXJ2ZXJfc29ja2V0LnJlY3Zmcm9tKDQwOTYpCisKKyAgICAgICAgIyBhdHRlbXB0IHRvIHN0b3JlIHRoZSBDSSBvZiB0aGUgcmVzcG9uc2UKKyAgICAgICAgbGlzdCA9IGRhdGEuc3BsaXQoIlxuIikKKyAgICAgICAgZm9yIGl0ZW0gaW4gbGlzdDoKKyAgICAgICAgICAgaWYgaXRlbS5zdGFydHN3aXRoKCJJOiAiKToKKyAgICAgICAgICAgICAgIGxhc3RfY2kgPSBpbnQoaXRlbVszOl0pCisKKyAgICAgICAgcHJpbnQgaGV4ZHVtcChkYXRhKSwgYWRkcgorICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIGU6CisgICAgICAgIHByaW50IGUKKyAgICAgICAgcGFzcworCitkZWYgZ2VuZXJhdGVfdGlkKCk6CisgICAgaW1wb3J0IHJhbmRvbQorICAgIHJldHVybiByYW5kb20ucmFuZGludCgwLCA2NTEyMykKKworCisKK3doaWxlIFRydWU6CisgICAgc2VuZF9hbmRfcmVjZWl2ZShhdWRpdF9wYWNrZXQgJSBnZW5lcmF0ZV90aWQoKSkKKyAgICBzZW5kX2FuZF9yZWNlaXZlKGNyY3hfcGFja2V0ICUgZ2VuZXJhdGVfdGlkKCkgKQorICAgIHNlbmRfYW5kX3JlY2VpdmUobWRjeF9wYWNrZXQgJSAoZ2VuZXJhdGVfdGlkKCksIGxhc3RfY2kpKQorICAgIHNlbmRfYW5kX3JlY2VpdmUoZGxjeF9wYWNrZXQgJSAoZ2VuZXJhdGVfdGlkKCksIGxhc3RfY2kpKQorCisgICAgdGltZS5zbGVlcCgzKQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9kb2MvQlMxMS1PTUwudHh0IGIvb3BlbmJzYy9kb2MvQlMxMS1PTUwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YzMyOTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2RvYy9CUzExLU9NTC50eHQKQEAgLTAsMCArMSwzMSBAQAorVGhlIFNpZW1lbnMgQlMtMTEgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIEdTTSAxMi4yMSBPTUwgb3BlcmF0aW9uczoKKworCitDUkVBVEUgT0JKRUNUCisKK2FiaXNfb21fZm9tX2hkci5vYmpfY2xhc3MgY2FuIGJlIAorQTM6CitBNTogQUxDTywgQkJTSUcsIENDTEssIEdQU1UsIExJLCBQQQorQTg6IEVudmFCVFNFCitBOTogQlBPUlQKKwordGhlIGFiaXNfb21fb2JqX2luc3QudHJ4X25yIGZpZWxkIGluZGljYXRlcyB0aGUgaW5kZXggb2Ygb2JqZWN0LCB3aGVyZWFzIHRoZQorYWJpc19vbV9mb21faGRyLmJ0c19uciBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KKworZW51bSBhYmlzX2JzMTFfb2JqdHlwZSB7CisJQlMxMV9PQkpfQUxDTwkJPSAweDAxLAorCUJTMTFfT0JKX0JCU0lHCQk9IDB4MDIsCS8qIG9ial9jbGFzczogMCwxICovCisJQlMxMV9PQkpfVFJYMQkJPSAweDAzLAkvKiBvbmx5IERFQUNUSVZBVEUgVFJYMSAqLworCUJTMTFfT0JKX0NDTEsJCT0gMHgwNCwKKwlCUzExX09CSl9HUFNVCQk9IDB4MDYsCisJQlMxMV9PQkpfTEkJCT0gMHgwNywKKwlCUzExX09CSl9QQQkJPSAweDA5LAkvKiBvYmpfY2xhc3M6IDAsIDEqLworfTsKKworSW4gY2FzZSBvZiBDUkVBVEUgRU5WQUJUU0UsIHRoZSBhYmlzX29tX29ial9pbnN0LnRyeF9uciBpbmRpY2F0ZXMgdGhlIEVudmFCVFNFeAorbnVtYmVyLgorCitJbiBjYXNlIG9mIEE5IChDUkVBRVRFIEJQT1JUKSwgdGhlIGFiaXNfb21fb2JqX2luc3QuYnRzX25yIGluZGljYXRlcyB3aGljaCBCUE9SVAorc2hhbGwgYmUgdXNlZC4KKworCmRpZmYgLS1naXQgYS9vcGVuYnNjL2RvYy9jYWxsLXJvdXRpbmcudHh0IGIvb3BlbmJzYy9kb2MvY2FsbC1yb3V0aW5nLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDAyZjllCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9kb2MvY2FsbC1yb3V0aW5nLnR4dApAQCAtMCwwICsxLDI1IEBACitDYWxsIHJvdXRpbmcgaW4gT3BlbkJTQworCitGbG93IG9mIGV2ZW50czoKKworICMgTU8gY2FsbCBpbml0aWF0ZWQgYnkgTVMsIENIQU5ORUwgUlFELCBJTU1FRElBVEUgQVNTSUdOCisgIyBNUyBzZW5kcyBDQyBTRVRVUCBtZXNzYWdlLCB3ZSBhc3N1bWUgYWxyZWFkeSBvbiBUQ0gvSCBGQUNDSAorICMgT3BlbkJTQyBkb2VzIGEgc3Vic2NyaWJlciBsb29rdXAgYmFzZWQgb24gdGhlIHRhcmdldCBleHRlbnNpb24KKyAgKiBJZiBhIHN1YnNjcmliZXIgaXMgZm91bmQ6CisgICAjIHNlbmQgQ0FMTCBQUk9DRUVESU5HIG1lc3NhZ2UgdG8gTU8KKyAgICMgcGFnZSB0aGUgTVQgc3Vic2NyaWJlciBhbmQgYXNrIGl0SSB0byBhc2sgZm9yIFRDSC9ICisgICAjIG9uY2UgcGFnaW5nIGNvbXBsZXRlcywgd2UgaGF2ZSB0aGUgVENIL0ggZm9yIHRoZSBNVCBlbmQKKyAgICMgc2VuZCBTRVRVUCB0byBNVAorICAgIyByZWNlaXZlIENBTEwgQ09ORklSTUVEIGZyb20gTVQKKyAgICMgc2V0LXVwIHRoZSBUUkFVIG11eCBtYXBwaW5nIGJldHdlZW4gdGhlIEUxIHN1YnNsb3RzIGZvciBib3RoIFRDSC9ICisgICAjIHJlY2VpdmUgQUxFUlRJTkcgZnJvbSBNVCwgcm91dGUgQUxFUlRJTkcgdG8gTU8KKyAgICMgcmVjZWl2ZSBDT05ORUNUIGZyb20gTVQsIGNvbmZpcm0gdG8gTVQgd2l0aCBDT05ORUNUX0FDSworICAgIyBzZW5kIGEgQ09OTkVDVCBtZXNzYWdlIHRvIE1PLCByZWNlaXZlIENPTk5FQ1RfQUNLIGZyb20gTU8KKyAqIElmIHN1YnNjcmliZXIgaXMgbm90IGZvdW5kOgorICAjIHNlbmQgUkVMRUFTRSBDT01QTEVURSB3aXRoIGFwcm9wcmlhdGUgY2F1c2UgdG8gTU8gKDE6IHVuYWxsb2FjYXRlZCAzOiBubyByb3V0ZSkKKyAgCisKKworVGhvdWdodHMgYWJvdXQgUlIvTU06CisKKyogd2UgYWxsb2NhdGUgUlIvTU0gZW50aXRpZXMgb24gZGVtYW5kLCB3aGVuIHdlIG5lZWQgdGhlbQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9kb2MvY2hhbm5lbF9yZWxlYXNlLnR4dCBiL29wZW5ic2MvZG9jL2NoYW5uZWxfcmVsZWFzZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFjZjA5YwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvZG9jL2NoYW5uZWxfcmVsZWFzZS50eHQKQEAgLTAsMCArMSw3NCBAQAorCitHU00gMDQuMDggNy4xLjcgLyA5LjEuNwkJUlIgQ0hBTk5FTCBSRUxFU0UKKworUlNMIDA4LjU4IDMuNCAvID8JCVJMTCBMaW5rIFJlbGVhc2UgUmVxdWVzdAorCitSU0wgMDguNTggNC42IC8gOC40LjUJCURFQUNUaXZhdGUgU0FDQ0gKKwkqIERlYWN0aXZhdGUgU0FDQ0ggYWNjb3JkaW5nIHRvIENoYW5uZWwgUmVsZWFzZSBQcm9jIDA0LjA4CisJKiB0byBiZSBzZW50IGFmdGVyIFJSIENIQU5ORUwgUkVMRUFTRSBpcyBzZW50IHRvIE1TCisKK1JTTCAwOC41OCA0LjcgLyA4LjQuMTQJCVJGIENIQU5uZWwgUkVMZWFzZQorCSogdGVsbHMgdGhlIEJUUyB0byByZWxlYXNlIGEgcmFkaW8gY2hhbm5lbAorCSogIndoZW4gYW4gYWN0aXZhdGVkIHJhZGlvIGNoYW5uZWwgaXMgbm8gbG9uZ2VyIG5lZWRlZCIKKwkqIEJUUyByZXNwb25kcyB3aXRoIFJGIENIQU5uZWwgUkVMZWFzZSBBQ0tub3dsZWRnZQorCisKK0dTTSAwNC4wOCAzLjQuMTM6IFJSIGNvbm5lY3Rpb24gcmVsZWFzZSBwcm9jZWR1cmUKKworKiBuZXR3b3JrIHNlbmRzIFJSIENIQU5ORUwgUkVMRUFTRSB0byBNUyBvbiB0aGUgRENDSAorICAqIHN0YXJ0IFQzMTA5CisgICogZGVhY3RpdmF0ZSBTQUNDSAorKiBNUyBkaXNjb25uZWN0cyBtYWluIHNpZ25hbGxpbmcgbGluayAoYnkgc2VuZGluZyBESVNDKQorICAqIGFsbCBvdGhlciBkYXRhIGxpbmtzIGFyZSBkaXNjb25uZWN0ZWQgYnkgbG9jYWwgZW5kIGxpbmsgcmVsZWFzZQorKiBuZXR3b3JrIHJlY2VpdmVzIERJU0MgKEJUUyBzZW5kcyBSTEwgUkVMIElORCB0byBCU0MpCisgICogc3RvcCBUMzEwOQorICAqIHN0YXJ0IFQzMTExIAorKiB3aGVuIFQzMTExIHRpbWVzIG91dCwgdGhlIG5ldHdvcmsgY2FuIHJldXNlIHRoZSBjaGFubmxzCisqIGlmIFQzMTA5IHRpbWVzIG91dCwgdGhlIG5ldHdvcmsgZGVhY3RpdmF0ZXMgdGhlIGNoYW5uZWxzIAorICBhbmQgY2FuIHJldXNlIHRoZW0KKyAgKiB0aGlzIHByb2JhYmx5IG1lYW5zIHNpbXBseSBSRiBDSEFObmVsIFJFTGVhc2UKKworCis9PSBJbXBsZW1lbnRhdGlvbiBpbiBPcGVuQlNDID09CisKK2NoYW5fYWxsb2MuYzpsY2hhbl9hdXRvX3JlbGVhc2UoKQorCSogY2hlY2tzIGlmIHVzZSBjb3VudCBzdGlsbCA+IDAgKGFib3J0KQorCSogY2FsbHMgZ3NtNDhfc2VuZF9ycl9yZWxlYXNlKCkKKwkJKiB3aGljaCBjYWxscyByc2xfZGVhY3Rfc2FjY2goKQorCSogY2FsbHMgcnNsX3JlbGVhc2VfcmVxdWVzdCgpCisJCSogd2hpY2ggc2VuZHMgUkxMIExpbmsgUmVsZWFzZSByZXF1ZXN0CisJCitSWCBvZiBSRUxlYXNlIElORGljYXRpb246CisJKiBjYWxsIHJzbF9yZl9jaGFuX3JlbGVhc2UoKSAoc2VuZCBSRl9DSEFOX1JFTCkKKworUlggb2YgUkVMZWFzZSBDT05GaW1lbToKKwkqIGNhbGwgcnNsX3JmX2NoYW5fcmVsZWFzZSgpIChzZW5kIFJGX0NIQU5fUkVMKQorCisqIFJYIG9mIFJGX0NIQU5fUkVMX0FDSworCSogY2FsbCBsY2hhbl9mcmVlKCkKKwkJKiBzdWJzY3JfcHV0KCkKKwkJKiBkZWxldGUgcmVsZWFzZV90aW1lcgorCisKKz09PSBJbnRlZ3JhdGlvbiB3aXRoIFNNUyA9PT0KKworKiBSWCBvZiBDUF9FUlJPUiBvciB1bmltcGxlbWVudGVkIE1UCisJKiB0cmlnZ2VyIHRyYW5zX2ZyZWUoKSB3aGljaCB3aWxsIGxjaGFuX2F1dG9fcmVsZWFzZSgpCisKKyogQ1AgVEMxKiBleHBpcmVkIHdoaWxlIHdhaXRpbmcgZm9yIENQLUFDSworCSogdHJpZ2dlciB0cmFuc19mcmVlKCkgd2hpY2ggd2lsbCBsY2hhbl9hdXRvX3JlbGVhc2UoKQorCisqIFJYIG9mIFJQX0VSUk9SCisJKiB0cmlnZ2VyIHRyYW5zX2ZyZWUoKSB3aGljaCB3aWxsIGxjaGFuX2F1dG9fcmVsZWFzZSgpCisJCisqIFRYIG9mIENQLUFDSyBpbiBNVCBERUxJVkVSCisJKiB0cmlnZ2VyIHRyYW5zX2ZyZWUoKSB3aGljaCB3aWxsIGxjaGFuX2F1dG9fcmVsZWFzZSgpCisKKyogUlggb2YgQ1AtQUNLIGluIE1PIFNVQk1JVAorCSogdHJpZ2dlciB0cmFuc19mcmVlKCkgd2hpY2ggd2lsbCBsY2hhbl9hdXRvX3JlbGVhc2UoKQorCQorKiBSWCBvZiBSUC1BQ0sgaW4gTVQgREVMSVZFUiAoYW5kIG5vIG1vcmUgbWVzc2FnZXMpCisJKiB0cmlnZ2VyIHJzbF9yZWxlYXNlX3JlcXVlc3QoKSBmb3IgU0FQSTMKKworKiBSWCBvZiBSUC1TTU1BIGluIE1UIERFTElWRVIgKGFuZCBubyBtb3JlIG1lc3NhZ2VzKQorCSogdHJpZ2dlciByc2xfcmVsZWFzZV9yZXF1ZXN0KCkgZm9yIFNBUEkzCmRpZmYgLS1naXQgYS9vcGVuYnNjL2RvYy9lMS1kYXRhLW1vZGVsLnR4dCBiL29wZW5ic2MvZG9jL2UxLWRhdGEtbW9kZWwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1OTRmZTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2RvYy9lMS1kYXRhLW1vZGVsLnR4dApAQCAtMCwwICsxLDE3MiBAQAorRTEgcmVsYXRlZCBkYXRhIG1vZGVsCisKK1RoaXMgZGF0YSBtb2RlbCBkZXNjcmliZXMgdGhlIHBoeXNpY2FsIHJlbGF0aW9uc2hpcCBvZiB0aGUgaW5kaXZpZHVhbAorcGFydHMgaW4gdGhlIG5ldHdvcmssIGl0IGlzIG5vdCB0aGUgbG9naWNhbC9wcm90b2NvbCBzaWRlIG9mIHRoZSBHU00KK25ldHdvcmsuCisKK0EgQlRTIGlzIGNvbm5lY3RlZCB0byB0aGUgQlNDIGJ5IHNvbWUgcGh5c2ljYWwgbGluay4gIEl0IGNvdWxkIGJlIGFuIGFjdHVhbAorRTEgbGluaywgYnV0IGl0IGNvdWxkIGFsc28gYmUgYWJpcy1vdmVyLUlQIHdpdGggYSBtaXh0dXJlIG9mIFRDUCBhbmQgUlRQL1VEUC4KKworVG8gZnVydGhlciBjb21wbGljYXRlIHRoZSBmYWN0LCBtdWx0aXBsZSBCVFMgY2FuIHNoYXJlIG9uZSBzdWNoIHB5c2ljYWwKK2xpbmsuICBPbiBhIHNpbmdsZSBFMSBsaW5lLCB3ZSBjYW4gZWFzaWx5IGFjY29tb2RhdGUgdXAgdG8gdGhyZWUgQlRTIHdpdGgKK3R3byBUUlggZWFjaC4KKworVGh1cywgaXQgaXMgYmVzdCBmb3IgT3BlbkJTQyB0byBoYXZlIHNvbWUga2luZCBvZiBhYnN0cmFjdGlvbiBsYXllci4gIFRoZSBCU0MncwordmlldyBvZiBhIEJUUyBjb25uZWN0ZWQgdG8gaXQuICBXZSBjYWxsIHRoaXMgJ2J0c19saW5rJy4gIEEgYnRzX2xpbmsgY2FuIGJlCisqIGFsbCB0aGUgVENQIGFuZCBVRFAgc3RyZWFtcyBvZiBhIEFiaXMtb3Zlci1JUCBCVFMKKyogYSBzZXQgb2YgRTEgdGltZXNsb3RzIGZvciBPTUwsIFJTTCBhbmQgVFJBVSBjb25uZWN0aW9ucyBvbiBhIEUxIGxpbmsKKyogYSBzZXJpYWwgbGluZSBleGNsdXNpdmVseSB1c2VkIGZvciBPTUwgbWVzc2FnZXMgKFQtTGluaykKKworQSBidHNfbGluayBjYW4gYmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBPcGVuQlNDIGNvcmUgYXQgcnVudGltZS4KKworc3RydWN0IHRyeF9saW5rIHsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKK307CisKK3N0cnVjdCBidHNfbGluayB7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlzdHJ1Y3QgdHJ4X2xpbmsgdHJ4X2xpbmtzW05VTV9UUlhdOworfTsKKworSW50ZXJmYWNlIGZyb20gc3RhY2sgdG8gaW5wdXQgY29yZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2ludCBhYmlzX3JzbF9zZW5kbXNnKHN0cnVjdCBtc2diICptc2cpOworCXNlbmQgYSBtZXNzYWdlIHRocm91Z2ggYSBSU0wgbGluayB0byB0aGUgVFJYIHNwZWNpZmllZCBieSB0aGUgY2FsbGVyIGluCisJbXNnLT50cnguCisKK2ludCBhYmlzX3JzbF9yY3Ztc2coc3RydWN0IG1zZ2IgKm1zZyk7CisJcmVjZWl2ZSBhIG1lc3NhZ2UgZnJvbSBhIFJTTCBsaW5rIGZyb20gdGhlIFRSWCBzcGVjaWZpZWQgYnkgdGhlCisJY2FsbGVyIGluIG1zZy0+dHJ4LgorCitpbnQgYWJpc19ubV9zZW5kbXNnKHN0cnVjdCBtc2diICptc2cpOworCXNlbmQgYSBtZXNzYWdlIHRocm91Z2ggYSBPTUwgbGluayB0byB0aGUgQlRTIHNwZWNpZmllZCBieSB0aGUgY2FsbGVyIGluCisJbXNnLT50cngtPmJ0cy4gIFRoZSBjYWxsZXIgY2FuIGp1c3QgdXNlIGJ0cy0+YzAgdG8gZ2V0IHRoZSBmaXJzdCBUUlgKKwlpbiBhIEJUUy4gKE9NTCBtZXNzYWdlcyBhcmUgbm90IHJlYWxseSBzZW50IHRvIGEgVFJYIGJ1dCB0byB0aGUgQlRTKQorCitpbnQgYWJpc19ubV9yY3Ztc2coc3RydWN0IG1zZ2IgKm1zZyk7CisJcmVjZWl2ZSBhIG1lc3NhZ2UgZnJvbSBhIE9NTCBsaW5rIGZyb20gdGhlIEJUUyBzcGVjaWZpZWQgYnkgdGhlIGNhbGxlcgorCWluIG1zZy0+dHJ4LT5idHMuICBUaGUgY2FsbGVyIGNhbiBqdXN0IHVzZSBidHMtPmMwIHRvIGdldCB0aGUgZmlyc3QKKwlUUlggaW4gYSBCVFMuCisKK2ludCBhYmlzX2xpbmtfZXZlbnQoaW50IGV2ZW50LCB2b2lkICpkYXRhKTsKKwlzaWduYWwgc29tZSBldmVudCAoc3VjaCBhcyBsYXllciAxIGNvbm5lY3QvZGlzY29ubmVjdCkgZnJvbSB0aGUKKwlpbnB1dCBjb3JlIHRvIHRoZSBzdGFjay4KKworaW50IHN1YmNoX2RlbXV4X2luKG14LCBjb25zdCB1X2ludDhfdCAqZGF0YSwgaW50IGxlbik7CisJcmVjZWl2ZSAnbGVuJyBieXRlcyBmcm9tIGEgZ2l2ZW4gRTEgdGltZXNsb3QgKFRSQVUgZnJhbWVzKQorCitpbnQgc3ViY2hhbl9tdXhfb3V0KG14LCB1X2ludDhfdCAqZGF0YSwgaW50IGxlbik7CisJb2J0YWluICdsZW4nIGJ5dGVzIG9mIG91dHB1dCBkYXRhIHRvIGJlIHNlbnQgb24gRTEgdGltZXNsb3QKKworSW50cmZhY2UgYnkgSW5wdXQgQ29yZSBmb3IgSW5wdXQgUGx1Z2lucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitpbnQgYnRzbGlua19yZWdpc3Rlcl9wbHVnaW4oKTsKKworCitDb25maWd1cmF0aW9uIGZvciB0aGUgRTEgaW5wdXQgbW9kdWxlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0JUUworCUJUUyBudW1iZXIKKwludW1iZXIgb2YgVFJYCisJT01MIGxpbmsKKwkJRTEgbGluZSBudW1iZXIKKwkJdGltZXNsb3QgbnVtYmVyCisJCVtzdWJzbG90IG51bWJlcl0KKwkJU0FQSQorCQlURUkKKwlmb3IgZWFjaCBUUlgKKwkJUlNMIGxpbmsKKwkJCUUxIGxpbmUgbnVtYmVyCisJCQl0aW1lc2xvdCBudW1iZXIKKwkJCVtzdWJzbG90IG51bWJlcl0KKwkJCVNBUEkKKwkJCVRFSQorCQlmb3IgZWFjaCBUUworCQkJRTEgbGluZSBudW1iZXIKKwkJCXRpbWVzbG90IG51bWJlcgorCQkJc3Vic2xvdCBudW1iZXIKKworCitFMSBpbnB1dCBtb2R1bGUgZGF0YSBtb2RlbAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKK2VudW0gZTFpbnBfc2lnbl90eXBlIHsKKwlFMUlOUF9TSUdOX05PTkUsCisJRTFJTlBfU0lHTl9PTUwsCisJRTFJTlBfU0lHTl9SU0wsCit9OworCitzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rIHsKKwkvKiBsaXN0IG9mIHNpZ25hbGxpbmcgbGlua3MgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCisJZW51bSBlMWlucF9zaWduX3R5cGUgdHlwZTsKKworCS8qIHRyeCBmb3IgbXNnLT50cnggb2YgcmVjZWl2ZWQgbXNncyAqLwkKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKworCS8qIG1zZ2IgcXVldWUgb2YgdG8tYmUtdHJhbnNtaXR0ZWQgbXNncyAqLworCXN0cnVjdCBsbGlzdF9oZWFkIHR4X2xpc3Q7CisKKwkvKiBTQVBJIGFuZCBURUkgb24gdGhlIEUxIFRTICovCisJdV9pbnQ4X3Qgc2FwaTsKKwl1X2ludDhfdCB0ZWk7Cit9CisKK2VudW0gZTFpbnBfdHNfdHlwZSB7CisJRTFJTlBfVFNfVFlQRV9OT05FLAorCUUxSU5QX1RTX1RZUEVfU0lHTiwKKwlFMUlOUF9UU19UWVBFX1RSQVUsCit9OworCisvKiBBIHRpbWVzbG90IGluIHRoZSBFMSBpbnRlcmZhY2UgKi8KK3N0cnVjdCBlMWlucF90cyB7CisJZW51bSBlMWlucF90c190eXBlIHR5cGU7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmU7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJc3RydWN0IGxsaXN0X2hlYWQgc2lnbl9saW5rczsKKwkJfSBzaWduOworCQlzdHJ1Y3QgeworCQkJLyogc3ViY2hhbm5lbCBkZW11eGVyIGZvciBmcmFtZXMgZnJvbSBFMSAqLworCQkJc3RydWN0IHN1YmNoX2RlbXV4IGRlbXV4OworCQkJLyogc3ViY2hhbm5lbCBtdXhlciBmb3IgZnJhbWVzIHRvIEUxICovCisJCQlzdHJ1Y3Qgc3ViY2hfbXV4IG11eDsKKwkJfSB0cmF1OworCX07CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJLyogbUlTRE4gZHJpdmVyIGhhcyBvbmUgZmQgZm9yIGVhY2ggdHMgKi8KKwkJCXN0cnVjdCBic2NfZmQ7CisJCX0gbWlzZG47CisJfSBkcml2ZXI7Cit9OworCitzdHJ1Y3QgZTFpbnBfbGluZSB7CisJdW5zaWduZWQgaW50IG51bTsKKwljaGFyICpuYW1lOworCisJc3RydWN0IGUxaW5wX3RzIHRzW05SX0UxX1RTXTsKKworCWNoYXIgKmUxaW5wX2RyaXZlcjsKKwl2b2lkICpkcml2ZXJfZGF0YTsKK307CisKKy8qIENhbGwgZnJvbSB0aGUgU3RhY2s6IGNvbmZpZ3VyYXRpb24gb2YgdGhpcyBUUyBoYXMgY2hhbmdlZCAqLworaW50IGUxaW5wX3VwZGF0ZV90cyhzdHJ1Y3QgZTFpbnBfdHMgKnRzKTsKKworLyogUmVjZWl2ZSBhIHBhY2tldCBmcm9tIHRoZSBFMSBkcml2ZXIgKi8KK2ludCBlMWlucF9yeF90cyhzdHJ1Y3QgZTFpbnBfdHMgKnRzLCBzdHJ1Y3QgbXNnYiAqbXNnLAorCQl1X2ludDhfdCB0ZWksIHVfaW50OF90IHNhcGkpOworCisvKiBTZW5kIGEgcGFja2V0LCBjYWxsYmFjayBmdW5jdGlvbiBpbiB0aGUgZHJpdmVyICovCitpbnQgZTFkcml2ZXJfdHhfdHMoc3RydWN0IGUxaW5wX3RzICp0cywgc3RydWN0IG1zZ2IgKm1zZykKKworCitzdHJ1Y3QgZTFpbnBfZHJpdmVyIHsKKwljb25zdCBjaGFyICpuYW1lOworCWludCAoKndhbnRfd3JpdGUpKHN0cnVjdCBlMWlucF90cyAqdHMpOworfTsKZGlmZiAtLWdpdCBhL29wZW5ic2MvZG9jL2dzbS1ob3BwaW5nLnR4dCBiL29wZW5ic2MvZG9jL2dzbS1ob3BwaW5nLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTEwOTM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9kb2MvZ3NtLWhvcHBpbmcudHh0CkBAIC0wLDAgKzEsNTQgQEAKK2FjY29yZGluZyB0byBHU00gMDUuMDI6CisKK2dlbmVyYWwgcGFyYW1ldGVycyBmcm9tIENDQ0g6CisqIENBIGNlbGwgYWxsb2NhdGlvbiBvZiBBUkZDTidzIChTeXN0ZW0gSW5mb3JtYXRpb24gLyBCQ0NIKQorKiBGTjogVERNQSBmcmFtZSBudW1iZXIgKHQxLHQyLHQzJykgaW4gU0NICisKK3NwZWNpZmljIHBhcmFtZXRlcnMgZnJvbSBjaGFubmVsIGFzc2lnbm1lbnQ6CisqIE1BOiBtb2JpbGUgYWxsb2NhdGlvbiwgZGVmaW5lcyBzZXQgb2YgQVJGQ04ncywgdXAgdG8gNjQKKyogTUFJTzogaW5kZXgKKyogSFNOOiBob3BwaW5nIHNlcXVlbmNlIGdlbmVyYXRvciBudW1iZXIgKDAuLjY0KQorCisKK2hvcHBpbmcgc2VxdWVuY2UgZ2VuZXJhdGlvbiAoNi4yLjMpOgorCit1X2ludDhfdCBybnRhYmxlWzExNF0gPSB7CisJIDQ4LCAgOTgsICA2MywgICAxLCAgMzYsICA5NSwgIDc4LCAxMDIsICA5NCwgIDczLAorCSAgMCwgIDY0LCAgMjUsICA4MSwgIDc2LCAgNTksIDEyNCwgIDIzLCAxMDQsIDEwMCwKKwkxMDEsICA0NywgMTE4LCAgODUsICAxOCwgIDU2LCAgOTYsICA4NiwgIDU0LCAgIDIsCisJIDgwLCAgMzQsIDEyNywgIDEzLCAgIDYsICA4OSwgIDU3LCAxMDMsICAxMiwgIDc0LAorCSA1NSwgMTExLCAgNzUsICAzOCwgMTA5LCAgNzEsIDExMiwgIDI5LCAgMTEsICA4OCwKKwkgODcsICAxOSwgICAzLCAgNjgsIDExMCwgIDI2LCAgMzMsICAzMSwgICA4LCAgNDUsCisJIDgyLCAgNTgsICA0MCwgMTA3LCAgMzIsICAgNSwgMTA2LCAgOTIsICA2MiwgIDY3LAorCSA3NywgMTA4LCAxMjIsICAzNywgIDYwLCAgNjYsIDEyMSwgIDQyLCAgNTEsIDEyNiwKKwkxMTcsIDExNCwgICA0LCAgOTAsICA0MywgIDUyLCAgNTMsIDExMywgMTIwLCAgNzIsCisJIDE2LCAgNDksICAgNywgIDc5LCAxMTksICA2MSwgIDIyLCAgODQsICAgOSwgIDk3LAorCTEyNSwgIDk5LCAgMTcsIDEyMworfTsKKworLyogbWFpPTAgcmVwcmVzZW50cyBsb3dlc3QgQVJGQ04gaW4gdGhlIE1BICovCisKKwordV9pbnQ4X3QgaG9wcGluZ19tYWkodV9pbnQ4X3QgaHNuLCB1X2ludDMyX3QgZm4sIHVfaW50OF90IG1haW8sCisJCSAgICAgdV9pbnQ4X3QgdDEsIHVfaW50OF90IHQyLCB1X2ludDhfdCB0M18pCit7CisJdV9pbnQ4X3QgbWFpOworCisJaWYgKGhzbiA9PSAwKSAvKiBjeWNsaWMgaG9wcGluZyAqLworCQltYWkgPSAoZm4gKyBtYWlvKSAlIG47CisJZWxzZSB7CisJCXVfaW50MzJfdCBtLCBtXywgdF8sIHM7CisKKwkJbSA9IHQyICsgcm50YWJsZVsoaHNuIHhvciAodDEgJSA2NCkpICsgdDNdOworCQltXyA9IG0gJSAoMl5OQklOKTsKKwkJdF8gPSB0MyAlICgyXk5CSU4pOworCQlpZiAobV8gPCBuIHRoZW4pCisJCQlzID0gbV87CisJCWVsc2UKKwkJCXMgPSAobV8gKyB0XykgJSBuOworCQltYWkgPSAocyArIG1haW8pICUgbjsKKwl9CisKKwlyZXR1cm4gbWFpOworfQorCmRpZmYgLS1naXQgYS9vcGVuYnNjL2RvYy9oYW5kb3Zlci50eHQgYi9vcGVuYnNjL2RvYy9oYW5kb3Zlci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxOWU4NwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvZG9jL2hhbmRvdmVyLnR4dApAQCAtMCwwICsxLDg5IEBACitJZGVhcyBhYm91dCBhIGhhbmRvdmVyIGFsZ29yaXRobQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIGlzIG1vc3RseSBiYXNlZCBvbiB0aGUgcmVzdWx0cyBwcmVzZW50ZWQgaW4gQ2hhcHRlciA4IG9mICJQZXJmb3JtYW5jZQorRW5oYW5jZW1lbnRzIGluIGEgRnJlcXVlbmN5IEhvcHBpbmcgR1NNIE5ldHdvcmsiIGJ5IFRob21hcyBUb2Z0ZWdhYXJkIE5pZWxzZW4KK2FuZCBKb2Vyb2VuIFdpZ2FyZC4gCisKKworPT09IFJlYXNvbnMgZm9yIHBlcmZvcm1pbmcgaGFuZG92ZXIgPT09CisKK1NlY3Rpb24gMi4xLjE6IEhhbmRvdmVyIHVzZWQgaW4gdGhlaXIgQ0FQQUNJVFkgc2ltdWxhdGlvbjoKKworMSkgSW50ZXJmZXJlbmNlIEhhbmRvdmVyCisKK0F2ZXJhZ2UgUlhMRVYgaXMgc2F0aXNmYWN0b3J5IGhpZ2gsIGJ1dCBhdmVyYWdlIFJYUVVBTCB0b28gbG93IGluZGljYXRlcworaW50ZXJmZXJlbmNlIHRvIHRoZSBjaGFubmVsLiAgSGFuZG92ZXIgc2hvdWxkIGJlIG1hZGUuCisKKzIpIEJhZCBRdWFsaXR5CisKK0F2ZXJhZ2VkIFJYUVVBTCBpcyBsb3dlciB0aGFuIGEgdGhyZXNob2xkCisKKzMpIExvdyBMZXZlbCAvIFNpZ25hbCBTdHJlbmd0aAorCitBdmVyYWdlIFJYTEVWIGlzIGxvd2VyIHRoYW4gYSB0aHJlc2hvbGQKKworNCkgRGlzdGFuY2UgSGFuZG92ZXIKKworTVMgaXMgdG9vIGZhciBhd2F5IGZyb20gYSBjZWxsIChtZWFzdXJlZCBieSBUQSkKKworNSkgUG93ZXIgYnVkZ2V0IC8gQmV0dGVyIENlbGwKKworUlggTGV2ZWwgb2YgbmVpZ2hib3IgY2VsbCBpcyBhdCBsZWFzdCAiSE8gTWFyZ2luIGRCIiBkQiBiZXR0ZXIgdGhhbiB0aGUKK2N1cnJlbnQgc2VydmluZyBjZWxsLgorCis9PT0gSWRlYWwgcGFyYW1ldGVycyBmb3IgSE8gYWxnb3JpdGhtID09PQorCitDaGFwdGVyIDgsIFNlY3Rpb24gMi4yLCBUYWJsZSAyNDoKKworV2luZG93IFJYTEVWIGF2ZXJhZ2luZzoJCTEwIFNBQ0NIIGZyYW1lcyAobm8gd2VpZ2h0aW5nKQorV2luZG93IFJYUVVBTCBhdmVyYWdpbmc6CTEgU0FDQ0ggZnJhbWUgKG5vIGF2ZXJhZ2luZykKK0xldmVsIFRocmVhc2hvbGQ6CQkxIG9mIHRoZSBsYXN0IDEgQVYtUlhMRVYgdmFsdWVzIDwgLTExMGRCbQorUXVhbGl0eSBUaHJlc2hvbGQ6CQkzIG9mIHRoZSBsYXN0IDQgQVYtUlhRVUFMIHZhbHVlcyA+PSA1CitJbnRlcmZlcmVuY2UgVGhyZXNob2xkOgkJMSBvZiB0aGUgbGFzdCBBVi1SWExFViA+IC04NSBkQm0gJgorCQkJCTMgb2YgdGhlIGxhc3QgNCBBVi1SWFFVQUwgdmFsdWVzID49IDUKK1Bvd2VyIEJ1ZGdldDoJCQlMZXZlbCBvZiBuZWlnaGJvciBjZWxsID4gMyBkQiBiZXR0ZXIKK1Bvd2VyIEJ1ZGdldCBJbnRlcnZhbDoJCUV2ZXJ5IDYgU0FDQ0ggZnJhbWVzICg2IHNlY29uZHMgPyE/KQorRGlzdGFuY2UgSGFuZG92ZXI6CQlEaXNhYmxlZAorRXZhbHVhdGlvbiBydWxlIDE6CQlSWExFViBvZiB0aGUgY2FuZGlkYXRlIGNlbGwgYSB0bGVhc3QgLTEwNCBkQm0KK0V2YWx1YXRpb24gcnVsZSAyOgkJTGV2ZWwgb2YgY2FuZGlkYXRlIGNlbGwgPiAzZEIgYmV0dGVyIG93biBjZWxsCitUaW1lciBTdWNjZXNzZnVsIEhPOgkJNSBTQUNDSCBmcmFtZXMKK1RpbWVyIFVuc3VjY2Vzc2Z1bCBITzoJCTEgU0FDQ0ggZnJhbWUKKworSW4gYSBub24tZnJlcXVlbmN5IGhvcHBpbmcgY2FzZSwgUlhRVUFMIHRocmVzaG9sZCBjYW4gYmUgZGVjcmVhc2VkIHRvCitSWExFViA+PSA0CisKK1doZW4gZnJlcXVlbmN5IGhvcHBpbmcgaXMgZW5hYmxlZCwgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMKK3Nob3VsZCBiZSBpbnRyb2R1Y2VkOgorCisqIE5vIGludHJhLWNlbGwgaGFuZG92ZXIKKyogVXNlIGEgSE8gTWFyZ2luIG9mIDJkQgorCis9PT0gSGFuZG92ZXIgQ2hhbm5lbCBSZXNlcnZhdGlvbiA9PT0KKworSW4gbG9hZGVkIG5ldHdvcmssIGVhY2ggY2VsbCBzaG91bGQgcmVzZXJ2ZSBzb21lIGNoYW5uZWxzIGZvciBoYW5kb3ZlcnMsCityYXRoZXIgdGhhbiB1c2luZyBhbGwgb2YgdGhlbSBmb3IgbmV3IGNhbGwgZXN0YWJsaXNobWVudC4gIFRoaXMgcmVkdWNlcyB0aGUKK25lZWQgdG8gZHJvcCBjYWxscyBkdWUgdG8gZmFpbGluZyBoYW5kb3ZlcnMsIGF0IHRoZSBleHBlbnNlIG9mIGZhaWxpbmcgbmV3IGNhbGwKK2F0dGVtcHRzLgorCis9PT0gRHluYW1pYyBITyBNYXJnaW4gPT09CisKK1RoZSBoYW5kb3ZlciBtYXJnaW4gKGh5c3RlcmVzaXMpIHNob3VsZCBkZXBlbmQgb24gdGhlIFJYUVVBTC4gT3B0aW1hbCByZXN1bHRzCit3ZXJlIGFjaGlldmVkIHdpdGggdGhlIGZvbGxvd2luZyBzZXR0aW5nczoKKyogUlhRVUFMIDw9IDQ6IDkgZEIKKyogUlhRVUFMID09IDU6IDYgZEIKKyogUlhRVUFMID49IDY6IDEgZEIKKworCisKKz09IEFjdHVhbCBIYW5kb3ZlciBvbiBhIHByb3RvY29sIGxldmVsID09CisKK0FmdGVyIHRoZSBCU0MgaGFzIGRlY2lkZWQgYSBoYW5kb3ZlciBzaGFsbCBiZSBkb25lLCBpdCBoYXMgdG8KKworIyBhbGxvY2F0ZSBhIGNoYW5uZWwgYXQgdGhlIG5ldyBCVFMKKyMgYWxsb2NhdGUgYSBoYW5kb3ZlciByZWZlcmVuY2UKKyMgYWN0aXZhdGUgdGhlIGNoYW5uZWwgb24gdGhlIEJUUyBzaWRlIHVzaW5nIFJTTCBDSEFOTkVMIEFDVElWQVRJT04sCisgIGluZGljYXRpbmcgdGhlIEhPIHJlZmVyZW5jZQorIyBCVFMgcmVzcG9uZHMgd2l0aCBDSEFOIEFDVCBBQ0ssIGluY2x1ZGluZyBHU00gZnJhbWUgbnVtYmVyCisjIEJTQyBzZW5kcyAwNC4wOCBITyBDTUQgdG8gTVMgdXNpbmcgb2xkIEJUUworCmRpZmYgLS1naXQgYS9vcGVuYnNjL2RvYy9vbWwtaW50ZXJmYWNlLnR4dCBiL29wZW5ic2MvZG9jL29tbC1pbnRlcmZhY2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZGNmZWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2RvYy9vbWwtaW50ZXJmYWNlLnR4dApAQCAtMCwwICsxLDIxIEBACitvbWwgaW50ZXJmYWNlIGRlc2lnbiBub3RlcworCitwcm9ibGVtczoKKworKiB0aGVyZSBpcyBubyB3YXkgaG93IHRvIHRhZyBhIGNvbW1hbmQgc2VudCB0byB0aGUgQlRTLCB3aXRoIHRoZSByZXNwb25zZQorICBoYXZpbmcgdGhlIHNhbWUgdGFnIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBjb21tYW5kCisqIHRoZXJlZm9yZSwgd2UgY2FuIGhhdmUgZS5nLiBib3RoIHRoZSBCU0MgYW5kIHRoZSBPTUwgaW50ZXJmYWNlIHNlbmQgYQorICBTRVQgQVRUUklCVVRFIG1lc3NhZ2UsIHdoZXJlIHRoZSByZXNwb25zZXMgd291bGQgZW5kIHVwIGF0IHRoZSB3cm9uZworICBxdWVyeS4KKwordGhlIG9ubHkgcG9zc2libGUgc29sdXRpb25zIGkgY2FuIGltYWdpbmU6CisqIGhhdmUgc29tZSBraW5kIG9mIGV4Y2x1c2l2ZSBsb2NraW5nLCB3aGVyZSB0aGUgT01MIGludGVyZmFjZSBnZXRzIGJsb2NrZWQKKyAgZnJvbSB0aGUgQlNDIGFuZCBpcyBleGNsdXNpdmVseSBhc3NpZ25lZCB0byB0aGUgT01MIGNvbnNvbGUgdW50aWwgYWxsIGNvbW1hbmRzCisgIG9mIHRoZSBPTUwgY29uc29sZSBoYXZlIHRlcm1pbmF0ZWQuICBUaGlzIGNhbiBlaXRoZXIgYmUgZG9uZSBleHBsaWNpdGx5CisgIGR5bmFtaWNhbGx5IG9yIG9uIGRlbWFuZAorCisqIHVzZSB0aGUgT01MIGludGVyZmFjZSBzeW5jaHJvbm91c2x5LCBpLmUuIGFsd2F5cyB3YWl0IGZvciB0aGUgcmVzcG9uc2UgZnJvbQorICB0aGUgQlRTIGJlZm9yZQorCisqIHVuaWxhdGVyYWwgLyB1bnNvbGljaXRlZCBtZXNzYWdlcyBuZWVkIHRvIGJlIGJyb2FkY2FzdGVkIHRvIGJvdGggdGhlIEJTQyBhbmQKKyAgdGhlIE9NTCBjb25zb2xlCmRpZmYgLS1naXQgYS9vcGVuYnNjL2dpdC12ZXJzaW9uLWdlbiBiL29wZW5ic2MvZ2l0LXZlcnNpb24tZ2VuCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYyYWQ0YTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2dpdC12ZXJzaW9uLWdlbgpAQCAtMCwwICsxLDE1MSBAQAorIyEvYmluL3NoCisjIFByaW50IGEgdmVyc2lvbiBzdHJpbmcuCitzY3JpcHR2ZXJzaW9uPTIwMTAtMDEtMjguMDEKKworIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKyMgVGhpcyBzY3JpcHQgaXMgZGVyaXZlZCBmcm9tIEdJVC1WRVJTSU9OLUdFTiBmcm9tIEdJVDogaHR0cDovL2dpdC5vci5jei8uCisjIEl0IG1heSBiZSBydW4gdHdvIHdheXM6CisjIC0gZnJvbSBhIGdpdCByZXBvc2l0b3J5IGluIHdoaWNoIHRoZSAiZ2l0IGRlc2NyaWJlIiBjb21tYW5kIGJlbG93CisjICAgcHJvZHVjZXMgdXNlZnVsIG91dHB1dCAodGh1cyByZXF1aXJpbmcgYXQgbGVhc3Qgb25lIHNpZ25lZCB0YWcpCisjIC0gZnJvbSBhIG5vbi1naXQtcmVwbyBkaXJlY3RvcnkgY29udGFpbmluZyBhIC50YXJiYWxsLXZlcnNpb24gZmlsZSwgd2hpY2gKKyMgICBwcmVzdW1lcyB0aGlzIHNjcmlwdCBpcyBpbnZva2VkIGxpa2UgIi4vZ2l0LXZlcnNpb24tZ2VuIC50YXJiYWxsLXZlcnNpb24iLgorCisjIEluIG9yZGVyIHRvIHVzZSBpbnRyYS12ZXJzaW9uIHN0cmluZ3MgaW4geW91ciBwcm9qZWN0LCB5b3Ugd2lsbCBuZWVkIHR3bworIyBzZXBhcmF0ZSBnZW5lcmF0ZWQgdmVyc2lvbiBzdHJpbmcgZmlsZXM6CisjCisjIC50YXJiYWxsLXZlcnNpb24gLSBwcmVzZW50IG9ubHkgaW4gYSBkaXN0cmlidXRpb24gdGFyYmFsbCwgYW5kIG5vdCBpbgorIyAgIGEgY2hlY2tlZC1vdXQgcmVwb3NpdG9yeS4gIENyZWF0ZWQgd2l0aCBjb250ZW50cyB0aGF0IHdlcmUgbGVhcm5lZCBhdAorIyAgIHRoZSBsYXN0IHRpbWUgYXV0b2NvbmYgd2FzIHJ1biwgYW5kIHVzZWQgYnkgZ2l0LXZlcnNpb24tZ2VuLiAgTXVzdCBub3QKKyMgICBiZSBwcmVzZW50IGluIGVpdGhlciAkKHNyY2Rpcikgb3IgJChidWlsZGRpcikgZm9yIGdpdC12ZXJzaW9uLWdlbiB0bworIyAgIGdpdmUgYWNjdXJhdGUgYW5zd2VycyBkdXJpbmcgbm9ybWFsIGRldmVsb3BtZW50IHdpdGggYSBjaGVja2VkIG91dCB0cmVlLAorIyAgIGJ1dCBtdXN0IGJlIHByZXNlbnQgaW4gYSB0YXJiYWxsIHdoZW4gdGhlcmUgaXMgbm8gdmVyc2lvbiBjb250cm9sIHN5c3RlbS4KKyMgICBUaGVyZWZvcmUsIGl0IGNhbm5vdCBiZSB1c2VkIGluIGFueSBkZXBlbmRlbmNpZXMuICBHTlVtYWtlZmlsZSBoYXMKKyMgICBob29rcyB0byBmb3JjZSBhIHJlY29uZmlndXJlIGF0IGRpc3RyaWJ1dGlvbiB0aW1lIHRvIGdldCB0aGUgdmFsdWUKKyMgICBjb3JyZWN0LCB3aXRob3V0IHBlbmFsaXppbmcgbm9ybWFsIGRldmVsb3BtZW50IHdpdGggZXh0cmEgcmVjb25maWd1cmVzLgorIworIyAudmVyc2lvbiAtIHByZXNlbnQgaW4gYSBjaGVja2VkLW91dCByZXBvc2l0b3J5IGFuZCBpbiBhIGRpc3RyaWJ1dGlvbgorIyAgIHRhcmJhbGwuICBVc2FibGUgaW4gZGVwZW5kZW5jaWVzLCBwYXJ0aWN1bGFybHkgZm9yIGZpbGVzIHRoYXQgZG9uJ3QKKyMgICB3YW50IHRvIGRlcGVuZCBvbiBjb25maWcuaCBidXQgZG8gd2FudCB0byB0cmFjayB2ZXJzaW9uIGNoYW5nZXMuCisjICAgRGVsZXRlIHRoaXMgZmlsZSBwcmlvciB0byBhbnkgYXV0b2NvbmYgcnVuIHdoZXJlIHlvdSB3YW50IHRvIHJlYnVpbGQKKyMgICBmaWxlcyB0byBwaWNrIHVwIGEgdmVyc2lvbiBzdHJpbmcgY2hhbmdlOyBhbmQgbGVhdmUgaXQgc3RhbGUgdG8KKyMgICBtaW5pbWl6ZSByZWJ1aWxkIHRpbWUgYWZ0ZXIgdW5yZWxhdGVkIGNoYW5nZXMgdG8gY29uZmlndXJlIHNvdXJjZXMuCisjCisjIEl0IGlzIHByb2JhYmx5IHdpc2UgdG8gYWRkIHRoZXNlIHR3byBmaWxlcyB0byAuZ2l0aWdub3JlLCBzbyB0aGF0IHlvdQorIyBkb24ndCBhY2NpZGVudGFsbHkgY29tbWl0IGVpdGhlciBnZW5lcmF0ZWQgZmlsZS4KKyMKKyMgVXNlIHRoZSBmb2xsb3dpbmcgbGluZSBpbiB5b3VyIGNvbmZpZ3VyZS5hYywgc28gdGhhdCAkKFZFUlNJT04pIHdpbGwKKyMgYXV0b21hdGljYWxseSBiZSB1cC10by1kYXRlIGVhY2ggdGltZSBjb25maWd1cmUgaXMgcnVuIChhbmQgbm90ZSB0aGF0CisjIHNpbmNlIGNvbmZpZ3VyZS5hYyBubyBsb25nZXIgaW5jbHVkZXMgYSB2ZXJzaW9uIHN0cmluZywgTWFrZWZpbGUgcnVsZXMKKyMgc2hvdWxkIG5vdCBkZXBlbmQgb24gY29uZmlndXJlLmFjIGZvciB2ZXJzaW9uIHVwZGF0ZXMpLgorIworIyBBQ19JTklUKFtHTlUgcHJvamVjdF0sCisjICAgICAgICAgbTRfZXN5c2NtZChbYnVpbGQtYXV4L2dpdC12ZXJzaW9uLWdlbiAudGFyYmFsbC12ZXJzaW9uXSksCisjICAgICAgICAgW2J1Zy1wcm9qZWN0QGV4YW1wbGVdKQorIworIyBUaGVuIHVzZSB0aGUgZm9sbG93aW5nIGxpbmVzIGluIHlvdXIgTWFrZWZpbGUuYW0sIHNvIHRoYXQgLnZlcnNpb24KKyMgd2lsbCBiZSBwcmVzZW50IGZvciBkZXBlbmRlbmNpZXMsIGFuZCBzbyB0aGF0IC50YXJiYWxsLXZlcnNpb24gd2lsbAorIyBleGlzdCBpbiBkaXN0cmlidXRpb24gdGFyYmFsbHMuCisjCisjIEJVSUxUX1NPVVJDRVMgPSAkKHRvcF9zcmNkaXIpLy52ZXJzaW9uCisjICQodG9wX3NyY2RpcikvLnZlcnNpb246CisjCWVjaG8gJChWRVJTSU9OKSA+ICRALXQgJiYgbXYgJEAtdCAkQAorIyBkaXN0LWhvb2s6CisjCWVjaG8gJChWRVJTSU9OKSA+ICQoZGlzdGRpcikvLnRhcmJhbGwtdmVyc2lvbgorCitjYXNlICQjIGluCisgICAgMSkgOzsKKyAgICAqKSBlY2hvIDE+JjIgIlVzYWdlOiAkMCBcJHNyY2Rpci8udGFyYmFsbC12ZXJzaW9uIjsgZXhpdCAxOzsKK2VzYWMKKwordGFyYmFsbF92ZXJzaW9uX2ZpbGU9JDEKK25sPScKKycKKworIyBGaXJzdCBzZWUgaWYgdGhlcmUgaXMgYSB0YXJiYWxsLW9ubHkgdmVyc2lvbiBmaWxlLgorIyB0aGVuIHRyeSAiZ2l0IGRlc2NyaWJlIiwgdGhlbiBkZWZhdWx0LgoraWYgdGVzdCAtZiAkdGFyYmFsbF92ZXJzaW9uX2ZpbGUKK3RoZW4KKyAgICB2PWBjYXQgJHRhcmJhbGxfdmVyc2lvbl9maWxlYCB8fCBleGl0IDEKKyAgICBjYXNlICR2IGluCisJKiRubCopIHY9IDs7ICMgcmVqZWN0IG11bHRpLWxpbmUgb3V0cHV0CisJWzAtOV0qKSA7OworCSopIHY9IDs7CisgICAgZXNhYworICAgIHRlc3QgLXogIiR2IiBcCisJJiYgZWNobyAiJDA6IFdBUk5JTkc6ICR0YXJiYWxsX3ZlcnNpb25fZmlsZSBzZWVtcyB0byBiZSBkYW1hZ2VkIiAxPiYyCitmaQorCitpZiB0ZXN0IC1uICIkdiIKK3RoZW4KKyAgICA6ICMgdXNlICR2CitlbGlmIHRlc3QgLWQgLi8uLi8uZ2l0IFwKKyAgICAmJiB2PWBnaXQgZGVzY3JpYmUgLS1hYmJyZXY9NCAtLW1hdGNoPSd2KicgSEVBRCAyPi9kZXYvbnVsbCBcCisJICB8fCBnaXQgZGVzY3JpYmUgLS1hYmJyZXY9NCBIRUFEIDI+L2Rldi9udWxsYCBcCisgICAgJiYgY2FzZSAkdiBpbgorCSBbMC05XSopIDs7CisJIHZbMC05XSopIDs7CisJICopIChleGl0IDEpIDs7CisgICAgICAgZXNhYwordGhlbgorICAgICMgSXMgdGhpcyBhIG5ldyBnaXQgdGhhdCBsaXN0cyBudW1iZXIgb2YgY29tbWl0cyBzaW5jZSB0aGUgbGFzdAorICAgICMgdGFnIG9yIHRoZSBwcmV2aW91cyBvbGRlciB2ZXJzaW9uIHRoYXQgZGlkIG5vdD8KKyAgICAjICAgTmV3ZXI6IHY2LjEwLTc3LWcwZjhmYWViCisgICAgIyAgIE9sZGVyOiB2Ni4xMC1nMGY4ZmFlYgorICAgIGNhc2UgJHYgaW4KKwkqLSotKikgOiBnaXQgZGVzY3JpYmUgaXMgb2theSB0aHJlZSBwYXJ0IGZsYXZvciA7OworCSotKikKKwkgICAgOiBnaXQgZGVzY3JpYmUgaXMgb2xkZXIgdHdvIHBhcnQgZmxhdm9yCisJICAgICMgUmVjcmVhdGUgdGhlIG51bWJlciBvZiBjb21taXRzIGFuZCByZXdyaXRlIHN1Y2ggdGhhdCB0aGUKKwkgICAgIyByZXN1bHQgaXMgdGhlIHNhbWUgYXMgaWYgd2Ugd2VyZSB1c2luZyB0aGUgbmV3ZXIgdmVyc2lvbgorCSAgICAjIG9mIGdpdCBkZXNjcmliZS4KKwkgICAgdnRhZz1gZWNobyAiJHYiIHwgc2VkICdzLy0uKi8vJ2AKKwkgICAgbnVtY29tbWl0cz1gZ2l0IHJldi1saXN0ICIkdnRhZyIuLkhFQUQgfCB3YyAtbGAKKwkgICAgdj1gZWNobyAiJHYiIHwgc2VkICJzL1woLipcKS1cKC4qXCkvXDEtJG51bWNvbW1pdHMtXDIvImA7CisJICAgIDs7CisgICAgZXNhYworCisgICAgIyBDaGFuZ2UgdGhlIGZpcnN0ICctJyB0byBhICcuJywgc28gdmVyc2lvbi1jb21wYXJpbmcgdG9vbHMgd29yayBwcm9wZXJseS4KKyAgICAjIFJlbW92ZSB0aGUgImciIGluIGdpdCBkZXNjcmliZSdzIG91dHB1dCBzdHJpbmcsIHRvIHNhdmUgYSBieXRlLgorICAgIHY9YGVjaG8gIiR2IiB8IHNlZCAncy8tLy4vO3MvXCguKlwpLWcvXDEtLydgOworZWxzZQorICAgIHY9VU5LTk9XTgorZmkKKwordj1gZWNobyAiJHYiIHxzZWQgJ3MvXnYvLydgCisKKyMgRG9uJ3QgZGVjbGFyZSBhIHZlcnNpb24gImRpcnR5IiBtZXJlbHkgYmVjYXVzZSBhIHRpbWUgc3RhbXAgaGFzIGNoYW5nZWQuCitnaXQgc3RhdHVzID4gL2Rldi9udWxsIDI+JjEKKworZGlydHk9YHNoIC1jICdnaXQgZGlmZi1pbmRleCAtLW5hbWUtb25seSBIRUFEJyAyPi9kZXYvbnVsbGAgfHwgZGlydHk9CitjYXNlICIkZGlydHkiIGluCisgICAgJycpIDs7CisgICAgKikgIyBBcHBlbmQgdGhlIHN1ZmZpeCBvbmx5IGlmIHRoZXJlIGlzbid0IG9uZSBhbHJlYWR5LgorCWNhc2UgJHYgaW4KKwkgICotZGlydHkpIDs7CisJICAqKSB2PSIkdi1kaXJ0eSIgOzsKKwllc2FjIDs7Citlc2FjCisKKyMgT21pdCB0aGUgdHJhaWxpbmcgbmV3bGluZSwgc28gdGhhdCBtNF9lc3lzY21kIGNhbiB1c2UgdGhlIHJlc3VsdCBkaXJlY3RseS4KK2VjaG8gIiR2IiB8IHRyIC1kICdcMDEyJworCisjIExvY2FsIHZhcmlhYmxlczoKKyMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQorIyB0aW1lLXN0YW1wLXN0YXJ0OiAic2NyaXB0dmVyc2lvbj0iCisjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgorIyB0aW1lLXN0YW1wLWVuZDogIiQiCisjIEVuZDoKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9NYWtlZmlsZS5hbSBiL29wZW5ic2MvaW5jbHVkZS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmIyYTMzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMyBAQAorU1VCRElSUyA9IG9wZW5ic2MgdnR5IHNjY3AKKworbm9pbnN0X0hFQURFUlMgPSBtSVNETmlmLmggY29tcGF0X2FmX2lzZG4uaApkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL2NvbXBhdF9hZl9pc2RuLmggYi9vcGVuYnNjL2luY2x1ZGUvY29tcGF0X2FmX2lzZG4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmNiZmIzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL2NvbXBhdF9hZl9pc2RuLmgKQEAgLTAsMCArMSwzOSBAQAorI2lmZGVmIE1JU0ROX09MRF9BRl9DT01QQVRJQklMSVRZCisjdW5kZWYgQUZfSVNETgorI3VuZGVmIFBGX0lTRE4KKworZXh0ZXJuCWludAlBRl9JU0ROOworI2RlZmluZSBQRl9JU0ROCUFGX0lTRE4KKworaW50CUFGX0lTRE47CisKKyNlbmRpZgorCitleHRlcm4gdm9pZCBpbml0X2FmX2lzZG4odm9pZCk7CisKKyNpZmRlZiBBRl9DT01QQVRJQklMSVRZX0ZVTkMKKyNpZmRlZiBNSVNETl9PTERfQUZfQ09NUEFUSUJJTElUWQordm9pZCBpbml0X2FmX2lzZG4odm9pZCkKK3sKKwlpbnQJczsKKworCS8qIHRlc3QgZm9yIG5ldyB2YWx1ZSAqLworCUFGX0lTRE4gPSAzNDsKKwlzID0gc29ja2V0KEFGX0lTRE4sIFNPQ0tfUkFXLCBJU0ROX1BfQkFTRSk7CisJaWYgKHMgPj0gMCkgeworCQljbG9zZShzKTsKKwkJcmV0dXJuOworCX0KKwlBRl9JU0ROID0gMjc7CisJcyA9IHNvY2tldChBRl9JU0ROLCBTT0NLX1JBVywgSVNETl9QX0JBU0UpOworCWlmIChzID49IDApIHsKKwkJY2xvc2Uocyk7CisJCXJldHVybjsKKwl9Cit9CisjZWxzZQordm9pZCBpbml0X2FmX2lzZG4odm9pZCkKK3sKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvbUlTRE5pZi5oIGIvb3BlbmJzYy9pbmNsdWRlL21JU0ROaWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTA2NWQyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL21JU0ROaWYuaApAQCAtMCwwICsxLDM4NyBAQAorLyoKKyAqCisgKiBBdXRob3IJS2Fyc3RlbiBLZWlsIDxra2VpbEBub3ZlbGwuY29tPgorICoKKyAqIENvcHlyaWdodCAyMDA4ICBieSBLYXJzdGVuIEtlaWwgPGtrZWlsQG5vdmVsbC5jb20+CisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExFU1NFUiBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgKiB2ZXJzaW9uIDIuMSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTEVTU0VSIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBtSVNETklGX0gKKyNkZWZpbmUgbUlTRE5JRl9ICisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpZmRlZiBsaW51eAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNlbHNlCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2Vycm5vLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2VuZGlmCisKKy8qCisgKiBBQkkgVmVyc2lvbiAzMiBiaXQKKyAqCisgKiA8OCBiaXQ+IE1ham9yIHZlcnNpb24KKyAqCQktIGNoYW5nZWQgaWYgYW55IGludGVyZmFjZSBiZWNvbWUgYmFja3dhcmRzIGluY29tcGF0aWJsZQorICoKKyAqIDw4IGJpdD4gTWlub3IgdmVyc2lvbgorICogICAgICAgICAgICAgIC0gY2hhbmdlZCBpZiBhbnkgaW50ZXJmYWNlIGlzIGV4dGVuZGVkIGJ1dCBiYWNrd2FyZHMgY29tcGF0aWJsZQorICoKKyAqIDwxNiBiaXQ+IFJlbGVhc2UgbnVtYmVyCisgKiAgICAgICAgICAgICAgLSBzaG91bGQgYmUgaW5jcmVtZW50ZWQgb24gZXZlcnkgY2hlY2tpbgorICovCisjZGVmaW5lCU1JU0ROX01BSk9SX1ZFUlNJT04JMQorI2RlZmluZQlNSVNETl9NSU5PUl9WRVJTSU9OCTEKKyNkZWZpbmUgTUlTRE5fUkVMRUFTRQkJMjAKKworLyogcHJpbWl0aXZlcyBmb3IgaW5mb3JtYXRpb24gZXhjaGFuZ2UKKyAqIGdlbmVyZWxsIGZvcm1hdAorICogPDE2ICBiaXQgIDAgPgorICogPDggIGJpdCBjb21tYW5kPgorICogICAgQklUIDggPSAxIExBWUVSIHByaXZhdGUKKyAqICAgIEJJVCA3ID0gMSBhbnN3ZXIKKyAqICAgIEJJVCA2ID0gMSBEQVRBCisgKiA8OCAgYml0IHRhcmdldCBsYXllciBtYXNrPgorICoKKyAqIExheWVyID0gMDAgaXMgcmVzZXJ2ZWQgZm9yIGdlbmVyYWwgY29tbWFuZHMKKyAgIExheWVyID0gMDEgIEwyIC0+IEhXCisgICBMYXllciA9IDAyICBIVyAtPiBMMgorICAgTGF5ZXIgPSAwNCAgTDMgLT4gTDIKKyAgIExheWVyID0gMDggIEwyIC0+IEwzCisgKiBMYXllciA9IEZGIGlzIHJlc2VydmVkIGZvciBicm9hZGNhc3QgY29tbWFuZHMKKyAqLworCisjZGVmaW5lIE1JU0ROX0NNRE1BU0sJCTB4ZmYwMAorI2RlZmluZSBNSVNETl9MQVlFUk1BU0sJCTB4MDBmZgorCisvKiBnZW5lcmVsbCBjb21tYW5kcyAqLworI2RlZmluZSBPUEVOX0NIQU5ORUwJCTB4MDEwMAorI2RlZmluZSBDTE9TRV9DSEFOTkVMCQkweDAyMDAKKyNkZWZpbmUgQ09OVFJPTF9DSEFOTkVMCQkweDAzMDAKKyNkZWZpbmUgQ0hFQ0tfREFUQQkJMHgwNDAwCisKKy8qIGxheWVyIDIgLT4gbGF5ZXIgMSAqLworI2RlZmluZSBQSF9BQ1RJVkFURV9SRVEJCTB4MDEwMQorI2RlZmluZSBQSF9ERUFDVElWQVRFX1JFUQkweDAyMDEKKyNkZWZpbmUgUEhfREFUQV9SRVEJCTB4MjAwMQorI2RlZmluZSBNUEhfQUNUSVZBVEVfUkVRCTB4MDUwMQorI2RlZmluZSBNUEhfREVBQ1RJVkFURV9SRVEJMHgwNjAxCisjZGVmaW5lIE1QSF9JTkZPUk1BVElPTl9SRVEJMHgwNzAxCisjZGVmaW5lIFBIX0NPTlRST0xfUkVRCQkweDA4MDEKKworLyogbGF5ZXIgMSAtPiBsYXllciAyICovCisjZGVmaW5lIFBIX0FDVElWQVRFX0lORAkJMHgwMTAyCisjZGVmaW5lIFBIX0FDVElWQVRFX0NORgkJMHg0MTAyCisjZGVmaW5lIFBIX0RFQUNUSVZBVEVfSU5ECTB4MDIwMgorI2RlZmluZSBQSF9ERUFDVElWQVRFX0NORgkweDQyMDIKKyNkZWZpbmUgUEhfREFUQV9JTkQJCTB4MjAwMgorI2RlZmluZSBQSF9EQVRBX0VfSU5ECQkweDMwMDIKKyNkZWZpbmUgTVBIX0FDVElWQVRFX0lORAkweDA1MDIKKyNkZWZpbmUgTVBIX0RFQUNUSVZBVEVfSU5ECTB4MDYwMgorI2RlZmluZSBNUEhfSU5GT1JNQVRJT05fSU5ECTB4MDcwMgorI2RlZmluZSBQSF9EQVRBX0NORgkJMHg2MDAyCisjZGVmaW5lIFBIX0NPTlRST0xfSU5ECQkweDA4MDIKKyNkZWZpbmUgUEhfQ09OVFJPTF9DTkYJCTB4NDgwMgorCisvKiBsYXllciAzIC0+IGxheWVyIDIgKi8KKyNkZWZpbmUgRExfRVNUQUJMSVNIX1JFUQkweDEwMDQKKyNkZWZpbmUgRExfUkVMRUFTRV9SRVEJCTB4MTEwNAorI2RlZmluZSBETF9EQVRBX1JFUQkJMHgzMDA0CisjZGVmaW5lIERMX1VOSVREQVRBX1JFUQkJMHgzMTA0CisjZGVmaW5lIERMX0lORk9STUFUSU9OX1JFUQkweDAwMDQKKworLyogbGF5ZXIgMiAtPiBsYXllciAzICovCisjZGVmaW5lIERMX0VTVEFCTElTSF9JTkQJMHgxMDA4CisjZGVmaW5lIERMX0VTVEFCTElTSF9DTkYJMHg1MDA4CisjZGVmaW5lIERMX1JFTEVBU0VfSU5ECQkweDExMDgKKyNkZWZpbmUgRExfUkVMRUFTRV9DTkYJCTB4NTEwOAorI2RlZmluZSBETF9EQVRBX0lORAkJMHgzMDA4CisjZGVmaW5lIERMX1VOSVREQVRBX0lORAkJMHgzMTA4CisjZGVmaW5lIERMX0lORk9STUFUSU9OX0lORAkweDAwMDgKKworLyogaW50ZXJuIGxheWVyIDIgbWFuYWdtZW50ICovCisjZGVmaW5lIE1ETF9BU1NJR05fUkVRCQkweDE4MDQKKyNkZWZpbmUgTURMX0FTU0lHTl9JTkQJCTB4MTkwNAorI2RlZmluZSBNRExfUkVNT1ZFX1JFUQkJMHgxQTA0CisjZGVmaW5lIE1ETF9SRU1PVkVfSU5ECQkweDFCMDQKKyNkZWZpbmUgTURMX1NUQVRVU19VUF9JTkQJMHgxQzA0CisjZGVmaW5lIE1ETF9TVEFUVVNfRE9XTl9JTkQJMHgxRDA0CisjZGVmaW5lIE1ETF9TVEFUVVNfVUlfSU5ECTB4MUUwNAorI2RlZmluZSBNRExfRVJST1JfSU5ECQkweDFGMDQKKyNkZWZpbmUgTURMX0VSUk9SX1JTUAkJMHg1RjA0CisKKy8qIERMX0lORk9STUFUSU9OX0lORCB0eXBlcyAqLworI2RlZmluZSBETF9JTkZPX0wyX0NPTk5FQ1QJMHgwMDAxCisjZGVmaW5lIERMX0lORk9fTDJfUkVNT1ZFRAkweDAwMDIKKworLyogUEhfQ09OVFJPTCB0eXBlcyAqLworLyogVE9VQ0ggVE9ORSBJUyAweDIwWFggIFhYICIwIi4uLiI5IiwgIkEiLCJCIiwiQyIsIkQiLCIqIiwiIyIgKi8KKyNkZWZpbmUgRFRNRl9UT05FX1ZBTAkJMHgyMDAwCisjZGVmaW5lIERUTUZfVE9ORV9NQVNLCQkweDAwN0YKKyNkZWZpbmUgRFRNRl9UT05FX1NUQVJUCQkweDIxMDAKKyNkZWZpbmUgRFRNRl9UT05FX1NUT1AJCTB4MjIwMAorI2RlZmluZSBEVE1GX0hGQ19DT0VGCQkweDQwMDAKKyNkZWZpbmUgRFNQX0NPTkZfSk9JTgkJMHgyNDAzCisjZGVmaW5lIERTUF9DT05GX1NQTElUCQkweDI0MDQKKyNkZWZpbmUgRFNQX1JFQ0VJVkVfT0ZGCQkweDI0MDUKKyNkZWZpbmUgRFNQX1JFQ0VJVkVfT04JCTB4MjQwNgorI2RlZmluZSBEU1BfRUNIT19PTgkJMHgyNDA3CisjZGVmaW5lIERTUF9FQ0hPX09GRgkJMHgyNDA4CisjZGVmaW5lIERTUF9NSVhfT04JCTB4MjQwOQorI2RlZmluZSBEU1BfTUlYX09GRgkJMHgyNDBhCisjZGVmaW5lIERTUF9ERUxBWQkJMHgyNDBiCisjZGVmaW5lIERTUF9KSVRURVIJCTB4MjQwYworI2RlZmluZSBEU1BfVFhEQVRBX09OCQkweDI0MGQKKyNkZWZpbmUgRFNQX1RYREFUQV9PRkYJCTB4MjQwZQorI2RlZmluZSBEU1BfVFhfREVKSVRURVIJCTB4MjQwZgorI2RlZmluZSBEU1BfVFhfREVKX09GRgkJMHgyNDEwCisjZGVmaW5lIERTUF9UT05FX1BBVFRfT04JMHgyNDExCisjZGVmaW5lIERTUF9UT05FX1BBVFRfT0ZGCTB4MjQxMgorI2RlZmluZSBEU1BfVk9MX0NIQU5HRV9UWAkweDI0MTMKKyNkZWZpbmUgRFNQX1ZPTF9DSEFOR0VfUlgJMHgyNDE0CisjZGVmaW5lIERTUF9CRl9FTkFCTEVfS0VZCTB4MjQxNQorI2RlZmluZSBEU1BfQkZfRElTQUJMRQkJMHgyNDE2CisjZGVmaW5lIERTUF9CRl9BQ0NFUFQJCTB4MjQxNgorI2RlZmluZSBEU1BfQkZfUkVKRUNUCQkweDI0MTcKKyNkZWZpbmUgRFNQX1BJUEVMSU5FX0NGRwkweDI0MTgKKyNkZWZpbmUgSEZDX1ZPTF9DSEFOR0VfVFgJMHgyNjAxCisjZGVmaW5lIEhGQ19WT0xfQ0hBTkdFX1JYCTB4MjYwMgorI2RlZmluZSBIRkNfU1BMX0xPT1BfT04JCTB4MjYwMworI2RlZmluZSBIRkNfU1BMX0xPT1BfT0ZGCTB4MjYwNAorCisvKiBEU1BfVE9ORV9QQVRUX09OIHBhcmFtZXRlciAqLworI2RlZmluZSBUT05FX09GRgkJCTB4MDAwMAorI2RlZmluZSBUT05FX0dFUk1BTl9ESUFMVE9ORQkJMHgwMDAxCisjZGVmaW5lIFRPTkVfR0VSTUFOX09MRERJQUxUT05FCQkweDAwMDIKKyNkZWZpbmUgVE9ORV9BTUVSSUNBTl9ESUFMVE9ORQkJMHgwMDAzCisjZGVmaW5lIFRPTkVfR0VSTUFOX0RJQUxQQlgJCTB4MDAwNAorI2RlZmluZSBUT05FX0dFUk1BTl9PTERESUFMUEJYCQkweDAwMDUKKyNkZWZpbmUgVE9ORV9BTUVSSUNBTl9ESUFMUEJYCQkweDAwMDYKKyNkZWZpbmUgVE9ORV9HRVJNQU5fUklOR0lORwkJMHgwMDA3CisjZGVmaW5lIFRPTkVfR0VSTUFOX09MRFJJTkdJTkcJCTB4MDAwOAorI2RlZmluZSBUT05FX0FNRVJJQ0FOX1JJTkdQQlgJCTB4MDAwYgorI2RlZmluZSBUT05FX0dFUk1BTl9SSU5HUEJYCQkweDAwMGMKKyNkZWZpbmUgVE9ORV9HRVJNQU5fT0xEUklOR1BCWAkJMHgwMDBkCisjZGVmaW5lIFRPTkVfQU1FUklDQU5fUklOR0lORwkJMHgwMDBlCisjZGVmaW5lIFRPTkVfR0VSTUFOX0JVU1kJCTB4MDAwZgorI2RlZmluZSBUT05FX0dFUk1BTl9PTERCVVNZCQkweDAwMTAKKyNkZWZpbmUgVE9ORV9BTUVSSUNBTl9CVVNZCQkweDAwMTEKKyNkZWZpbmUgVE9ORV9HRVJNQU5fSEFOR1VQCQkweDAwMTIKKyNkZWZpbmUgVE9ORV9HRVJNQU5fT0xESEFOR1VQCQkweDAwMTMKKyNkZWZpbmUgVE9ORV9BTUVSSUNBTl9IQU5HVVAJCTB4MDAxNAorI2RlZmluZSBUT05FX1NQRUNJQUxfSU5GTwkJMHgwMDE1CisjZGVmaW5lIFRPTkVfR0VSTUFOX0dBU1NFTkJFU0VUWlQJMHgwMDE2CisjZGVmaW5lIFRPTkVfR0VSTUFOX0FVRlNDSEFMVFRPTgkweDAwMTYKKworLyogTVBIX0lORk9STUFUSU9OX0lORCAqLworI2RlZmluZSBMMV9TSUdOQUxfTE9TX09GRgkweDAwMTAKKyNkZWZpbmUgTDFfU0lHTkFMX0xPU19PTgkweDAwMTEKKyNkZWZpbmUgTDFfU0lHTkFMX0FJU19PRkYJMHgwMDEyCisjZGVmaW5lIEwxX1NJR05BTF9BSVNfT04JMHgwMDEzCisjZGVmaW5lIEwxX1NJR05BTF9SRElfT0ZGCTB4MDAxNAorI2RlZmluZSBMMV9TSUdOQUxfUkRJX09OCTB4MDAxNQorI2RlZmluZSBMMV9TSUdOQUxfU0xJUF9SWAkweDAwMjAKKyNkZWZpbmUgTDFfU0lHTkFMX1NMSVBfVFgJMHgwMDIxCisKKy8qCisgKiBwcm90b2NvbCBpZHMKKyAqIEQgY2hhbm5lbCAxLTMxCisgKiBCIGNoYW5uZWwgMzMgLSA2MworICovCisKKyNkZWZpbmUgSVNETl9QX05PTkUJCTAKKyNkZWZpbmUgSVNETl9QX0JBU0UJCTAKKyNkZWZpbmUgSVNETl9QX1RFX1MwCQkweDAxCisjZGVmaW5lIElTRE5fUF9OVF9TMCAgCQkweDAyCisjZGVmaW5lIElTRE5fUF9URV9FMQkJMHgwMworI2RlZmluZSBJU0ROX1BfTlRfRTEgIAkJMHgwNAorI2RlZmluZSBJU0ROX1BfVEVfVVAwCQkweDA1CisjZGVmaW5lIElTRE5fUF9OVF9VUDAJCTB4MDYKKworI2RlZmluZSBJU19JU0ROX1BfVEUocCkgKChwID09IElTRE5fUF9URV9TMCkgfHwgKHAgPT0gSVNETl9QX1RFX0UxKSB8fCBcCisJCQkJKHAgPT0gSVNETl9QX1RFX1VQMCkgfHwgKHAgPT0gSVNETl9QX0xBUERfVEUpKQorI2RlZmluZSBJU19JU0ROX1BfTlQocCkgKChwID09IElTRE5fUF9OVF9TMCkgfHwgKHAgPT0gSVNETl9QX05UX0UxKSB8fCBcCisJCQkJKHAgPT0gSVNETl9QX05UX1VQMCkgfHwgKHAgPT0gSVNETl9QX0xBUERfTlQpKQorI2RlZmluZSBJU19JU0ROX1BfUzAocCkgKChwID09IElTRE5fUF9URV9TMCkgfHwgKHAgPT0gSVNETl9QX05UX1MwKSkKKyNkZWZpbmUgSVNfSVNETl9QX0UxKHApICgocCA9PSBJU0ROX1BfVEVfRTEpIHx8IChwID09IElTRE5fUF9OVF9FMSkpCisjZGVmaW5lIElTX0lTRE5fUF9VUDAocCkgKChwID09IElTRE5fUF9URV9VUDApIHx8IChwID09IElTRE5fUF9OVF9VUDApKQorCisKKyNkZWZpbmUgSVNETl9QX0xBUERfVEUJCTB4MTAKKyNkZWZpbmUJSVNETl9QX0xBUERfTlQJCTB4MTEKKworI2RlZmluZSBJU0ROX1BfQl9NQVNLCQkweDFmCisjZGVmaW5lIElTRE5fUF9CX1NUQVJUCQkweDIwCisKKyNkZWZpbmUgSVNETl9QX0JfUkFXCQkweDIxCisjZGVmaW5lIElTRE5fUF9CX0hETEMJCTB4MjIKKyNkZWZpbmUgSVNETl9QX0JfWDc1U0xQCQkweDIzCisjZGVmaW5lIElTRE5fUF9CX0wyRFRNRgkJMHgyNAorI2RlZmluZSBJU0ROX1BfQl9MMkRTUAkJMHgyNQorI2RlZmluZSBJU0ROX1BfQl9MMkRTUEhETEMJMHgyNgorCisjZGVmaW5lIE9QVElPTl9MMl9QTVgJCTEKKyNkZWZpbmUgT1BUSU9OX0wyX1BUUAkJMgorI2RlZmluZSBPUFRJT05fTDJfRklYRURURUkJMworI2RlZmluZSBPUFRJT05fTDJfQ0xFQU5VUAk0CisKKy8qIHNob3VsZCBiZSBpbiBzeW5jIHdpdGggbGludXgva29iamVjdC5oOktPQkpfTkFNRV9MRU4gKi8KKyNkZWZpbmUgTUlTRE5fTUFYX0lETEVOCQkyMAorCitzdHJ1Y3QgbUlTRE5oZWFkIHsKKwl1bnNpZ25lZCBpbnQJcHJpbTsKKwl1bnNpZ25lZCBpbnQJaWQ7Cit9ICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2RlZmluZSBNSVNETl9IRUFERVJfTEVOCXNpemVvZihzdHJ1Y3QgbUlTRE5oZWFkKQorI2RlZmluZSBNQVhfREFUQV9TSVpFCQkyMDQ4CisjZGVmaW5lIE1BWF9EQVRBX01FTQkJKE1BWF9EQVRBX1NJWkUgKyBNSVNETl9IRUFERVJfTEVOKQorI2RlZmluZSBNQVhfREZSQU1FX0xFTgkJMjYwCisKKyNkZWZpbmUgTUlTRE5fSURfQUREUl9NQVNLCTB4RkZGRgorI2RlZmluZSBNSVNETl9JRF9URUlfTUFTSwkweEZGMDAKKyNkZWZpbmUgTUlTRE5fSURfU0FQSV9NQVNLCTB4MDBGRgorI2RlZmluZSBNSVNETl9JRF9URUlfQU5ZCTB4N0YwMAorCisjZGVmaW5lIE1JU0ROX0lEX0FOWQkJMHhGRkZGCisjZGVmaW5lIE1JU0ROX0lEX05PTkUJCTB4RkZGRQorCisjZGVmaW5lIEdST1VQX1RFSQkJMTI3CisjZGVmaW5lIFRFSV9TQVBJCQk2MworI2RlZmluZSBDVFJMX1NBUEkJCTAKKworI2RlZmluZSBNSVNETl9NQVhfQ0hBTk5FTAkxMjcKKyNkZWZpbmUgTUlTRE5fQ0hNQVBfU0laRQkoKE1JU0ROX01BWF9DSEFOTkVMICsgMSkgPj4gMykKKworI2RlZmluZSBTT0xfTUlTRE4JMAorCitzdHJ1Y3Qgc29ja2FkZHJfbUlTRE4geworCXNhX2ZhbWlseV90ICAgIGZhbWlseTsKKwl1bnNpZ25lZCBjaGFyCWRldjsKKwl1bnNpZ25lZCBjaGFyCWNoYW5uZWw7CisJdW5zaWduZWQgY2hhcglzYXBpOworCXVuc2lnbmVkIGNoYXIJdGVpOworfTsKKworc3RydWN0IG1JU0ROdmVyc2lvbiB7CisJdW5zaWduZWQgY2hhcgltYWpvcjsKKwl1bnNpZ25lZCBjaGFyCW1pbm9yOworCXVuc2lnbmVkIHNob3J0CXJlbGVhc2U7Cit9OworCisjZGVmaW5lIE1BWF9ERVZJQ0VfSUQgNjMKKworc3RydWN0IG1JU0ROX2RldmluZm8geworCXVfaW50CQkJaWQ7CisJdV9pbnQJCQlEcHJvdG9jb2xzOworCXVfaW50CQkJQnByb3RvY29sczsKKwl1X2ludAkJCXByb3RvY29sOworCXVfY2hhcgkJCWNoYW5uZWxtYXBbTUlTRE5fQ0hNQVBfU0laRV07CisJdV9pbnQJCQlucmJjaGFuOworCWNoYXIJCQluYW1lW01JU0ROX01BWF9JRExFTl07Cit9OworCitzdHJ1Y3QgbUlTRE5fZGV2cmVuYW1lIHsKKwl1X2ludAkJCWlkOworCWNoYXIJCQluYW1lW01JU0ROX01BWF9JRExFTl07Cit9OworCitzdHJ1Y3QgcGhfaW5mb19jaCB7CisJaW50MzJfdCAJCXByb3RvY29sOworCWludDY0X3QJCQlGbGFnczsKK307CisKK3N0cnVjdCBwaF9pbmZvX2RjaCB7CisJc3RydWN0IHBoX2luZm9fY2gJY2g7CisJaW50MTZfdAkJCXN0YXRlOworCWludDE2X3QJCQludW1fYmNoOworfTsKKworc3RydWN0IHBoX2luZm8geworCXN0cnVjdCBwaF9pbmZvX2RjaAlkY2g7CisJc3RydWN0IHBoX2luZm9fY2ggCWJjaFtdOworfTsKKworLyogdGltZXIgZGV2aWNlIGlvY3RsICovCisjZGVmaW5lIElNQUREVElNRVIJX0lPUignSScsIDY0LCBpbnQpCisjZGVmaW5lIElNREVMVElNRVIJX0lPUignSScsIDY1LCBpbnQpCisvKiBzb2NrZXQgaW9jdGxzICovCisjZGVmaW5lCUlNR0VUVkVSU0lPTglfSU9SKCdJJywgNjYsIGludCkKKyNkZWZpbmUJSU1HRVRDT1VOVAlfSU9SKCdJJywgNjcsIGludCkKKyNkZWZpbmUgSU1HRVRERVZJTkZPCV9JT1IoJ0knLCA2OCwgaW50KQorI2RlZmluZSBJTUNUUkxSRVEJX0lPUignSScsIDY5LCBpbnQpCisjZGVmaW5lIElNQ0xFQVJfTDIJX0lPUignSScsIDcwLCBpbnQpCisjZGVmaW5lIElNU0VUREVWTkFNRQlfSU9SKCdJJywgNzEsIHN0cnVjdCBtSVNETl9kZXZyZW5hbWUpCisKK3N0YXRpYyBpbmxpbmUgaW50Cit0ZXN0X2NoYW5uZWxtYXAodV9pbnQgbnIsIHVfY2hhciAqbWFwKQoreworCWlmIChuciA8PSBNSVNETl9NQVhfQ0hBTk5FTCkKKwkJcmV0dXJuIG1hcFtuciA+PiAzXSAmICgxIDw8IChuciAmIDcpKTsKKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3NldF9jaGFubmVsbWFwKHVfaW50IG5yLCB1X2NoYXIgKm1hcCkKK3sKKwltYXBbbnIgPj4gM10gfD0gKDEgPDwgKG5yICYgNykpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2NsZWFyX2NoYW5uZWxtYXAodV9pbnQgbnIsIHVfY2hhciAqbWFwKQoreworCW1hcFtuciA+PiAzXSAmPSB+KDEgPDwgKG5yICYgNykpOworfQorCisvKiBDT05UUk9MX0NIQU5ORUwgcGFyYW1ldGVycyAqLworI2RlZmluZSBNSVNETl9DVFJMX0dFVE9QCQkweDAwMDAKKyNkZWZpbmUgTUlTRE5fQ1RSTF9MT09QCQkJMHgwMDAxCisjZGVmaW5lIE1JU0ROX0NUUkxfQ09OTkVDVAkJMHgwMDAyCisjZGVmaW5lIE1JU0ROX0NUUkxfRElTQ09OTkVDVAkJMHgwMDA0CisjZGVmaW5lIE1JU0ROX0NUUkxfUENNQ09OTkVDVAkJMHgwMDEwCisjZGVmaW5lIE1JU0ROX0NUUkxfUENNRElTQ09OTkVDVAkweDAwMjAKKyNkZWZpbmUgTUlTRE5fQ1RSTF9TRVRQRUVSCQkweDAwNDAKKyNkZWZpbmUgTUlTRE5fQ1RSTF9VTlNFVFBFRVIJCTB4MDA4MAorI2RlZmluZSBNSVNETl9DVFJMX1JYX09GRgkJMHgwMTAwCisjZGVmaW5lIE1JU0ROX0NUUkxfRklMTF9FTVBUWQkJMHgwMjAwCisjZGVmaW5lIE1JU0ROX0NUUkxfR0VUUEVFUgkJMHgwNDAwCisjZGVmaW5lIE1JU0ROX0NUUkxfSFdfRkVBVFVSRVNfT1AJMHgyMDAwCisjZGVmaW5lIE1JU0ROX0NUUkxfSFdfRkVBVFVSRVMJCTB4MjAwMQorI2RlZmluZSBNSVNETl9DVFJMX0hGQ19PUAkJMHg0MDAwCisjZGVmaW5lIE1JU0ROX0NUUkxfSEZDX1BDTV9DT05OCQkweDQwMDEKKyNkZWZpbmUgTUlTRE5fQ1RSTF9IRkNfUENNX0RJU0MJCTB4NDAwMgorI2RlZmluZSBNSVNETl9DVFJMX0hGQ19DT05GX0pPSU4JMHg0MDAzCisjZGVmaW5lIE1JU0ROX0NUUkxfSEZDX0NPTkZfU1BMSVQJMHg0MDA0CisjZGVmaW5lIE1JU0ROX0NUUkxfSEZDX1JFQ0VJVkVfT0ZGCTB4NDAwNQorI2RlZmluZSBNSVNETl9DVFJMX0hGQ19SRUNFSVZFX09OCTB4NDAwNgorI2RlZmluZSBNSVNETl9DVFJMX0hGQ19FQ0hPQ0FOX09OIAkweDQwMDcKKyNkZWZpbmUgTUlTRE5fQ1RSTF9IRkNfRUNIT0NBTl9PRkYgCTB4NDAwOAorCisKKy8qIHNvY2tldCBvcHRpb25zICovCisjZGVmaW5lIE1JU0ROX1RJTUVfU1RBTVAJCTB4MDAwMQorCitzdHJ1Y3QgbUlTRE5fY3RybF9yZXEgeworCWludAkJb3A7CisJaW50CQljaGFubmVsOworCWludAkJcDE7CisJaW50CQlwMjsKK307CisKKy8qIG11eGVyIG9wdGlvbnMgKi8KKyNkZWZpbmUgTUlTRE5fT1BUX0FMTAkJMQorI2RlZmluZSBNSVNETl9PUFRfVEVJTUdSCTIKKworI2VuZGlmIC8qIG1JU0ROSUZfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmI2MmRlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxNCBAQAorbm9pbnN0X0hFQURFUlMgPSBhYmlzX25tLmggYWJpc19yc2wuaCBkYi5oIGdzbV8wNF8wOC5oIGdzbV9kYXRhLmggXAorCQkgZ3NtX3N1YnNjcmliZXIuaCBnc21fMDRfMTEuaCBkZWJ1Zy5oIHNpZ25hbC5oIFwKKwkJIG1pc2RuLmggY2hhbl9hbGxvYy5oIHRlbG5ldF9pbnRlcmZhY2UuaCBwYWdpbmcuaCBcCisJCSBzdWJjaGFuX2RlbXV4LmggdHJhdV9mcmFtZS5oIGUxX2lucHV0LmggdHJhdV9tdXguaCBcCisJCSBpcGFjY2Vzcy5oIHJzMjMyLmggb3BlbmJzY2RlZmluZXMuaCBydHBfcHJveHkuaCBcCisJCSBic2NfcmxsLmggbW5jYy5oIHRyYW5zYWN0aW9uLmggdXNzZC5oIGdzbV8wNF84MC5oIFwKKwkJIHNpbGVudF9jYWxsLmggbWdjcC5oIG1lYXNfcmVwLmggcmVzdF9vY3RldHMuaCBcCisJCSBzeXN0ZW1faW5mb3JtYXRpb24uaCBoYW5kb3Zlci5oIG1nY3BfaW50ZXJuYWwuaCBcCisJCSB2dHkuaCBcCisJCWNyYzI0LmggZ3Byc19ic3NncC5oIGdwcnNfbGxjLmggZ3Byc19ucy5oIFwKKwkJZ2JfcHJveHkuaCBncHJzX3Nnc24uaCBnc21fMDRfMDhfZ3Bycy5oIHNnc24uaAorCitvcGVuYnNjX0hFQURFUlMgPSBnc21fMDRfMDguaCBtZWFzX3JlcC5oIGJzY19hcGkuaAorb3BlbmJzY2RpciA9ICQoaW5jbHVkZWRpcikvb3BlbmJzYwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYWJpc19ubS5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYWJpc19ubS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MzA3ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9hYmlzX25tLmgKQEAgLTAsMCArMSwxNzIgQEAKKy8qIEdTTSBOZXR3b3JrIE1hbmFnZW1lbnQgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZSAKKyAqIDNHUFAgVFMgMTIuMjEgdmVyc2lvbiA4LjAuMCBSZWxlYXNlIDE5OTkgLyBFVFNJIFRTIDEwMCA2MjMgVjguMC4wICovCisKKy8qIChDKSAyMDA4LTIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9OTV9ICisjZGVmaW5lIF9OTV9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9wcm90b2NvbC9nc21fMTJfMjEuaD4KKworc3RydWN0IGNlbGxfZ2xvYmFsX2lkIHsKKwl1X2ludDE2X3QgbWNjOworCXVfaW50MTZfdCBtbmM7CisJdV9pbnQxNl90IGxhYzsKKwl1X2ludDE2X3QgY2k7Cit9OworCisvKiBUaGUgQkNDSCBpbmZvIGZyb20gYW4gaXAuYWNjZXNzIHRlc3QsIGluIGhvc3QgYnl0ZSBvcmRlcgorICogYW5kIGFscmVhZHkgcGFyc2VkLi4uICovCitzdHJ1Y3QgaXBhY19iY2NoX2luZm8geworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisKKwl1X2ludDE2X3QgaW5mb190eXBlOworCXVfaW50OF90IGZyZXFfcXVhbDsKKwl1X2ludDE2X3QgYXJmY247CisJdV9pbnQ4X3QgcnhfbGV2OworCXVfaW50OF90IHJ4X3F1YWw7CisJaW50MTZfdCBmcmVxX2VycjsKKwl1X2ludDE2X3QgZnJhbWVfb2Zmc2V0OworCXVfaW50MzJfdCBmcmFtZV9ucl9vZmZzZXQ7CisJdV9pbnQ4X3QgYnNpYzsKKwlzdHJ1Y3QgY2VsbF9nbG9iYWxfaWQgY2dpOworCXVfaW50OF90IGJhX2xpc3Rfc2kyWzE2XTsKKwl1X2ludDhfdCBiYV9saXN0X3NpMmJpc1sxNl07CisJdV9pbnQ4X3QgYmFfbGlzdF9zaTJ0ZXJbMTZdOworCXVfaW50OF90IGNhX2xpc3Rfc2kxWzE2XTsKK307CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgdGx2X2RlZmluaXRpb24gbm1fYXR0X3RsdmRlZjsKKworLyogUFVCTElDICovCisKK3N0cnVjdCBtc2diOworCitzdHJ1Y3QgYWJpc19ubV9jZmcgeworCS8qIGNhbGxiYWNrIGZvciB1bmlkaXJlY3Rpb25hbCByZXBvcnRzICovCisJaW50ICgqcmVwb3J0X2NiKShzdHJ1Y3QgbXNnYiAqLAorCQkJIHN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKik7CisJLyogY2FsbGJhY2sgZm9yIHNvZnR3YXJlIGFjdGl2YXRlIHJlcXVlc3RzIGZyb20gQlRTICovCisJaW50ICgqc3dfYWN0X3JlcSkoc3RydWN0IG1zZ2IgKik7Cit9OworCitleHRlcm4gaW50IGFiaXNfbm1fcmN2bXNnKHN0cnVjdCBtc2diICptc2cpOworCitpbnQgYWJpc19ubV90bHZfcGFyc2Uoc3RydWN0IHRsdl9wYXJzZWQgKnRwLCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBjb25zdCB1X2ludDhfdCAqYnVmLCBpbnQgbGVuKTsKK2ludCBhYmlzX25tX3J4KHN0cnVjdCBtc2diICptc2cpOworaW50IGFiaXNfbm1fb3BzdGFydChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsIHVfaW50OF90IGkwLCB1X2ludDhfdCBpMSwgdV9pbnQ4X3QgaTIpOworaW50IGFiaXNfbm1fY2hnX2FkbV9zdGF0ZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsIHVfaW50OF90IGkwLAorCQkJICB1X2ludDhfdCBpMSwgdV9pbnQ4X3QgaTIsIGVudW0gYWJpc19ubV9hZG1fc3RhdGUgYWRtX3N0YXRlKTsKK2ludCBhYmlzX25tX2VzdGFibGlzaF90ZWkoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgdHJ4X25yLAorCQkJICB1X2ludDhfdCBlMV9wb3J0LCB1X2ludDhfdCBlMV90aW1lc2xvdCwgdV9pbnQ4X3QgZTFfc3Vic2xvdCwKKwkJCSAgdV9pbnQ4X3QgdGVpKTsKK2ludCBhYmlzX25tX2Nvbm5fdGVycl9zaWduKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LAorCQkJICAgdV9pbnQ4X3QgZTFfcG9ydCwgdV9pbnQ4X3QgZTFfdGltZXNsb3QsIHVfaW50OF90IGUxX3N1YnNsb3QpOworaW50IGFiaXNfbm1fY29ubl90ZXJyX3RyYWYoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cywKKwkJCSAgIHVfaW50OF90IGUxX3BvcnQsIHVfaW50OF90IGUxX3RpbWVzbG90LAorCQkJICAgdV9pbnQ4X3QgZTFfc3Vic2xvdCk7CitpbnQgYWJpc19ubV9zZXRfYnRzX2F0dHIoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgKmF0dHIsIGludCBhdHRyX2xlbik7CitpbnQgYWJpc19ubV9zZXRfcmFkaW9fYXR0cihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgKmF0dHIsIGludCBhdHRyX2xlbik7CitpbnQgYWJpc19ubV9zZXRfY2hhbm5lbF9hdHRyKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMsIHVfaW50OF90IGNoYW5fY29tYik7CitpbnQgYWJpc19ubV9zd19hY3RfcmVxX2FjayhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsIHVfaW50OF90IGkxLAorCQkJdV9pbnQ4X3QgaTIsIHVfaW50OF90IGkzLCBpbnQgbmFjaywgdV9pbnQ4X3QgKmF0dHIsIGludCBhdHRfbGVuKTsKK2ludCBhYmlzX25tX3Jhd19tc2coc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IGxlbiwgdV9pbnQ4X3QgKm1zZyk7CitpbnQgYWJpc19ubV9ldmVudF9yZXBvcnRzKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBvbik7CitpbnQgYWJpc19ubV9yZXNldF9yZXNvdXJjZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX3NvZnR3YXJlX2xvYWQoc3RydWN0IGdzbV9idHMgKmJ0cywgY29uc3QgY2hhciAqZm5hbWUsCisJCQkgIHVfaW50OF90IHdpbl9zaXplLCBpbnQgZm9yY2VkLAorCQkJICBnc21fY2JmbiAqY2Jmbiwgdm9pZCAqY2JfZGF0YSk7CitpbnQgYWJpc19ubV9zb2Z0d2FyZV9sb2FkX3N0YXR1cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX3NvZnR3YXJlX2FjdGl2YXRlKHN0cnVjdCBnc21fYnRzICpidHMsIGNvbnN0IGNoYXIgKmZuYW1lLAorCQkJICAgICAgZ3NtX2NiZm4gKmNiZm4sIHZvaWQgKmNiX2RhdGEpOworCitpbnQgYWJpc19ubV9jb25uX21kcm9wX2xpbmsoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgZTFfcG9ydDAsIHVfaW50OF90IHRzMCwKKwkJCSAgICB1X2ludDhfdCBlMV9wb3J0MSwgdV9pbnQ4X3QgdHMxKTsKKworaW50IGFiaXNfbm1fcGVyZm9ybV90ZXN0KHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG9ial9jbGFzcywKKwkJCSB1X2ludDhfdCBidHNfbnIsIHVfaW50OF90IHRyeF9uciwgdV9pbnQ4X3QgdHNfbnIsCisJCQkgdV9pbnQ4X3QgdGVzdF9uciwgdV9pbnQ4X3QgYXV0b25fcmVwb3J0LAorCQkJIHVfaW50OF90ICpwaHlzX2NvbmZpZywgdV9pbnQxNl90IHBoeXNfY29uZmlnX2xlbik7CisKK2ludCBhYmlzX25tX2NoY29tYjRwY2hhbihlbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIHBjaGFuKTsKKworLyogU2llbWVucyAvIEJTLTExIHNwZWNpZmljICovCitpbnQgYWJpc19ubV9iczExX3Jlc2V0X3Jlc291cmNlKHN0cnVjdCBnc21fYnRzICpidHMpOworaW50IGFiaXNfbm1fYnMxMV9kYl90cmFuc21pc3Npb24oc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IGJlZ2luKTsKK2ludCBhYmlzX25tX2JzMTFfY3JlYXRlX29iamVjdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBlbnVtIGFiaXNfYnMxMV9vYmp0eXBlIHR5cGUsCisJCQkgIHVfaW50OF90IGlkeCwgdV9pbnQ4X3QgYXR0cl9sZW4sIGNvbnN0IHVfaW50OF90ICphdHRyKTsKK2ludCBhYmlzX25tX2JzMTFfY3JlYXRlX2VudmFCVFNFKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGlkeCk7CitpbnQgYWJpc19ubV9iczExX2NyZWF0ZV9icG9ydChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBpZHgpOworaW50IGFiaXNfbm1fYnMxMV9kZWxldGVfb2JqZWN0KHN0cnVjdCBnc21fYnRzICpidHMsCisJCQkJZW51bSBhYmlzX2JzMTFfb2JqdHlwZSB0eXBlLCB1X2ludDhfdCBpZHgpOworaW50IGFiaXNfbm1fYnMxMV9kZWxldGVfYnBvcnQoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgaWR4KTsKK2ludCBhYmlzX25tX2JzMTFfY29ubl9vbWxfdGVpKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGUxX3BvcnQsCisJCQkgIHVfaW50OF90IGUxX3RpbWVzbG90LCB1X2ludDhfdCBlMV9zdWJzbG90LCB1X2ludDhfdCB0ZWkpOworaW50IGFiaXNfbm1fYnMxMV9nZXRfb21sX3RlaV90cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX2JzMTFfZ2V0X3Nlcm5vKHN0cnVjdCBnc21fYnRzICpidHMpOworaW50IGFiaXNfbm1fYnMxMV9zZXRfdHJ4X3Bvd2VyKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCBsZXZlbCk7CitpbnQgYWJpc19ubV9iczExX2dldF90cnhfcG93ZXIoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpOworaW50IGFiaXNfbm1fYnMxMV9sb2dvbihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBsZXZlbCwgY29uc3QgY2hhciAqbmFtZSwgaW50IG9uKTsKK2ludCBhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgb24pOworaW50IGFiaXNfbm1fYnMxMV9pbmZpZWxkX2xvZ29uKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBvbik7CitpbnQgYWJpc19ubV9iczExX3NldF90cngxX3B3KHN0cnVjdCBnc21fYnRzICpidHMsIGNvbnN0IGNoYXIgKnBhc3N3b3JkKTsKK2ludCBhYmlzX25tX2JzMTFfc2V0X3BsbF9sb2NrZWQoc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IGxvY2tlZCk7CitpbnQgYWJpc19ubV9iczExX2dldF9wbGxfbW9kZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX2JzMTFfc2V0X3BsbChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgdmFsdWUpOworaW50IGFiaXNfbm1fYnMxMV9nZXRfY2NsayhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX2JzMTFfZ2V0X3N0YXRlKHN0cnVjdCBnc21fYnRzICpidHMpOworaW50IGFiaXNfbm1fYnMxMV9sb2FkX3N3bChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBjb25zdCBjaGFyICpmbmFtZSwKKwkJCSAgdV9pbnQ4X3Qgd2luX3NpemUsIGludCBmb3JjZWQsIGdzbV9jYmZuICpjYmZuKTsKK2ludCBhYmlzX25tX2JzMTFfc2V0X2V4dF90aW1lKHN0cnVjdCBnc21fYnRzICpidHMpOworaW50IGFiaXNfbm1fYnMxMV9zZXRfYnBvcnRfbGluZV9jZmcoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgYnBvcnQsIGVudW0gYWJpc19iczExX2xpbmVfY2ZnIGxpbmVfY2ZnKTsKK2ludCBhYmlzX25tX2JzMTFfYnNjX2Rpc2Nvbm5lY3Qoc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IHJlY29ubmVjdCk7CitpbnQgYWJpc19ubV9iczExX3Jlc3RhcnQoc3RydWN0IGdzbV9idHMgKmJ0cyk7CisKKy8qIGlwLmFjY2VzcyBuYW5vQlRTIHNwZWNpZmljIGNvbW1hbmRzICovCitpbnQgYWJpc19ubV9pcGFjY2Vzc19tc2coc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgbXNnX3R5cGUsCisJCQkgdV9pbnQ4X3Qgb2JqX2NsYXNzLCB1X2ludDhfdCBidHNfbnIsCisJCQkgdV9pbnQ4X3QgdHJ4X25yLCB1X2ludDhfdCB0c19uciwKKwkJCSB1X2ludDhfdCAqYXR0ciwgaW50IGF0dHJfbGVuKTsKK2ludCBhYmlzX25tX2lwYWNjZXNzX3NldF9udmF0dHIoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90ICphdHRyLAorCQkJCWludCBhdHRyX2xlbik7CitpbnQgYWJpc19ubV9pcGFjY2Vzc19yZXN0YXJ0KHN0cnVjdCBnc21fYnRzICpidHMpOworaW50IGFiaXNfbm1faXBhY2Nlc3Nfc2V0X2F0dHIoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLAorCQkJCXVfaW50OF90IGJ0c19uciwgdV9pbnQ4X3QgdHJ4X25yLCB1X2ludDhfdCB0c19uciwKKwkJCQl1X2ludDhfdCAqYXR0ciwgdV9pbnQ4X3QgYXR0cl9sZW4pOworaW50IGFiaXNfbm1faXBhY2Nlc3NfcnNsX2Nvbm5lY3Qoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIAorCQkJCSB1X2ludDMyX3QgaXAsIHVfaW50MTZfdCBwb3J0LCB1X2ludDhfdCBzdHJlYW0pOwordm9pZCBhYmlzX25tX2lwYWNjZXNzX2NnaSh1X2ludDhfdCAqYnVmLCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBpcGFjX3BhcnNlX2JjY2hfaW5mbyhzdHJ1Y3QgaXBhY19iY2NoX2luZm8gKmJpbmYsIHVfaW50OF90ICpidWYpOworY29uc3QgY2hhciAqaXBhY2NfdGVzdHJlc19uYW1lKHVfaW50OF90IHJlcyk7CisKKy8qIEZ1bmN0aW9ucyBjYWxsaW5nIGludG8gb3RoZXIgY29kZSBwYXJ0cyAqLworZW51bSBubV9ldnQgeworCUVWVF9TVEFURUNIR19PUEVSLAorCUVWVF9TVEFURUNIR19BRE0sCit9OworaW50IG5tX3N0YXRlX2V2ZW50KGVudW0gbm1fZXZ0IGV2dCwgdV9pbnQ4X3Qgb2JqX2NsYXNzLCB2b2lkICpvYmosCisJCSAgIHN0cnVjdCBnc21fbm1fc3RhdGUgKm9sZF9zdGF0ZSwgc3RydWN0IGdzbV9ubV9zdGF0ZSAqbmV3X3N0YXRlKTsgCisKK2NvbnN0IGNoYXIgKm5tX29wc3RhdGVfbmFtZSh1X2ludDhfdCBvcyk7Citjb25zdCBjaGFyICpubV9hdmFpbF9uYW1lKHVfaW50OF90IGF2YWlsKTsKK2ludCBubV9pc19ydW5uaW5nKHN0cnVjdCBnc21fbm1fc3RhdGUgKnMpOworI2VuZGlmIC8qIF9OTV9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9hYmlzX3JzbC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYWJpc19yc2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTY3NzRkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYWJpc19yc2wuaApAQCAtMCwwICsxLDg4IEBACisvKiBHU00gUmFkaW8gU2lnbmFsbGluZyBMaW5rIG1lc3NhZ2VzIG9uIHRoZSBBLWJpcyBpbnRlcmZhY2UgCisgKiAzR1BQIFRTIDA4LjU4IHZlcnNpb24gOC42LjAgUmVsZWFzZSAxOTk5IC8gRVRTSSBUUyAxMDAgNTk2IFY4LjYuMCAqLworCisvKiAoQykgMjAwOCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX1JTTF9ICisjZGVmaW5lIF9SU0xfSAorCisjaW5jbHVkZSA8b3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA4XzU4Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisKK2ludCByc2xfYmNjaF9pbmZvKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCB0eXBlLAorCQkgIGNvbnN0IHVfaW50OF90ICpkYXRhLCBpbnQgbGVuKTsKK2ludCByc2xfc2FjY2hfZmlsbGluZyhzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgdHlwZSwgCisJCSAgICAgIGNvbnN0IHVfaW50OF90ICpkYXRhLCBpbnQgbGVuKTsKK2ludCByc2xfY2hhbl9hY3RpdmF0ZShzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgY2hhbl9uciwKKwkJICAgICAgdV9pbnQ4X3QgYWN0X3R5cGUsCisJCSAgICAgIHN0cnVjdCByc2xfaWVfY2hhbl9tb2RlICpjaGFuX21vZGUsCisJCSAgICAgIHN0cnVjdCByc2xfaWVfY2hhbl9pZGVudCAqY2hhbl9pZGVudCwKKwkJICAgICAgdV9pbnQ4X3QgYnNfcG93ZXIsIHVfaW50OF90IG1zX3Bvd2VyLAorCQkgICAgICB1X2ludDhfdCB0YSk7CitpbnQgcnNsX2NoYW5fYWN0aXZhdGVfbGNoYW4oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGFjdF90eXBlLCAKKwkJCSAgICB1X2ludDhfdCB0YSwgdV9pbnQ4X3QgaG9fcmVmKTsKK2ludCByc2xfY2hhbl9tb2RlX21vZGlmeV9yZXEoc3RydWN0IGdzbV9sY2hhbiAqdHMpOworaW50IHJzbF9lbmNyeXB0aW9uX2NtZChzdHJ1Y3QgbXNnYiAqbXNnKTsKK2ludCByc2xfcGFnaW5nX2NtZChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBwYWdpbmdfZ3JvdXAsIHVfaW50OF90IGxlbiwKKwkJICAgdV9pbnQ4X3QgKm1zX2lkZW50LCB1X2ludDhfdCBjaGFuX25lZWRlZCk7CitpbnQgcnNsX3BhZ2luZ19jbWRfc3Vic2NyKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGNoYW5fbmVlZGVkLAorCQkJIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKTsKK2ludCByc2xfaW1tX2Fzc2lnbl9jbWQoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgbGVuLCB1X2ludDhfdCAqdmFsKTsKKworaW50IHJzbF9kYXRhX3JlcXVlc3Qoc3RydWN0IG1zZ2IgKm1zZywgdV9pbnQ4X3QgbGlua19pZCk7CitpbnQgcnNsX2VzdGFibGlzaF9yZXF1ZXN0KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBsaW5rX2lkKTsKK2ludCByc2xfcmVsYXNlX3JlcXVlc3Qoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGxpbmtfaWQpOworCisvKiBTaWVtZW5zIHZlbmRvci1zcGVjaWZpYyBSU0wgZXh0ZW5zaW9ucyAqLworaW50IHJzbF9zaWVtZW5zX21ycGNpKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCBzdHJ1Y3QgcnNsX21ycGNpICptcnBjaSk7CisKKy8qIGlwLmFjY2VzcyBzcGVjZmljIFJTTCBleHRlbnNpb25zICovCitpbnQgcnNsX2lwYWNjX2NyY3goc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworaW50IHJzbF9pcGFjY19tZGN4KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDMyX3QgaXAsCisJCSAgIHVfaW50MTZfdCBwb3J0LCB1X2ludDhfdCBydHBfcGF5bG9hZDIpOworaW50IHJzbF9pcGFjY19tZGN4X3RvX3J0cHNvY2soc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworaW50IHJzbF9pcGFjY19wZGNoX2FjdGl2YXRlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCBpbnQgYWN0KTsKKworaW50IGFiaXNfcnNsX3Jjdm1zZyhzdHJ1Y3QgbXNnYiAqbXNnKTsKKwordW5zaWduZWQgaW50IGdldF9wYWdpbmdfZ3JvdXAodV9pbnQ2NF90IGltc2ksIHVuc2lnbmVkIGludCBic19jY19jaGFucywKKwkJCSAgICAgIGludCBuX3BhZ19ibG9ja3MpOwordW5zaWduZWQgaW50IG5fcGFnX2Jsb2NrcyhpbnQgYnNfY2NjaF9zZGNjaF9jb21iLCB1bnNpZ25lZCBpbnQgYnNfYWdfYmxrc19yZXMpOwordV9pbnQ2NF90IHN0cl90b19pbXNpKGNvbnN0IGNoYXIgKmltc2lfc3RyKTsKK3VfaW50OF90IGxjaGFuMmNoYW5fbnIoY29uc3Qgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworaW50IHJzbF9yZWxlYXNlX3JlcXVlc3Qoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGxpbmtfaWQpOworCitpbnQgcnNsX2xjaGFuX3NldF9zdGF0ZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgaW50KTsKKworLyogdG8gYmUgcHJvdmlkZWQgYnkgZXh0ZXJuYWwgY29kZSAqLworaW50IGFiaXNfcnNsX3NlbmRtc2coc3RydWN0IG1zZ2IgKm1zZyk7CitpbnQgcnNsX2RlYWN0X3NhY2NoKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKKworLyogQkNDSCByZWxhdGVkIGNvZGUgKi8KK2ludCByc2xfY2NjaF9jb25mX3RvX2JzX2NjX2NoYW5zKGludCBjY2NoX2NvbmYpOworaW50IHJzbF9jY2NoX2NvbmZfdG9fYnNfY2NjaF9zZGNjaF9jb21iKGludCBjY2NoX2NvbmYpOworaW50IHJzbF9udW1iZXJfb2ZfcGFnaW5nX3N1YmNoYW5uZWxzKHN0cnVjdCBnc21fYnRzICpidHMpOworCitpbnQgcnNsX2NoYW5fYnNfcG93ZXJfY3RybChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdW5zaWduZWQgaW50IGZwYywgaW50IGRiKTsKK2ludCByc2xfY2hhbl9tc19wb3dlcl9jdHJsKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1bnNpZ25lZCBpbnQgZnBjLCBpbnQgZGJtKTsKKworI2VuZGlmIC8qIFJTTF9NVF9IICovCisKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2JzY19hcGkuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2JzY19hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWUzNDRmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYnNjX2FwaS5oCkBAIC0wLDAgKzEsNiBAQAorLyogR1NNIDA4LjA4IGxpa2UgQVBJIGZvciBPcGVuQlNDICovCisKKyNpbmNsdWRlICJnc21fZGF0YS5oIgorCisKK2ludCBnc20wODA4X3N1Ym1pdF9kdGFwKHN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uLCBzdHJ1Y3QgbXNnYiAqbXNnLCBpbnQgbGlua19pZCk7CmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ic2NfcmxsLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ic2NfcmxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI4OThkMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2JzY19ybGwuaApAQCAtMCwwICsxLDE5IEBACisjaWZuZGVmIF9CU0NfUkxMX0gKKyNkZWZpbmUgX0JTQ19STExfSAorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorCitlbnVtIGJzY19ybGxyX2luZCB7CisJQlNDX1JMTFJfSU5EX0VTVF9DT05GLAorCUJTQ19STExSX0lORF9SRUxfSU5ELAorCUJTQ19STExSX0lORF9FUlJfSU5ELAorCUJTQ19STExSX0lORF9USU1FT1VULAorfTsKKworaW50IHJsbF9lc3RhYmxpc2goc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGxpbmtfaWQsCisJCSAgdm9pZCAoKmNiKShzdHJ1Y3QgZ3NtX2xjaGFuICosIHVfaW50OF90LCB2b2lkICosCisJCQkgICAgIGVudW0gYnNjX3JsbHJfaW5kKSwKKwkJICB2b2lkICpkYXRhKTsKK3ZvaWQgcmxsX2luZGljYXRpb24oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGxpbmtfaWQsIHVfaW50OF90IHR5cGUpOworCisjZW5kaWYgLyogX0JTQ19STExfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvY2hhbl9hbGxvYy5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvY2hhbl9hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZjU4NTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9jaGFuX2FsbG9jLmgKQEAgLTAsMCArMSw2NyBAQAorLyogTWFuYWdlbWVudCBmdW5jdGlvbnMgdG8gYWxsb2NhdGUvcmVsZWFzZSBzdHJ1Y3QgZ3NtX2xjaGFuICovCisvKiAoQykgMjAwOCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisjaWZuZGVmIF9DSEFOX0FMTE9DX0gKKyNkZWZpbmUgX0NIQU5fQUxMT0NfSAorCisjaW5jbHVkZSAiZ3NtX3N1YnNjcmliZXIuaCIKKworLyogU3BlY2lhbCBhbGxvY2F0b3IgZm9yIEMwIG9mIEJUUyAqLworc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0c19jMF9hbGxvYyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLAorCQkJCSAgIGVudW0gZ3NtX3BoeXNfY2hhbl9jb25maWcgcGNoYW4pOworCisvKiBSZWd1bGFyIHBoeXNpY2FsIGNoYW5uZWwgYWxsb2NhdG9yICovCitzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzX2FsbG9jKHN0cnVjdCBnc21fYnRzICpidHMsCisJCQkJZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBwY2hhbik7CisKKy8qIFJlZ3VsYXIgcGh5c2ljYWwgY2hhbm5lbCAoVFMpICovCit2b2lkIHRzX2ZyZWUoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyk7CisKKy8qIEZpbmQgYW4gYWxsb2NhdGVkIGNoYW5uZWwgKi8KK3N0cnVjdCBnc21fbGNoYW4gKmxjaGFuX2ZpbmQoc3RydWN0IGdzbV9idHMgKmJ0cywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworCisvKiBGaW5kIGFuIGFsbG9jYXRlZCBjaGFubmVsIGZvciBhIHNwZWNpZmllZCBzdWJzY3JpYmVyICovCitzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbl9mb3Jfc3Vic2NyKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKTsKKworLyogQWxsb2NhdGUgYSBsb2dpY2FsIGNoYW5uZWwgKFNEQ0NILCBUQ0gsIC4uLikgKi8KK3N0cnVjdCBnc21fbGNoYW4gKmxjaGFuX2FsbG9jKHN0cnVjdCBnc21fYnRzICpidHMsIGVudW0gZ3NtX2NoYW5fdCB0eXBlKTsKKworLyogRnJlZSBhIGxvZ2ljYWwgY2hhbm5lbCAoU0RDQ0gsIFRDSCwgLi4uKSAqLwordm9pZCBsY2hhbl9mcmVlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKK3ZvaWQgbGNoYW5fcmVzZXQoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworCisvKiBDb25zaWRlciByZWxlYXNpbmcgdGhlIGNoYW5uZWwgKi8KK2ludCBsY2hhbl9hdXRvX3JlbGVhc2Uoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworCitzdHJ1Y3QgbG9hZF9jb3VudGVyIHsKKwl1bnNpZ25lZCBpbnQgdG90YWw7CisJdW5zaWduZWQgaW50IHVzZWQ7Cit9OworCitzdHJ1Y3QgcGNoYW5fbG9hZCB7CisJc3RydWN0IGxvYWRfY291bnRlciBwY2hhbltHU01fUENIQU5fVU5LTk9XTl07Cit9OworCit2b2lkIGJ0c19jaGFuX2xvYWQoc3RydWN0IHBjaGFuX2xvYWQgKmNsLCBjb25zdCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK3ZvaWQgbmV0d29ya19jaGFuX2xvYWQoc3RydWN0IHBjaGFuX2xvYWQgKnBsLCBzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCk7CisKK2ludCB0cnhfaXNfdXNhYmxlKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KTsKKworI2VuZGlmIC8qIF9DSEFOX0FMTE9DX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2NyYzI0LmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9jcmMyNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OGZjYjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9jcmMyNC5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfQ1JDMjRfSAorI2RlZmluZSBfQ1JDMjRfSAorCisjZGVmaW5lIElOSVRfQ1JDMjQJMHhmZmZmZmYKKwordV9pbnQzMl90IGNyYzI0X2NhbGModV9pbnQzMl90IGZjcywgdV9pbnQ4X3QgKmNwLCB1bnNpZ25lZCBpbnQgbGVuKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9kYi5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGExMjc4Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZGIuaApAQCAtMCwwICsxLDcxIEBACisvKiAoQykgMjAwOCBieSBKYW4gTHVlYmJlIDxqbHVlYmJlQGRlYmlhbi5vcmc+CisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfREJfSAorI2RlZmluZSBfREJfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisKKy8qIG9uZSB0aW1lIGluaXRpYWxpc2F0aW9uICovCitpbnQgZGJfaW5pdChjb25zdCBjaGFyICpuYW1lKTsKK2ludCBkYl9wcmVwYXJlKCk7CitpbnQgZGJfZmluaSgpOworCisvKiBzdWJzY3JpYmVyIG1hbmFnZW1lbnQgKi8KK3N0cnVjdCBnc21fc3Vic2NyaWJlciogZGJfY3JlYXRlX3N1YnNjcmliZXIoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCSAgICBjaGFyICppbXNpKTsKK3N0cnVjdCBnc21fc3Vic2NyaWJlciogZGJfZ2V0X3N1YnNjcmliZXIoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCSBlbnVtIGdzbV9zdWJzY3JpYmVyX2ZpZWxkIGZpZWxkLAorCQkJCQkgY29uc3QgY2hhciAqc3Vic2NyKTsKK2ludCBkYl9zeW5jX3N1YnNjcmliZXIoc3RydWN0IGdzbV9zdWJzY3JpYmVyKiBzdWJzY3JpYmVyKTsKK2ludCBkYl9zdWJzY3JpYmVyX2FsbG9jX3Rtc2koc3RydWN0IGdzbV9zdWJzY3JpYmVyKiBzdWJzY3JpYmVyKTsKK2ludCBkYl9zdWJzY3JpYmVyX2FsbG9jX2V4dGVuKHN0cnVjdCBnc21fc3Vic2NyaWJlciogc3Vic2NyaWJlcik7CitpbnQgZGJfc3Vic2NyaWJlcl9hbGxvY190b2tlbihzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIqIHN1YnNjcmliZXIsIHVfaW50MzJfdCogdG9rZW4pOworaW50IGRiX3N1YnNjcmliZXJfYXNzb2NfaW1laShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIqIHN1YnNjcmliZXIsIGNoYXIgKmltZWkpOworaW50IGRiX3N5bmNfZXF1aXBtZW50KHN0cnVjdCBnc21fZXF1aXBtZW50ICplcXVpcCk7CisKKy8qIGF1dGggaW5mbyAqLworaW50IGdldF9hdXRoaW5mb19ieV9zdWJzY3Ioc3RydWN0IGdzbV9hdXRoX2luZm8gKmFpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworaW50IHNldF9hdXRoaW5mb19mb3Jfc3Vic2NyKHN0cnVjdCBnc21fYXV0aF9pbmZvICphaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CitpbnQgZ2V0X2F1dGh0dXBsZV9ieV9zdWJzY3Ioc3RydWN0IGdzbV9hdXRoX3R1cGxlICphdHVwbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworaW50IHNldF9hdXRodHVwbGVfZm9yX3N1YnNjcihzdHJ1Y3QgZ3NtX2F1dGhfdHVwbGUgKmF0dXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworCisvKiBTTVMgc3RvcmUtYW5kLWZvcndhcmQgKi8KK2ludCBkYl9zbXNfc3RvcmUoc3RydWN0IGdzbV9zbXMgKnNtcyk7CitzdHJ1Y3QgZ3NtX3NtcyAqZGJfc21zX2dldF91bnNlbnQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIHVuc2lnbmVkIGxvbmcgbG9uZyBtaW5faWQpOworc3RydWN0IGdzbV9zbXMgKmRiX3Ntc19nZXRfdW5zZW50X2J5X3N1YnNjcihzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgdW5zaWduZWQgbG9uZyBsb25nIG1pbl9zdWJzY3JfaWQpOworc3RydWN0IGdzbV9zbXMgKmRiX3Ntc19nZXRfdW5zZW50X2Zvcl9zdWJzY3Ioc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworaW50IGRiX3Ntc19tYXJrX3NlbnQoc3RydWN0IGdzbV9zbXMgKnNtcyk7CisKKy8qIEFQRFUgYmxvYiBzdG9yYWdlICovCitpbnQgZGJfYXBkdV9ibG9iX3N0b3JlKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLCAKKwkJCXVfaW50OF90IGFwZHVfaWRfZmxhZ3MsIHVfaW50OF90IGxlbiwKKwkJCXVfaW50OF90ICphcGR1KTsKKworLyogU3RhdGlzdGljcyBjb3VudGVyIHN0b3JhZ2UgKi8KK2ludCBkYl9zdG9yZV9jb3VudGVyKHN0cnVjdCBjb3VudGVyICpjdHIpOworCisjZW5kaWYgLyogX0RCX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2RlYnVnLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YjQxN2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9kZWJ1Zy5oCkBAIC0wLDAgKzEsNTMgQEAKKyNpZm5kZWYgX0RFQlVHX0gKKyNkZWZpbmUgX0RFQlVHX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisKKyNkZWZpbmUgREVCVUcKKyNpbmNsdWRlIDxvc21vY29yZS9sb2dnaW5nLmg+CisKKy8qIERlYnVnIEFyZWFzIG9mIHRoZSBjb2RlICovCitlbnVtIHsKKwlEUkxMLAorCURDQywKKwlETU0sCisJRFJSLAorCURSU0wsCisJRE5NLAorCURNTkNDLAorCURTTVMsCisJRFBBRywKKwlETUVBUywKKwlETUksCisJRE1JQiwKKwlETVVYLAorCURJTlAsCisJRFNDQ1AsCisJRE1TQywKKwlETUdDUCwKKwlESE8sCisJRERCLAorCURSRUYsCisJREdQUlMsCisJRGVidWdfTGFzdEVudHJ5LAorfTsKKworLyogY29udGV4dCAqLworI2RlZmluZSBCU0NfQ1RYX0xDSEFOCTAKKyNkZWZpbmUgQlNDX0NUWF9TVUJTQ1IJMQorI2RlZmluZSBCU0NfQ1RYX0JUUwkyCisjZGVmaW5lIEJTQ19DVFhfU0NDUAkzCisKKy8qIHRhcmdldCAqLworCitlbnVtIHsKKwkvL0RFQlVHX0ZJTFRFUl9BTEwgPSAxIDw8IDAsCisJTE9HX0ZJTFRFUl9JTVNJID0gMSA8PCAxLAorfTsKKwordm9pZCBsb2dfc2V0X2ltc2lfZmlsdGVyKHN0cnVjdCBsb2dfdGFyZ2V0ICp0YXJnZXQsIGNvbnN0IGNoYXIgKmltc2kpOworCitleHRlcm4gY29uc3Qgc3RydWN0IGxvZ19pbmZvIGxvZ19pbmZvOworCisjZW5kaWYgLyogX0RFQlVHX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2UxX2lucHV0LmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9lMV9pbnB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhM2Q5ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9lMV9pbnB1dC5oCkBAIC0wLDAgKzEsMTY4IEBACisjaWZuZGVmIF9FMV9JTlBVVF9ICisjZGVmaW5lIF9FMV9JTlBVVF9ICisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc3ViY2hhbl9kZW11eC5oPgorCisjZGVmaW5lIE5VTV9FMV9UUyAgIDMyCisKK2VudW0gZTFpbnBfc2lnbl90eXBlIHsKKwlFMUlOUF9TSUdOX05PTkUsCisJRTFJTlBfU0lHTl9PTUwsCisJRTFJTlBfU0lHTl9SU0wsCit9OworY29uc3QgY2hhciAqZTFpbnBfc2lnbnR5cGVfbmFtZShlbnVtIGUxaW5wX3NpZ25fdHlwZSB0cCk7CisKK3N0cnVjdCBlMWlucF90czsKKworc3RydWN0IGUxaW5wX3NpZ25fbGluayB7CisJLyogbGlzdCBvZiBzaWduYWxsaW5nIGxpbmtzICovCisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKworCS8qIHRvIHdoaWNoIHRpbWVzbG90IGRvIHdlIGJlbG9uZz8gKi8KKwlzdHJ1Y3QgZTFpbnBfdHMgKnRzOworCisJZW51bSBlMWlucF9zaWduX3R5cGUgdHlwZTsKKworCS8qIHRyeCBmb3IgbXNnLT50cnggb2YgcmVjZWl2ZWQgbXNncyAqLwkKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKworCS8qIG1zZ2IgcXVldWUgb2YgdG8tYmUtdHJhbnNtaXR0ZWQgbXNncyAqLworCXN0cnVjdCBsbGlzdF9oZWFkIHR4X2xpc3Q7CisKKwkvKiBTQVBJIGFuZCBURUkgb24gdGhlIEUxIFRTICovCisJdV9pbnQ4X3Qgc2FwaTsKKwl1X2ludDhfdCB0ZWk7CisKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1X2ludDhfdCBjaGFubmVsOworCQl9IG1pc2RuOworCX0gZHJpdmVyOworfTsKKworZW51bSBlMWlucF90c190eXBlIHsKKwlFMUlOUF9UU19UWVBFX05PTkUsCisJRTFJTlBfVFNfVFlQRV9TSUdOLAorCUUxSU5QX1RTX1RZUEVfVFJBVSwKK307Citjb25zdCBjaGFyICplMWlucF90c3R5cGVfbmFtZShlbnVtIGUxaW5wX3RzX3R5cGUgdHApOworCisvKiBBIHRpbWVzbG90IGluIHRoZSBFMSBpbnRlcmZhY2UgKi8KK3N0cnVjdCBlMWlucF90cyB7CisJZW51bSBlMWlucF90c190eXBlIHR5cGU7CisJaW50IG51bTsKKworCS8qIHRvIHdoaWNoIGxpbmUgZG8gd2UgYmVsb25nID8gKi8KKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZTsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCS8qIGxpc3Qgb2YgYWxsIHNpZ25hbGxpbmcgbGlua3Mgb24gdGhpcyBUUyAqLworCQkJc3RydWN0IGxsaXN0X2hlYWQgc2lnbl9saW5rczsKKwkJCS8qIHRpbWVyIHdoZW4gdG8gZGVxdWV1ZSBuZXh0IGZyYW1lICovCisJCQlzdHJ1Y3QgdGltZXJfbGlzdCB0eF90aW1lcjsKKwkJfSBzaWduOworCQlzdHJ1Y3QgeworCQkJLyogc3ViY2hhbm5lbCBkZW11eGVyIGZvciBmcmFtZXMgZnJvbSBFMSAqLworCQkJc3RydWN0IHN1YmNoX2RlbXV4IGRlbXV4OworCQkJLyogc3ViY2hhbm5lbCBtdXhlciBmb3IgZnJhbWVzIHRvIEUxICovCisJCQlzdHJ1Y3Qgc3ViY2hfbXV4IG11eDsKKwkJfSB0cmF1OworCX07CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJLyogbUlTRE4gZHJpdmVyIGhhcyBvbmUgZmQgZm9yIGVhY2ggdHMgKi8KKwkJCXN0cnVjdCBic2NfZmQgZmQ7CisJCX0gbWlzZG47CisJCXN0cnVjdCB7CisJCQkvKiBpcC5hY2Nlc3MgZHJpdmVyIGhhcyBvbmUgZmQgZm9yIGVhY2ggdHMgKi8KKwkJCXN0cnVjdCBic2NfZmQgZmQ7CisJCX0gaXBhY2Nlc3M7CisKKwl9IGRyaXZlcjsKK307CisKK3N0cnVjdCBlMWlucF9kcml2ZXIgeworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgKCp3YW50X3dyaXRlKShzdHJ1Y3QgZTFpbnBfdHMgKnRzKTsKK307CQorCitzdHJ1Y3QgZTFpbnBfbGluZSB7CisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKwl1bnNpZ25lZCBpbnQgbnVtOworCWNvbnN0IGNoYXIgKm5hbWU7CisKKwkvKiBhcnJheSBvZiB0aW1lc3Rsb3RzICovCisJc3RydWN0IGUxaW5wX3RzIHRzW05VTV9FMV9UU107CisKKwlzdHJ1Y3QgZTFpbnBfZHJpdmVyICpkcml2ZXI7CisJdm9pZCAqZHJpdmVyX2RhdGE7Cit9OworCisvKiByZWdpc3RlciBhIGRyaXZlciB3aXRoIHRoZSBFMSBjb3JlICovCitpbnQgZTFpbnBfZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBlMWlucF9kcml2ZXIgKmRydik7CisKKy8qIHJlZ2lzdGVyIGEgbGluZSB3aXRoIHRoZSBFMSBjb3JlICovCitpbnQgZTFpbnBfbGluZV9yZWdpc3RlcihzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSk7CisKKy8qIGVuc3VyZSBhIGNlcnRhaW4gbGluZSBleGlzdHMsIHJldHVybiBwb2ludGVyIHRvIGl0ICovCitzdHJ1Y3QgZTFpbnBfbGluZSAqZTFpbnBfbGluZV9nZXRfY3JlYXRlKHVfaW50OF90IGUxX25yKTsKKworLyogZmluZCBhIHNpZ25fbGluayBmb3IgZ2l2ZW4gVEVJIGFuZCBTQVBJIGluIGEgVFMgKi8KK3N0cnVjdCBlMWlucF9zaWduX2xpbmsgKgorZTFpbnBfbG9va3VwX3NpZ25fbGluayhzdHJ1Y3QgZTFpbnBfdHMgKnRzLCB1X2ludDhfdCB0ZWksCisJCQl1X2ludDhfdCBzYXBpKTsKKworLyogY3JlYXRlIGEgbmV3IHNpZ25hbGxpbmcgbGluayBpbiBhIEUxIHRpbWVzbG90ICovCitzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICoKK2UxaW5wX3NpZ25fbGlua19jcmVhdGUoc3RydWN0IGUxaW5wX3RzICp0cywgZW51bSBlMWlucF9zaWduX3R5cGUgdHlwZSwKKwkJCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCB0ZWksCisJCQl1X2ludDhfdCBzYXBpKTsKKworLyogY29uZmlndXJlIGFuZCBpbml0aWFsaXplIG9uZSBlMWlucF90cyAqLworaW50IGUxaW5wX3RzX2NvbmZpZyhzdHJ1Y3QgZTFpbnBfdHMgKnRzLCBzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSwKKwkJICAgIGVudW0gZTFpbnBfdHNfdHlwZSB0eXBlKTsKKworLyogQ2FsbCBmcm9tIHRoZSBTdGFjazogY29uZmlndXJhdGlvbiBvZiB0aGlzIFRTIGhhcyBjaGFuZ2VkICovCitpbnQgZTFpbnBfdXBkYXRlX3RzKHN0cnVjdCBlMWlucF90cyAqdHMpOworCisvKiBSZWNlaXZlIGEgcGFja2V0IGZyb20gdGhlIEUxIGRyaXZlciAqLworaW50IGUxaW5wX3J4X3RzKHN0cnVjdCBlMWlucF90cyAqdHMsIHN0cnVjdCBtc2diICptc2csCisJCXVfaW50OF90IHRlaSwgdV9pbnQ4X3Qgc2FwaSk7CisKKy8qIGNhbGxlZCBieSBkcml2ZXIgaWYgaXQgd2FudHMgdG8gdHJhbnNtaXQgb24gYSBnaXZlbiBUUyAqLworc3RydWN0IG1zZ2IgKmUxaW5wX3R4X3RzKHN0cnVjdCBlMWlucF90cyAqZTFpX3RzLAorCQkJIHN0cnVjdCBlMWlucF9zaWduX2xpbmsgKipzaWduX2xpbmspOworCisvKiBjYWxsZWQgYnkgZHJpdmVyIGluIGNhc2Ugc29tZSBraW5kIG9mIGxpbmsgc3RhdGUgZXZlbnQgKi8KK2ludCBlMWlucF9ldmVudChzdHJ1Y3QgZTFpbnBfdHMgKnRzLCBpbnQgZXZ0LCB1X2ludDhfdCB0ZWksIHVfaW50OF90IHNhcGkpOworCisvKiBXcml0ZSBMQVBEIGZyYW1lcyB0byB0aGUgZmQuICovCit2b2lkIGUxX3NldF9wY2FwX2ZkKGludCBmZCk7CisKKy8qIGNhbGxlZCBieSBUUkFVIG11eGVyIHRvIG9idGFpbiB0aGUgZGVzdGluYXRpb24gbXV4IGVudGl0eSAqLworc3RydWN0IHN1YmNoX211eCAqZTFpbnBfZ2V0X211eCh1X2ludDhfdCBlMV9uciwgdV9pbnQ4X3QgdHNfbnIpOworCit2b2lkIGUxaW5wX3NpZ25fbGlua19kZXN0cm95KHN0cnVjdCBlMWlucF9zaWduX2xpbmsgKmxpbmspOworaW50IGUxaW5wX2xpbmVfdXBkYXRlKHN0cnVjdCBlMWlucF9saW5lICpsaW5lKTsKKworLyogZTFfY29uZmlnLmMgKi8KK2ludCBlMV9yZWNvbmZpZ190cyhzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzKTsKK2ludCBlMV9yZWNvbmZpZ190cngoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpOworaW50IGUxX3JlY29uZmlnX2J0cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKKworaW50IGlhX2NvbmZpZ19jb25uZWN0KHN0cnVjdCBnc21fYnRzICpidHMsIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luKTsKK2ludCBpcGFjY2Vzc19zZXR1cChzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldCk7CisKK2V4dGVybiBzdHJ1Y3QgbGxpc3RfaGVhZCBlMWlucF9kcml2ZXJfbGlzdDsKK2V4dGVybiBzdHJ1Y3QgbGxpc3RfaGVhZCBlMWlucF9saW5lX2xpc3Q7CisKKyNlbmRpZiAvKiBfRTFfSU5QVVRfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ2JfcHJveHkuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2diX3Byb3h5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBkZDVjYQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2diX3Byb3h5LmgKQEAgLTAsMCArMSwzOCBAQAorI2lmbmRlZiBfR0JfUFJPWFlfSAorI2RlZmluZSBfR0JfUFJPWFlfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfbnMuaD4KKworc3RydWN0IGdicHJveHlfY29uZmlnIHsKKwkvKiBwYXJzZWQgZnJvbSBjb25maWcgZmlsZSAqLworCXVfaW50MzJfdCBuc2lwX2xpc3Rlbl9pcDsKKwl1X2ludDE2X3QgbnNpcF9saXN0ZW5fcG9ydDsKKworCXVfaW50MzJfdCBuc2lwX3Nnc25faXA7CisJdV9pbnQxNl90IG5zaXBfc2dzbl9wb3J0OworCisJdV9pbnQxNl90IG5zaXBfc2dzbl9uc2VpOworCXVfaW50MTZfdCBuc2lwX3Nnc25fbnN2Y2k7CisKKwkvKiBtaXNjICovCisJc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpOworfTsKKworZXh0ZXJuIHN0cnVjdCBnYnByb3h5X2NvbmZpZyBnYmNmZzsKKworLyogZ2JfcHJveHlfdnR5IC5jICovCisKK2ludCBnYnByb3h5X3Z0eV9pbml0KHZvaWQpOworaW50IGdicHJveHlfcGFyc2VfY29uZmlnKGNvbnN0IGNoYXIgKmNvbmZpZ19maWxlLCBzdHJ1Y3QgZ2Jwcm94eV9jb25maWcgKmNmZyk7CisKKworLyogZ2JfcHJveHkuYyAqLworCisvKiBNYWluIGlucHV0IGZ1bmN0aW9uIGZvciBHYiBwcm94eSAqLworaW50IGdicHJveF9yY3Ztc2coc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdwcnNfbnN2YyAqbnN2YywgdWludDE2X3QgbnNfYnZjaSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3Byc19ic3NncC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3Byc19ic3NncC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMDk0YjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ncHJzX2Jzc2dwLmgKQEAgLTAsMCArMSwxNTEgQEAKKyNpZm5kZWYgX0dQUlNfQlNTR1BfSAorI2RlZmluZSBfR1BSU19CU1NHUF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyogU2VjdGlvbiAxMS4zLjI2IC8gVGFibGUgMTEuMjcgKi8KK2VudW0gYnNzZ3BfcGR1X3R5cGUgeworCS8qIFBEVXMgYmV0d2VlbiBSTCBhbmQgQlNTR1AgU0FQcyAqLworCUJTU0dQX1BEVVRfRExfVU5JVERBVEEJCT0gMHgwMCwKKwlCU1NHUF9QRFVUX1VMX1VOSVREQVRBCQk9IDB4MDEsCisJQlNTR1BfUERVVF9SQV9DQVBBQklMSVRZCT0gMHgwMiwKKwlCU1NHUF9QRFVUX1BUTV9VTklUREFUQQkJPSAweDAzLAorCS8qIFBEVXMgYmV0d2VlbiBHTU0gU0FQcyAqLworCUJTU0dQX1BEVVRfUEFHSU5HX1BTCQk9IDB4MDYsCisJQlNTR1BfUERVVF9QQUdJTkdfQ1MJCT0gMHgwNywKKwlCU1NHUF9QRFVUX1JBX0NBUEFfVURQQVRFCT0gMHgwOCwKKwlCU1NHUF9QRFVUX1JBX0NBUEFfVVBEQVRFX0FDSwk9IDB4MDksCisJQlNTR1BfUERVVF9SQURJT19TVEFUVVMJCT0gMHgwYSwKKwlCU1NHUF9QRFVUX1NVU1BFTkQJCT0gMHgwYiwKKwlCU1NHUF9QRFVUX1NVU1BFTkRfQUNLCQk9IDB4MGMsCisJQlNTR1BfUERVVF9TVVNQRU5EX05BQ0sJCT0gMHgwZCwKKwlCU1NHUF9QRFVUX1JFU1VNRQkJPSAweDBlLAorCUJTU0dQX1BEVVRfUkVTVU1FX0FDSwkJPSAweDBmLAorCUJTU0dQX1BEVVRfUkVTVU1FX05BQ0sJCT0gMHgxMCwKKwkvKiBQRHVzIGJldHdlZW4gTk0gU0FQcyAqLworCUJTU0dQX1BEVVRfQlZDX0JMT0NLCQk9IDB4MjAsCisJQlNTR1BfUERVVF9CVkNfQkxPQ0tfQUNLCT0gMHgyMSwKKwlCU1NHUF9QRFVUX0JWQ19SRVNFVAkJPSAweDIyLAorCUJTU0dQX1BEVVRfQlZDX1JFU0VUX0FDSwk9IDB4MjMsCisJQlNTR1BfUERVVF9CVkNfVU5CTE9DSwkJPSAweDI0LAorCUJTU0dQX1BEVVRfQlZDX1VOQkxPQ0tfQUNLCT0gMHgyNSwKKwlCU1NHUF9QRFVUX0ZMT1dfQ09OVFJPTF9CVkMJPSAweDI2LAorCUJTU0dQX1BEVVRfRkxPV19DT05UUk9MX0JWQ19BQ0sJPSAweDI3LAorCUJTU0dQX1BEVVRfRkxPV19DT05UUk9MX01TCT0gMHgyOCwKKwlCU1NHUF9QRFVUX0ZMT1dfQ09OVFJPTF9NU19BQ0sJPSAweDI5LAorCUJTU0dQX1BEVVRfRkxVU0hfTEwJCT0gMHgyYSwKKwlCU1NHUF9QRFVUX0ZMVVNIX0xMX0FDSwkJPSAweDJiLAorCUJTU0dQX1BEVVRfTExDX0RJU0NBUkQJCT0gMHgyYywKKwlCU1NHUF9QRFVUX1NHU05fSU5WT0tFX1RSQUNFCT0gMHg0MCwKKwlCU1NHUF9QRFVUX1NUQVRVUwkJPSAweDQxLAorCS8qIFBEVXMgYmV0d2VlbiBQRk0gU0FQJ3MgKi8KKwlCU1NHUF9QRFVUX0RPV05MT0FEX0JTU19QRkMJPSAweDUwLAorCUJTU0dQX1BEVVRfQ1JFQVRFX0JTU19QRkMJPSAweDUxLAorCUJTU0dQX1BEVVRfQ1JFQVRFX0JTU19QRkNfQUNLCT0gMHg1MiwKKwlCU1NHUF9QRFVUX0NSRUFURV9CU1NfUEZDX05BQ0sJPSAweDUzLAorCUJTU0dQX1BEVVRfTU9ESUZZX0JTU19QRkMJPSAweDU0LAorCUJTU0dQX1BEVVRfTU9ESUZZX0JTU19QRkNfQUNLCT0gMHg1NSwKKwlCU1NHUF9QRFVUX0RFTEVURV9CU1NfUEZDCT0gMHg1NiwKKwlCU1NHUF9QRFVUX0RFTEVURV9CU1NfUEZDX0FDSwk9IDB4NTcsCit9OworCisvKiBTZWN0aW9uIDEwLjIuMSBhbmQgMTAuMi4yICovCitzdHJ1Y3QgYnNzZ3BfdWRfaGRyIHsKKwl1aW50OF90IHBkdV90eXBlOworCXVpbnQzMl90IHRsbGk7CisJdWludDhfdCBxb3NfcHJvZmlsZVszXTsKKwl1aW50OF90IGRhdGFbMF07CS8qIFRMVidzICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgYnNzZ3Bfbm9ybWFsX2hkciB7CisJdWludDhfdCBwZHVfdHlwZTsKKwl1aW50OF90IGRhdGFbMF07CS8qIFRMVidzICovCit9OworCitlbnVtIGJzc2dwX2llaV90eXBlIHsKKwlCU1NHUF9JRV9BTElHTk1FTlQJCT0gMHgwMCwKKwlCU1NHUF9JRV9CTUFYX0RFRkFVTFRfTVMJPSAweDAxLAorCUJTU0dQX0lFX0JTU19BUkVBX0lECQk9IDB4MDIsCisJQlNTR1BfSUVfQlVDS0VUX0xFQUtfUkFURQk9IDB4MDMsCisJQlNTR1BfSUVfQlZDSQkJCT0gMHgwNCwKKwlCU1NHUF9JRV9CVkNfQlVDS0VUX1NJWkUJPSAweDA1LAorCUJTU0dQX0lFX0JWQ19NRUFTVVJFTUVOVAk9IDB4MDYsCisJQlNTR1BfSUVfQ0FVU0UJCQk9IDB4MDcsCisJQlNTR1BfSUVfQ0VMTF9JRAkJPSAweDA4LAorCUJTU0dQX0lFX0NIQU5fTkVFREVECQk9IDB4MDksCisJQlNTR1BfSUVfRFJYX1BBUkFNUwkJPSAweDBhLAorCUJTU0dQX0lFX0VNTFBQX1BSSU8JCT0gMHgwYiwKKwlCU1NHUF9JRV9GTFVTSF9BQ1RJT04JCT0gMHgwYywKKwlCU1NHUF9JRV9JTVNJCQkJPSAweDBkLAorCUJTU0dQX0lFX0xMQ19QRFUJCT0gMHgwZSwKKwlCU1NHUF9JRV9MTENfRlJBTUVTX0RJU0NBUkRFRAk9IDB4MGYsCisJQlNTR1BfSUVfTE9DQVRJT05fQVJFQQkJPSAweDEwLAorCUJTU0dQX0lFX01PQklMRV9JRAkJPSAweDExLAorCUJTU0dQX0lFX01TX0JVQ0tFVF9TSVpFCQk9IDB4MTIsCisJQlNTR1BfSUVfTVNfUkFESU9fQUNDRVNTX0NBUAk9IDB4MTMsCisJQlNTR1BfSUVfT01DX0lECQkJPSAweDE0LAorCUJTU0dQX0lFX1BEVV9JTl9FUlJPUgkJPSAweDE1LAorCUJTU0dQX0lFX1BEVV9MSUZFVElNRQkJPSAweDE2LAorCUJTU0dQX0lFX1BSSU9SSVRZCQk9IDB4MTcsCisJQlNTR1BfSUVfUU9TX1BST0ZJTEUJCT0gMHgxOCwKKwlCU1NHUF9JRV9SQURJT19DQVVTRQkJPSAweDE5LAorCUJTU0dQX0lFX1JBX0NBUF9VUERfQ0FVU0UJPSAweDFhLAorCUJTU0dQX0lFX1JPVVRFSU5HX0FSRUEJCT0gMHgxYiwKKwlCU1NHUF9JRV9SX0RFRkFVTFRfTVMJCT0gMHgxYywKKwlCU1NHUF9JRV9TVVNQRU5EX1JFRl9OUgkJPSAweDFkLAorCUJTU0dQX0lFX1RBRwkJCT0gMHgxZSwKKwlCU1NHUF9JRV9UTExJCQkJPSAweDFmLAorCUJTU0dQX0lFX1RNU0kJCQk9IDB4MjAsCisJQlNTR1BfSUVfVFJBQ0VfUkVGRVJFTkMJCT0gMHgyMSwKKwlCU1NHUF9JRV9UUkFDRV9UWVBFCQk9IDB4MjIsCisJQlNTR1BfSUVfVFJBTlNBQ1RJT05fSUQJCT0gMHgyMywKKwlCU1NHUF9JRV9UUklHR0VSX0lECQk9IDB4MjQsCisJQlNTR1BfSUVfTlVNX09DVF9BRkYJCT0gMHgyNSwKKwlCU1NHUF9JRV9MU0FfSURfTElTVAkJPSAweDI2LAorCUJTU0dQX0lFX0xTQV9JTkZPUk1BVElPTgk9IDB4MjcsCisJQlNTR1BfSUVfUEFDS0VUX0ZMT1dfSUQJCT0gMHgyOCwKKwlCU1NHUF9JRV9QQUNLRVRfRkxPV19USU1FUgk9IDB4MjksCisJQlNTR1BfSUVfQUdHX0JTU19RT1NfUFJPRklMRQk9IDB4M2EsCisJQlNTR1BfSUVfRkVBVFVSRV9CSVRNQVAJCT0gMHgzYiwKKwlCU1NHUF9JRV9CVUNLRVRfRlVMTF9SQVRJTwk9IDB4M2MsCisJQlNTR1BfSUVfU0VSVklDRV9VVFJBTl9DQ08JPSAweDNkLAorfTsKKworLyogU2VjdGlvbiAxMS4zLjggLyBUYWJsZSAxMS4xMDogQ2F1c2UgY29kaW5nICovCitlbnVtIGdwcnNfYnNzZ3BfY2F1c2UgeworCUJTU0dQX0NBVVNFX1BST0NfT1ZFUkxPQUQJPSAweDAwLAorCUJTU0dQX0NBVVNFX0VRVUlQX0ZBSUwJCT0gMHgwMSwKKwlCU1NHUF9DQVVTRV9UUkFTSVRfTkVUX0ZBSUwJPSAweDAyLAorCUJTU0dQX0NBVVNFX0NBUEFfR1JFQVRFUl8wS1BCUwk9IDB4MDMsCisJQlNTR1BfQ0FVU0VfVU5LTk9XTl9NUwkJPSAweDA0LAorCUJTU0dQX0NBVVNFX1VOS05PV05fQlZDSQk9IDB4MDUsCisJQlNTR1BfQ0FVU0VfQ0VMTF9UUkFGX0NPTkcJPSAweDA2LAorCUJTU0dQX0NBVVNFX1NHU05fQ09ORwkJPSAweDA3LAorCUJTU0dQX0NBVVNFX09NTF9JTlRFUlYJCT0gMHgwOCwKKwlCU1NHUF9DQVVTRV9CVkNJX0JMT0NLRUQJPSAweDA5LAorCUJTU0dQX0NBVVNFX1BGQ19DUkVBVEVfRkFJTAk9IDB4MGEsCisJQlNTR1BfQ0FVU0VfU0VNX0lOQ09SUl9QRFUJPSAweDIwLAorCUJTU0dQX0NBVVNFX0lOVl9NQU5EX0lORgk9IDB4MjEsCisJQlNTR1BfQ0FVU0VfTUlTU0lOR19NQU5EX0lFCT0gMHgyMiwKKwlCU1NHUF9DQVVTRV9NSVNTSU5HX0NPTkRfSUUJPSAweDIzLAorCUJTU0dQX0NBVVNFX1VORVhQX0NPTkRfSUUJPSAweDI0LAorCUJTU0dQX0NBVVNFX0NPTkRfSUVfRVJSCQk9IDB4MjUsCisJQlNTR1BfQ0FVU0VfUERVX0lOQ09NUF9TVEFURQk9IDB4MjYsCisJQlNTR1BfQ0FVU0VfUFJPVE9fRVJSX1VOU1BFQwk9IDB4MjcsCisJQlNTR1BfQ0FVU0VfUERVX0lOQ09NUF9GRUFUCT0gMHgyOCwKK307CisKKy8qIE91ciBpbXBsZW1lbnRhdGlvbiAqLworCisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisKK2V4dGVybiBpbnQgZ3Byc19ic3NncF9yY3Ztc2coc3RydWN0IG1zZ2IgKm1zZyk7Cit1aW50MTZfdCBic3NncF9wYXJzZV9jZWxsX2lkKHN0cnVjdCBncHJzX3JhX2lkICpyYWlkLCBjb25zdCB1aW50OF90ICpidWYpOworCisvKiBXcmFwcGVyIGFyb3VuZCBUTFYgcGFyc2VyIHRvIHBhcnNlIEJTU0dQIElFcyAqLworc3RhdGljIGlubGluZSBpbnQgYnNzZ3BfdGx2X3BhcnNlKHN0cnVjdCB0bHZfcGFyc2VkICp0cCwgdWludDhfdCAqYnVmLCBpbnQgbGVuKQoreworCXJldHVybiB0bHZfcGFyc2UodHAsICZ0dmx2X2F0dF9kZWYsIGJ1ZiwgbGVuLCAwLCAwKTsKK30KKworI2VuZGlmIC8qIF9HUFJTX0JTU0dQX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dwcnNfbGxjLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ncHJzX2xsYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNjY4MmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ncHJzX2xsYy5oCkBAIC0wLDAgKzEsMzIgQEAKKyNpZm5kZWYgX0dQUlNfTExDX0gKKyNkZWZpbmUgX0dQUlNfTExDX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiBTZWN0aW9uIDQuNyBMTEMgTGF5ZXIgU3RydWN0dXJlICovCitlbnVtIGdwcnNfbGxjX3NhcGkgeworCUdQUlNfU0FQSV9HTU0JCT0gMSwKKwlHUFJTX1NBUElfVE9NMgkJPSAyLAorCUdQUlNfU0FQSV9TTkRDUDMJPSAzLAorCUdQUlNfU0FQSV9TTkRDUDUJPSA1LAorCUdQUlNfU0FQSV9TTVMJCT0gNywKKwlHUFJTX1NBUElfVE9NOAkJPSA4LAorCUdQUlNfU0FQSV9TTkRDUDkJPSA5LAorCUdQUlNfU0FQSV9TTkRDUDExCT0gMTEsCit9OworCisvKiBTZWN0aW9uIDYuNCBDb21tYW5kcyBhbmQgUmVzcG9uc2VzICovCitlbnVtIGdwcnNfbGxjX3VfY21kIHsKKwlHUFJTX0xMQ19VX0RNX1JFU1AJCT0gMHgwMSwKKwlHUFJTX0xMQ19VX0RJU0NfQ01ECQk9IDB4MDQsCisJR1BSU19MTENfVV9VQV9SRVNQCQk9IDB4MDYsCisJR1BSU19MTENfVV9TQUJNX0NNRAkJPSAweDA3LAorCUdQUlNfTExDX1VfRlJNUl9SRVNQCQk9IDB4MDgsCisJR1BSU19MTENfVV9YSUQJCQk9IDB4MGIsCisJR1BSU19MTENfVV9OVUxMX0NNRAkJPSAweDAwLAorfTsKKworaW50IGdwcnNfbGxjX3Jjdm1zZyhzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgdGx2X3BhcnNlZCAqdHYpOworaW50IGdwcnNfbGxjX3R4X3VpKHN0cnVjdCBtc2diICptc2csIHVpbnQ4X3Qgc2FwaSwgaW50IGNvbW1hbmQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dwcnNfbnMuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dwcnNfbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2M1NGNiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3Byc19ucy5oCkBAIC0wLDAgKzEsMTc4IEBACisjaWZuZGVmIF9HUFJTX05TX0gKKyNkZWZpbmUgX0dQUlNfTlNfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIEdQUlMgTmV0d29ya3MgU2VydmljZSAoTlMpIG1lc3NhZ2VzIG9uIHRoZSBHYiBpbnRlcmZhY2UKKyAqIDNHUFAgVFMgMDguMTYgdmVyc2lvbiA4LjAuMSBSZWxlYXNlIDE5OTkgLyBFVFNJIFRTIDEwMSAyOTkgVjguMC4xICgyMDAyLTA1KQorICogM0dQUCBUUyA0OC4wMTYgdmVyc2lvbiA2LjUuMCBSZWxlYXNlIDYgLyBFVFNJIFRTIDE0OCAwMTYgVjYuNS4wICgyMDA1LTExKSAqLworCitzdHJ1Y3QgZ3Byc19uc19oZHIgeworCXVpbnQ4X3QgcGR1X3R5cGU7CisJdWludDhfdCBkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogVFMgMDguMTYsIFNlY3Rpb24gMTAuMy43LCBUYWJsZSAxNCAqLworZW51bSBuc19wZHVfdHlwZSB7CisJTlNfUERVVF9VTklUREFUQQk9IDB4MDAsCisJTlNfUERVVF9SRVNFVAkJPSAweDAyLAorCU5TX1BEVVRfUkVTRVRfQUNLCT0gMHgwMywKKwlOU19QRFVUX0JMT0NLCQk9IDB4MDQsCisJTlNfUERVVF9CTE9DS19BQ0sJPSAweDA1LAorCU5TX1BEVVRfVU5CTE9DSwkJPSAweDA2LAorCU5TX1BEVVRfVU5CTE9DS19BQ0sJPSAweDA3LAorCU5TX1BEVVRfU1RBVFVTCQk9IDB4MDgsCisJTlNfUERVVF9BTElWRQkJPSAweDBhLAorCU5TX1BEVVRfQUxJVkVfQUNLCT0gMHgwYiwKKwkvKiBUUyA0OC4wMTYgU2VjdGlvbiAxMC4zLjcsIFRhYmxlIDEwLjMuNy4xICovCisJU05TX1BEVVRfQUNLCQk9IDB4MGMsCisJU05TX1BEVVRfQURECQk9IDB4MGQsCisJU05TX1BEVVRfQ0hBTkdFX1dFSUdIVAk9IDB4MGUsCisJU05TX1BEVVRfQ09ORklHCQk9IDB4MGYsCisJU05TX1BEVVRfQ09ORklHX0FDSwk9IDB4MTAsCisJU05TX1BEVVRfREVMRVRFCQk9IDB4MTEsCisJU05TX1BEVVRfU0laRQkJPSAweDEyLAorCVNOU19QRFVUX1NJWkVfQUNLCT0gMHgxMywKK307CisKKy8qIFRTIDA4LjE2LCBTZWN0aW9uIDEwLjMsIFRhYmxlIDEyICovCitlbnVtIG5zX2N0cmxfaWUgeworCU5TX0lFX0NBVVNFCQk9IDB4MDAsCisJTlNfSUVfVkNJCQk9IDB4MDEsCisJTlNfSUVfUERVCQk9IDB4MDIsCisJTlNfSUVfQlZDSQkJPSAweDAzLAorCU5TX0lFX05TRUkJCT0gMHgwNCwKKwkvKiBUUyA0OC4wMTYgU2VjdGlvbiAxMC4zLCBUYWJsZSAxMC4zLjEgKi8KKwlOU19JRV9JUHY0X0xJU1QJCT0gMHgwNSwKKwlOU19JRV9JUHY2X0xJU1QJCT0gMHgwNiwKKwlOU19JRV9NQVhfTlJfTlNWQwk9IDB4MDcsCisJTlNfSUVfSVB2NF9FUF9OUgk9IDB4MDgsCisJTlNfSUVfSVB2Nl9FUF9OUgk9IDB4MDksCisJTlNfSUVfUkVTRVRfRkxBRwk9IDB4MGEsCisJTlNfSUVfSVBfQUREUgkJPSAweDBiLAorfTsKKworLyogVFMgMDguMTYsIFNlY3Rpb24gMTAuMy4yLCBUYWJsZSAxMyAqLworZW51bSBuc19jYXVzZSB7CisJTlNfQ0FVU0VfVFJBTlNJVF9GQUlMCQk9IDB4MDAsCisJTlNfQ0FVU0VfT01fSU5URVJWRU5USU9OCT0gMHgwMSwKKwlOU19DQVVTRV9FUVVJUF9GQUlMCQk9IDB4MDIsCisJTlNfQ0FVU0VfTlNWQ19CTE9DS0VECQk9IDB4MDMsCisJTlNfQ0FVU0VfTlNWQ19VTktOT1dOCQk9IDB4MDQsCisJTlNfQ0FVU0VfQlZDSV9VTktOT1dOCQk9IDB4MDUsCisJTlNfQ0FVU0VfU0VNX0lOQ09SUl9QRFUJCT0gMHgwOCwKKwlOU19DQVVTRV9QRFVfSU5DT01QX1BTVEFURQk9IDB4MGEsCisJTlNfQ0FVU0VfUFJPVE9fRVJSX1VOU1BFQwk9IDB4MGIsCisJTlNfQ0FVU0VfSU5WQUxfRVNTRU5UX0lFCT0gMHgwYywKKwlOU19DQVVTRV9NSVNTSU5HX0VTU0VOVF9JRQk9IDB4MGQsCisJLyogVFMgNDguMDE2IFNlY3Rpb24gMTAuMy4yLCBUYWJsZSAxMC4zLjIuMSAqLworCU5TX0NBVVNFX0lOVkFMX05SX0lQdjRfRVAJPSAweDBlLAorCU5TX0NBVVNFX0lOVkFMX05SX0lQdjZfRVAJPSAweDBmLAorCU5TX0NBVVNFX0lOVkFMX05SX05TX1ZDCQk9IDB4MTAsCisJTlNfQ0FVU0VfSU5WQUxfV0VJR0gJCT0gMHgxMSwKKwlOU19DQVVTRV9VTktOX0lQX0VQCQk9IDB4MTIsCisJTlNfQ0FVU0VfVU5LTl9JUF9BRERSCQk9IDB4MTMsCisJTlNfQ0FVU0VfVU5LTl9JUF9URVNUX0ZBSUxFRAk9IDB4MTQsCit9OworCisKKy8qIE91ciBJbXBsZW1lbnRhdGlvbiAqLworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGltZXIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKworI2RlZmluZSBOU0VfU19CTE9DS0VECTB4MDAwMQorI2RlZmluZSBOU0VfU19BTElWRQkweDAwMDIKKworZW51bSBncHJzX25zX2xsIHsKKwlHUFJTX05TX0xMX1VEUCwKKwlHUFJTX05TX0xMX0UxLAorfTsKKworZW51bSBncHJzX25zX2V2dCB7CisJR1BSU19OU19FVlRfVU5JVF9EQVRBLAorfTsKKworc3RydWN0IGdwcnNfbnN2YzsKK3R5cGVkZWYgaW50IGdwcnNfbnNfY2JfdChlbnVtIGdwcnNfbnNfZXZ0IGV2ZW50LCBzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjLAorCQkJIHN0cnVjdCBtc2diICptc2csIHVpbnQxNl90IGJ2Y2kpOworCisvKiBBbiBpbnN0YW5jZSBvZiB0aGUgTlMgcHJvdG9jb2wgc3RhY2sgKi8KK3N0cnVjdCBncHJzX25zX2luc3QgeworCS8qIGNhbGxiYWNrIHRvIHRoZSB1c2VyIGZvciBpbmNvbWluZyBVTklUIERBVEEgSU5EICovCisJZ3Byc19uc19jYl90ICpjYjsKKworCS8qIGxpbmtlZCBsaXN0cyBvZiBhbGwgTlNWQyBpbiB0aGlzIGluc3RhbmNlICovCisJc3RydWN0IGxsaXN0X2hlYWQgZ3Byc19uc3ZjczsKKworCS8qIHdoaWNoIGxpbmstbGF5ZXIgYXJlIHdlIGJhc2VkIG9uPyAqLworCWVudW0gZ3Byc19uc19sbCBsbDsKKworCXVuaW9uIHsKKwkJLyogTlMtb3Zlci1JUCBzcGVjaWZpYyBiaXRzICovCisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgYnNjX2ZkIGZkOworCQl9IG5zaXA7CisJfTsKK307CisKK2VudW0gbnN2Y190aW1lcl9tb2RlIHsKKwkvKiBzdGFuZGFyZCB0aW1lcnMgKi8KKwlOU1ZDX1RJTUVSX1ROU19URVNULAorCU5TVkNfVElNRVJfVE5TX0FMSVZFLAorCU5TVkNfVElNRVJfVE5TX1JFU0VULAorCV9OU1ZDX1RJTUVSX05SLAorfTsKKworc3RydWN0IGdwcnNfbnN2YyB7CisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2k7CisKKwl1aW50MTZfdCBuc2VpOwkJLyogZW5kLXRvLWVuZCBzaWduaWZpY2FuY2UgKi8KKwl1aW50MTZfdCBuc3ZjaTsJLyogdW5pcXVlbHkgaWRlbnRpZmllcyBOUy1WQyBhdCBTR1NOICovCisKKwl1aW50MzJfdCBzdGF0ZTsKKwl1aW50MzJfdCByZW1vdGVfc3RhdGU7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwllbnVtIG5zdmNfdGltZXJfbW9kZSB0aW1lcl9tb2RlOworCWludCBhbGl2ZV9yZXRyaWVzOworCisJaW50IHJlbW90ZV9lbmRfaXNfc2dzbjsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBzb2NrYWRkcl9pbiBidHNfYWRkcjsKKwkJfSBpcDsKKwl9OworfTsKKworLyogQ3JlYXRlIGEgbmV3IE5TIHByb3RvY29sIGluc3RhbmNlICovCitzdHJ1Y3QgZ3Byc19uc19pbnN0ICpncHJzX25zX2luc3RhbnRpYXRlKGdwcnNfbnNfY2JfdCAqY2IpOworCisvKiBEZXN0cm95IGEgTlMgcHJvdG9jb2wgaW5zdGFuY2UgKi8KK3ZvaWQgZ3Byc19uc19kZXN0cm95KHN0cnVjdCBncHJzX25zX2luc3QgKm5zaSk7CisKKy8qIExpc3RlbiBmb3IgaW5jb21pbmcgR1BSUyBwYWNrZXRzICovCitpbnQgbnNpcF9saXN0ZW4oc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpLCB1aW50MTZfdCB1ZHBfcG9ydCk7CisKK3N0cnVjdCBzb2NrYWRkcl9pbjsKKworLyogbWFpbiBlbnRyeSBwb2ludCwgaGVyZSBpbmNvbWluZyBOUyBmcmFtZXMgZW50ZXIgKi8KK2ludCBncHJzX25zX3Jjdm1zZyhzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2ksIHN0cnVjdCBtc2diICptc2csCisJCSAgIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2FkZHIpOworCisvKiBtYWluIGZ1bmN0aW9uIGZvciBoaWdoZXIgbGF5ZXJzIChCU1NHUCkgdG8gc2VuZCBOUyBtZXNzYWdlcyAqLworaW50IGdwcnNfbnNfc2VuZG1zZyhzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2ksIHN0cnVjdCBtc2diICptc2cpOworCisKKy8qIExpc3RlbiBmb3IgaW5jb21pbmcgR1BSUyBwYWNrZXRzICovCitpbnQgbnNpcF9saXN0ZW4oc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpLCB1aW50MTZfdCB1ZHBfcG9ydCk7CisKKy8qIEVzdGFibGlzaCBhIGNvbm5lY3Rpb24gKGZyb20gdGhlIEJTUykgdG8gdGhlIFNHU04gKi8KK3N0cnVjdCBncHJzX25zdmMgKm5zaXBfY29ubmVjdChzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2ksCisJCQkJc3RydWN0IHNvY2thZGRyX2luICpkZXN0LCB1aW50MTZfdCBuc2VpLAorCQkJCXVpbnQxNl90IG5zdmNpKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3Byc19zZ3NuLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ncHJzX3Nnc24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGMwYjFjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3Byc19zZ3NuLmgKQEAgLTAsMCArMSwxMTQgQEAKKyNpZm5kZWYgX0dQUlNfU0dTTl9ICisjZGVmaW5lIF9HUFJTX1NHU05fSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIFRTIDA0LjA4IDQuMS4zLjMgR01NIG1vYmlsaXR5IG1hbmFnZW1lbnQgc3RhdGVzIG9uIHRoZSBuZXR3b3JrIHNpZGUgKi8KK2VudW0gZ3Byc19tbV9zdGF0ZSB7CisJR01NX0RFUkVHSVNURVJFRCwJCS8qIDQuMS4zLjMuMS4xICovCisJR01NX0NPTU1PTl9QUk9DX0lOSVQsCQkvKiA0LjEuMy4zLjEuMiAqLworCUdNTV9SRUdJU1RFUkVEX05PUk1BTCwJCS8qIDQuMS4zLjMuMi4xICovCisJR01NX1JFR0lTVEVSRURfU1VTUEVOREVELAkvKiA0LjEuMy4zLjIuMiAqLworCUdNTV9ERVJFR0lTVEVSRURfSU5JVCwJCS8qIDQuMS4zLjMuMS40ICovCit9OworCitlbnVtIGdwcnNfY2lwaF9hbGdvIHsKKwlHUFJTX0FMR09fR0VBMCwKKwlHUFJTX0FMR09fR0VBMSwKKwlHUFJTX0FMR09fR0VBMiwKK307CisKKyNkZWZpbmUgTVNfUkFESU9fQUNDRVNTX0NBUEEKKworLyogQWNjb3JkaW5nIHRvIFRTIDAzLjYwLCBUYWJsZSA1OiBTR1NOIE1NIGFuZCBQRFAgQ29udGV4dHMgKi8KKy8qIEV4dGVuZGVkIGJ5IDNHUFAgVFMgMjMuMDYwLCBUYWJsZSA2OiBTR1NOIE1NIGFuZCBQRFAgQ29udGV4dHMgKi8KK3N0cnVjdCBzZ3NuX21tX2N0eCB7CisJc3RydWN0IGxsaXN0X2hlYWQJbGlzdDsKKworCWNoYXIgCQkJaW1zaVtHU01fSU1TSV9MRU5HVEhdOworCWVudW0gZ3Byc19tbV9zdGF0ZQltbV9zdGF0ZTsKKwl1aW50MzJfdCAJCXBfdG1zaTsKKwl1aW50MzJfdCAJCXBfdG1zaV9zaWc7CisJY2hhciAJCQlpbWVpW0dTTV9JTUVJX0xFTkdUSF07CisJLyogT3B0OiBTb2Z0d2FyZSBWZXJzaW9uIE51bWJiZXIgLyBUUyAyMy4xOTUgKi8KKwljaGFyIAkJCW1zaXNkbltHU01fRVhURU5TSU9OX0xFTkdUSF07CisJc3RydWN0IGdwcnNfcmFfaWQJcmE7CisJdWludDE2X3QJCWNlbGxfaWQ7CisJdWludDMyX3QJCWNlbGxfaWRfYWdlOworCXVpbnQxNl90CQlzYWM7CS8qIEl1OiBTZXJ2aWNlIEFyZWEgQ29kZSAqLworCXVpbnQzMl90CQlzYWNfYWdlOy8qIEl1OiBTZXJ2aWNlIEFyZWEgQ29kZSBhZ2UgKi8KKwkvKiBWTFIgbnVtYmVyICovCisJdWludDMyX3QJCW5ld19zZ3NuX2FkZHI7CisJLyogQXV0aGVudGljYXRpb24gVHJpcGxldHMgKi8KKwkvKiBLYyAqLworCS8qIEl1OiBDSywgSUssIEtTSSAqLworCS8qIENLU04gKi8KKwllbnVtIGdwcnNfY2lwaF9hbGdvCWNpcGhfYWxnbzsKKwlzdHJ1Y3QgeworCQl1aW50OF90CWJ1ZlsxNF07CS8qIDEwLjUuNS4xMmEgKi8KKwkJdWludDhfdAlsZW47CisJfSBtc19yYWRpb19hY2Nlc3NfY2FwYTsKKwlzdHJ1Y3QgeworCQl1aW50OF90CWJ1Zls0XTsJCS8qIDEwLjUuNS4xMiAqLworCQl1aW50OF90CWxlbjsKKwl9IG1zX25ldHdvcmtfY2FwYTsKKwl1aW50MTZfdAkJZHJ4X3Bhcm1zOworCWludAkJCW1ucmc7CS8qIE1TIHJlcG9ydGVkIHRvIEhMUj8gKi8KKwlpbnQJCQluZ2FmOwkvKiBNUyByZXBvcnRlZCB0byBNU0MvVkxSPyAqLworCWludAkJCXBwZjsJLyogcGFnaW5nIGZvciBHUFJTICsgbm9uLUdQUlM/ICovCisJLyogU01TIFBhcmFtZXRlcnMgKi8KKwlpbnQJCQlyZWNvdmVyeTsKKwl1aW50OF90CQkJcmFkaW9fcHJpb19zbXM7CisKKwlzdHJ1Y3QgbGxpc3RfaGVhZAlwZHBfbGlzdDsKKworCS8qIEFkZGl0aW9uYWwgYml0cyBub3QgcHJlc2VudCBpbiB0aGUgR1NNIFRTICovCisJdWludDMyX3QJCXRsbGk7CisJc3RydWN0IHRpbWVyX2xpc3QJdGltZXI7CisJdW5zaWduZWQgaW50CQlUOworfTsKKworZW51bSBwZHBfY3R4X3N0YXRlIHsKKwlQRFBfU1RBRV9OT05FLAorfTsKKworZW51bSBwZHBfdHlwZSB7CisJUERQX1RZUEVfTk9ORSwKK307CisKK3N0cnVjdCBzZ3NuX3BkcF9jdHggeworCXN0cnVjdCBsbGlzdF9oZWFkCWxpc3Q7CisKKwl1bnNpZ25lZCBpbnQJCWlkOworCWVudW0gcGRwX2N0eF9zdGF0ZQlzdGF0ZTsKKwllbnVtIHBkcF90eXBlCQl0eXBlOworCXVpbnQzMl90CQlhZGRyZXNzczsKKwljaGFyIAkJCSphcG5fc3Vic2NyaWJlZDsKKwljaGFyIAkJCSphcG5fdXNlZDsKKwl1aW50MTZfdAkJbnNhcGk7CisJdWludDhfdAkJCXRpOwkvKiB0cmFuc2FjdGlvbiBpZGVudGlmaWVyICovCisJdWludDMyX3QJCWdnc25faW5fdXNlOworCWludAkJCXZwbG1uX2FsbG93ZWQ7CisJdWludDMyX3QJCXFvc19wcm9maWxlX3N1YnNjcjsKKwl1aW50MzJfdAkJcW9zX3Byb2ZpbGVfcmVxOworCXVpbnQzMl90CQlxb3NfcHJvZmlsZV9uZWc7CisJdWludDhfdAkJCXJhZGlvX3ByaW87CisJdWludDMyX3QJCXR4X25wZHVfbnI7CisJdWludDMyX3QJCXJ4X25wZHVfbnI7CisJdWludDMyX3QJCXR4X2d0cF9zbmQ7CisJdWludDMyX3QJCXJ4X2d0cF9zbnU7CisJdWludDMyX3QJCWNoYXJnaW5nX2lkOworCWludAkJCXJlb3JkZXJpbmdfcmVxZDsKK307CisKKy8qIGxvb2stdXAgYSBTR1NOIE1NIGNvbnRleHQgYmFzZWQgb24gVExMSSArIFJBSSAqLworc3RydWN0IHNnc25fbW1fY3R4ICpzZ3NuX21tX2N0eF9ieV90bGxpKHVpbnQzMl90IHRsbGksCisJCQkJCWNvbnN0IHN0cnVjdCBncHJzX3JhX2lkICpyYWlkKTsKK3N0cnVjdCBzZ3NuX21tX2N0eCAqc2dzbl9tbV9jdHhfYnlfcHRtc2kodWludDMyX3QgdG1zaSk7CitzdHJ1Y3Qgc2dzbl9tbV9jdHggKnNnc25fbW1fY3R4X2J5X2ltc2koY29uc3QgY2hhciAqaW1zaSk7CisKKy8qIEFsbG9jYXRlIGEgbmV3IFNHU04gTU0gY29udGV4dCAqLworc3RydWN0IHNnc25fbW1fY3R4ICpzZ3NuX21tX2N0eF9hbGxvYyh1aW50MzJfdCB0bGxpLAorCQkJCQljb25zdCBzdHJ1Y3QgZ3Byc19yYV9pZCAqcmFpZCk7CisKKyNlbmRpZiAvKiBfR1BSU19TR1NOX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF8wOC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtXzA0XzA4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRkY2JlNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF8wOC5oCkBAIC0wLDAgKzEsNjMgQEAKKyNpZm5kZWYgX0dTTV8wNF8wOF9ICisjZGVmaW5lIF9HU01fMDRfMDhfSAorCisjaW5jbHVkZSA8b3BlbmJzYy9tZWFzX3JlcC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtNDguaD4KKworc3RydWN0IG1zZ2I7CitzdHJ1Y3QgZ3NtX2J0czsKK3N0cnVjdCBnc21fc3Vic2NyaWJlcjsKK3N0cnVjdCBnc21fbmV0d29yazsKK3N0cnVjdCBnc21fdHJhbnM7CisKKyNkZWZpbmUgR1NNNDhfQUxMT0NfU0laRQkxMDI0CisjZGVmaW5lIEdTTTQ4X0FMTE9DX0hFQURST09NCTEyOAorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtc2diICpnc200OF9tc2diX2FsbG9jKHZvaWQpCit7CisJcmV0dXJuIG1zZ2JfYWxsb2NfaGVhZHJvb20oR1NNNDhfQUxMT0NfU0laRSwgR1NNNDhfQUxMT0NfSEVBRFJPT00sCisJCQkJICAgIkdTTSAwNC4wOCIpOworfQorCisvKiBjb25maWcgb3B0aW9ucyBjb250cm9sbGluZyB0aGUgYmVoYXZpb3VyIG9mIHRoZSBsb3dlciBsZXZlcyAqLwordm9pZCBnc20wNDA4X2FsbG93X2V2ZXJ5b25lKGludCBhbGxvdyk7CisKK2ludCBnc20wNDA4X3Jjdm1zZyhzdHJ1Y3QgbXNnYiAqbXNnLCB1X2ludDhfdCBsaW5rX2lkKTsKK2VudW0gZ3NtX2NoYW5fdCBnZXRfY3R5cGVfYnlfY2hyZXEoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgcmEsIGludCBuZWNpKTsKK2VudW0gZ3NtX2NocmVxX3JlYXNvbl90IGdldF9yZWFzb25fYnlfY2hyZXEoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgcmEsIGludCBuZWNpKTsKKworaW50IGdzbTQ4X3R4X21tX2luZm8oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworaW50IGdzbTQ4X3R4X21tX2F1dGhfcmVxKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCAqcmFuZCwgaW50IGtleV9zZXEpOworaW50IGdzbTQ4X3R4X21tX2F1dGhfcmVqKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKK2ludCBnc200OF9zZW5kbXNnKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zKTsKKworaW50IGdzbTQ4X3NlbmRfcnJfcmVsZWFzZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7CitpbnQgZ3NtNDhfc2VuZF9ycl9jaXBoX21vZGUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIGludCB3YW50X2ltZWlzdik7CitpbnQgZ3NtNDhfc2VuZF9ycl9hcHBfaW5mbyhzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgYXBkdV9pZCwKKwkJCSAgIHVfaW50OF90IGFwZHVfbGVuLCBjb25zdCB1X2ludDhfdCAqYXBkdSk7CitpbnQgZ3NtNDhfc2VuZF9ycl9hc3NfY21kKHN0cnVjdCBnc21fbGNoYW4gKmRlc3RfbGNoYW4sIHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBwb3dlcl9jbGFzcyk7CitpbnQgZ3NtNDhfc2VuZF9ob19jbWQoc3RydWN0IGdzbV9sY2hhbiAqb2xkX2xjaGFuLCBzdHJ1Y3QgZ3NtX2xjaGFuICpuZXdfbGNoYW4sCisJCSAgICAgIHVfaW50OF90IHBvd2VyX2NvbW1hbmQsIHVfaW50OF90IGhvX3JlZik7CisKK2ludCBic2NfdXBxdWV1ZShzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCk7CisKK2ludCBtbmNjX3NlbmQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGludCBtc2dfdHlwZSwgdm9pZCAqYXJnKTsKKworLyogY29udmVydCBhIEFTQ0lJIHBob25lIG51bWJlciB0byBjYWxsLWNvbnRyb2wgQkNEICovCitpbnQgZW5jb2RlX2JjZF9udW1iZXIodV9pbnQ4X3QgKmJjZF9sdiwgdV9pbnQ4X3QgbWF4X2xlbiwKKwkJICAgICAgaW50IGhfbGVuLCBjb25zdCBjaGFyICppbnB1dCk7CitpbnQgZGVjb2RlX2JjZF9udW1iZXIoY2hhciAqb3V0cHV0LCBpbnQgb3V0cHV0X2xlbiwgY29uc3QgdV9pbnQ4X3QgKmJjZF9sdiwKKwkJICAgICAgaW50IGhfbGVuKTsKKworaW50IHNlbmRfc2llbWVuc19tcnBjaShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgKmNsYXNzbWFyazJfbHYpOworaW50IGdzbTQ4X3BhZ2luZ19leHRyYWN0X21pKHN0cnVjdCBtc2diICptc2csIGNoYXIgKm1pX3N0cmluZywgdV9pbnQ4X3QgKm1pX3R5cGUpOworaW50IGdzbTQ4X2hhbmRsZV9wYWdpbmdfcmVzcChzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CisKK2ludCBnc200OF9sY2hhbl9tb2RpZnkoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGxjaGFuX21vZGUpOworaW50IGdzbTQ4X3J4X3JyX21vZGlmX2FjayhzdHJ1Y3QgbXNnYiAqbXNnKTsKK2ludCBnc200OF9wYXJzZV9tZWFzX3JlcChzdHJ1Y3QgZ3NtX21lYXNfcmVwICpyZXAsIHN0cnVjdCBtc2diICptc2cpOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtXzA0XzA4X2dwcnMuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF8wOF9ncHJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ0YjI3NwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF8wOF9ncHJzLmgKQEAgLTAsMCArMSwzNTAgQEAKKyNpZm5kZWYgX0dTTTQ4X0dQUlNfSAorI2RlZmluZSBfR1NNNDhfR1BSU19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyogVGFibGUgMTAuNCAvIDEwLjRhLCBHUFJTIE1vYmlsaXR5IE1hbmFnZW1lbnQgKEdNTSkgKi8KKyNkZWZpbmUgR1NNNDhfTVRfR01NX0FUVEFDSF9SRVEJCTB4MDEKKyNkZWZpbmUgR1NNNDhfTVRfR01NX0FUVEFDSF9BQ0sJCTB4MDIKKyNkZWZpbmUgR1NNNDhfTVRfR01NX0FUVEFDSF9DT01QTAkweDAzCisjZGVmaW5lIEdTTTQ4X01UX0dNTV9BVFRBQ0hfUkVKCQkweDA0CisjZGVmaW5lIEdTTTQ4X01UX0dNTV9ERVRBQ0hfUkVRCQkweDA1CisjZGVmaW5lIEdTTTQ4X01UX0dNTV9ERVRBQ0hfQUNLCQkweDA2CisKKyNkZWZpbmUgR1NNNDhfTVRfR01NX1JBX1VQRF9SRVEJCTB4MDgKKyNkZWZpbmUgR1NNNDhfTVRfR01NX1JBX1VQRF9BQ0sJCTB4MDkKKyNkZWZpbmUgR1NNNDhfTVRfR01NX1JBX1VQRF9DT01QTAkweDBhCisjZGVmaW5lIEdTTTQ4X01UX0dNTV9SQV9VUERfUkVKCQkweDBiCisKKyNkZWZpbmUgR1NNNDhfTVRfR01NX1BUTVNJX1JFQUxMX0NNRAkweDEwCisjZGVmaW5lIEdTTTQ4X01UX0dNTV9QVE1TSV9SRUFMTF9DT01QTAkweDExCisjZGVmaW5lIEdTTTQ4X01UX0dNTV9BVVRIX0NJUEhfUkVRCTB4MTIKKyNkZWZpbmUgR1NNNDhfTVRfR01NX0FVVEhfQ0lQSF9SRVNQCTB4MTMKKyNkZWZpbmUgR1NNNDhfTVRfR01NX0FVVEhfQ0lQSF9SRUoJMHgxNAorI2RlZmluZSBHU000OF9NVF9HTU1fSURfUkVRCQkweDE1CisjZGVmaW5lIEdTTTQ4X01UX0dNTV9JRF9SRVNQCQkweDE2CisjZGVmaW5lIEdTTTQ4X01UX0dNTV9TVEFUVVMJCTB4MjAKKyNkZWZpbmUgR1NNNDhfTVRfR01NX0lORk8JCTB4MjEKKworLyogVGFibGUgMTAuNGEsIEdQUlMgU2Vzc2lvbiBNYW5hZ2VtZW50IChHU00pICovCisjZGVmaW5lIEdTTTQ4X01UX0dTTV9BQ1RfUERQX1JFUQkweDQxCisjZGVmaW5lIEdTTTQ4X01UX0dTTV9BQ1RfUERQX0FDSwkweDQyCisjZGVmaW5lIEdTTTQ4X01UX0dTTV9BQ1RfUERQX1JFSgkweDQzCisjZGVmaW5lIEdTTTQ4X01UX0dTTV9SRVFfUERQX0FDVAkweDQ0CisjZGVmaW5lIEdTTTQ4X01UX0dTTV9SRVFfUERQX0FDVF9SRUoJMHg0NQorI2RlZmluZSBHU000OF9NVF9HU01fREVBQ1RfUERQX1JFUQkweDQ2CisjZGVmaW5lIEdTTTQ4X01UX0dTTV9ERUFDVF9QRFBfQUNLCTB4NDcKKyNkZWZpbmUgR1NNNDhfTVRfR1NNX0FDVF9BQV9QRFBfUkVRCTB4NTAKKyNkZWZpbmUgR1NNNDhfTVRfR1NNX0FDVF9BQV9QRFBfQUNLCTB4NTEKKyNkZWZpbmUgR1NNNDhfTVRfR1NNX0FDVF9BQV9QRFBfUkVKCTB4NTIKKyNkZWZpbmUgR1NNNDhfTVRfR1NNX0RFQUNUX0FBX1BEUF9SRVEJMHg1MworI2RlZmluZSBHU000OF9NVF9HU01fREVBQ1RfQUFfUERQX0FDSwkweDU0CisjZGVmaW5lIEdTTTQ4X01UX0dTTV9TVEFUVVMJCTB4NTUKKworLyogQ2hhcHRlciAxMC41LjUuMiAvIFRhYmxlIDEwLjUuMTM1ICovCisjZGVmaW5lIEdQUlNfQVRUX1RfQVRUQUNICQkxCisjZGVmaW5lIEdQUlNfQVRUX1RfQVRUX1dISUxFX0lNU0kJMgorI2RlZmluZSBHUFJTX0FUVF9UX0NPTUJJTkVECQkzCisKKy8qIENoYXB0ZXIgMTAuNS41LjE4IC8gVGFibGUgMTA1LjE1MCAqLworI2RlZmluZSBHUFJTX1VQRF9UX1JBCQkJMAorI2RlZmluZSBHUFJTX1VQRF9UX1JBX0xBCQkxCisjZGVmaW5lIEdQUlNfVVBEX1RfUkFfTEFfSU1TSV9BVFQJMgorI2RlZmluZSBHUFJTX1VQRF9UX1BFUklPRElDCQkzCisKK2VudW0gZ3NtNDhfZ3Byc19pZV9tbSB7CisJR1NNNDhfSUVfR01NX1RJTUVSX1JFQURZCT0gMHgxNywgLyogMTAuNS43LjMgKi8KKwlHU000OF9JRV9HTU1fUFRNU0lfU0lHCQk9IDB4MTksCS8qIDEwLjUuNS44ICovCisJR1NNNDhfSUVfR01NX0FVVEhfUkFORAkJPSAweDIxLCAvKiAxMC41LjMuMSAqLworCUdTTTQ4X0lFX0dNTV9BVVRIX1NSRVMJCT0gMHgyMiwgLyogMTAuNS4zLjIgKi8KKwlHU000OF9JRV9HTU1fSU1FSVNWCQk9IDB4MjMsIC8qIDEwLjUuMS40ICovCisJR1NNNDhfSUVfR01NX0RSWF9QQVJBTQkJPSAweDI3LAkvKiAxMC41LjUuNiAqLworCUdTTTQ4X0lFX0dNTV9NU19ORVRfQ0FQQQk9IDB4MzEsCS8qIDEwLjUuNS4xMiAqLworfTsKKworZW51bSBnc200OF9ncHJzX2llX3NtIHsKKwlHU000OF9JRV9HU01fQVBOCQk9IDB4MjgsCS8qIDEwLjUuNi4xICovCisJR1NNNDhfSUVfR1NNX1BST1RPX0NPTkZfT1BUCT0gMHgyNywJLyogMTAuNS42LjMgKi8KKwlHU000OF9JRV9HU01fUERQX0FERFIJCT0gMHgyYiwgLyogMTAuNS42LjQgKi8KKwlHU000OF9JRV9HU01fQUFfVE1SCQk9IDB4MjksCS8qIDEwLjUuNy4zICovCisJR1NNNDhfSUVfR1NNX05BTUVfRlVMTAkJPSAweDQzLCAvKiAxMC41LjMuNWEgKi8KKwlHU000OF9JRV9HU01fTkFNRV9TSE9SVAkJPSAweDQ1LCAvKiAxMC41LjMuNWEgKi8KKwlHU000OF9JRV9HU01fVElNRVpPTkUJCT0gMHg0NiwgLyogMTAuNS4zLjggKi8KKwlHU000OF9JRV9HU01fVVRDX0FORF9UWgkJPSAweDQ3LCAvKiAxMC41LjMuOSAqLworCUdTTTQ4X0lFX0dTTV9MU0FfSUQJCT0gMHg0OCwgLyogMTAuNS4zLjExICovCit9OworCisvKiBDaGFwdGVyIDkuNC4xNSAvIFRhYmxlIDkuNC4xNSAqLworc3RydWN0IGdzbTQ4X3JhX3VwZF9hY2sgeworCXVpbnQ4X3QgZm9yY2Vfc3RieTo0LAkvKiAxMC41LjUuNyAqLworCQkgdXBkX3Jlc3VsdDo0OwkvKiAxMC41LjUuMTcgKi8KKwl1aW50OF90IHJhX3VwZF90aW1lcjsJLyogMTAuNS43LjMgKi8KKwlzdHJ1Y3QgZ3NtNDhfcmFfaWQgcmFfaWQ7IC8qIDEwLjUuNS4xNSAqLworCXVpbnQ4X3QgZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIENoYXB0ZXIgMTAuNS43LjMgKi8KK2VudW0gZ3NtNDhfZ3Byc190bXJfdW5pdCB7CisJR1BSU19UTVJfMlNFQ09ORFMJPSAwIDw8IDUsCisJR1BSU19UTVJfTUlOVVRFCQk9IDEgPDwgNSwKKwlHUFJTX1RNUl82TUlOVVRFCT0gMiA8PCA1LAorCUdQUlNfVE1SX0RFQUNUSVZBVEVECT0gMyA8PCA1LAorfTsKKworLyogQ2hhcHRlciA5LjQuMiAvIFRhYmxlIDkuNC4yICovCitzdHJ1Y3QgZ3NtNDhfYXR0YWNoX2FjayB7CisJdWludDhfdCBhdHRfcmVzdWx0OjQsCS8qIDEwLjUuNS43ICovCisJCSBmb3JjZV9zdGJ5OjQ7CS8qIDEwLjUuNS4xICovCisJdWludDhfdCByYV91cGRfdGltZXI7CS8qIDEwLjUuNy4zICovCisJdWludDhfdCByYWRpb19wcmlvOwkvKiAxMC41LjcuMiAqLworCXN0cnVjdCBnc200OF9yYV9pZCByYV9pZDsgLyogMTAuNS41LjE1ICovCisJdWludDhfdCBkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogQ2hhcHRlciA5LjUuMSAvIFRhYmxlIDkuNS4xICovCitzdHJ1Y3QgZ3NtNDhfYWN0X3BkcF9jdHhfcmVxIHsKKwl1aW50OF90IHJlcV9uc2FwaTsKKwl1aW50OF90IHJlcV9sbGNfc2FwaTsKKwl1aW50OF90IGRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBDaGFwdGVyIDEwLjUuNS4xNCAvIFRhYmxlIDEwLjUuMTQ3ICovCitlbnVtIGdzbTQ4X2dtbV9jYXVzZSB7CisJR01NX0NBVVNFX0lNU0lfVU5LTk9XTgkJPSAweDAyLAorCUdNTV9DQVVTRV9JTExFR0FMX01TCQk9IDB4MDMsCisJR01NX0NBVVNFX0lMTEVHQUxfTUUJCT0gMHgwNiwKKwlHTU1fQ0FVU0VfR1BSU19OT1RBTExPV0VECT0gMHgwNywKKwlHTU1fQ0FVU0VfR1BSU19PVEhFUl9OT1RBTExPV0VECT0gMHgwOCwKKwlHTU1fQ0FVU0VfTVNfSURfTk9UX0RFUklWRUQJPSAweDA5LAorCUdNTV9DQVVTRV9JTVBMX0RFVEFDSEVECQk9IDB4MGEsCisJR01NX0NBVVNFX1BMTU5fTk9UQUxMT1dFRAk9IDB4MGIsCisJR01NX0NBVVNFX0xBX05PVEFMTE9XRUQJCT0gMHgwYywKKwlHTU1fQ0FVU0VfUk9BTUlOR19OT1RBTExPV0VECT0gMHgwZCwKKwlHTU1fQ0FVU0VfTk9fR1BSU19QTE1OCQk9IDB4MGUsCisJR01NX0NBVVNFX01TQ19URU1QX05PVFJFQUNICT0gMHgxMCwKKwlHTU1fQ0FVU0VfTkVUX0ZBSUwJCT0gMHgxMSwKKwlHTU1fQ0FVU0VfQ09OR0VTVElPTgkJPSAweDE2LAorCUdNTV9DQVVTRV9TRU1fSU5DT1JSX01TRwk9IDB4NWYsCisJR01NX0NBVVNFX0lOVl9NQU5EX0lORk8JCT0gMHg2MCwKKwlHTU1fQ0FVU0VfTVNHVF9OT1RFWElTVF9OT1RJTVBMCT0gMHg2MSwKKwlHTU1fQ0FVU0VfTVNHVF9JTkNPTVBfUF9TVEFURQk9IDB4NjIsCisJR01NX0NBVVNFX0lFX05PVEVYSVNUX05PVElNUEwJPSAweDYzLAorCUdNTV9DQVVTRV9DT05EX0lFX0VSUgkJPSAweDY0LAorCUdNTV9DQVVTRV9NU0dfSU5DT01QX1BfU1RBVEUJPSAweDY1LAorCUdNTV9DQVVTRV9QUk9UT19FUlJfVU5TUEVDCT0gMHg2ZiwKK307CisKKy8qIENoYXB0ZXIgMTAuNC42LjYgLyBUYWJsZSAxMC41LjE1NyAqLworZW51bSBnc200OF9nc21fY2F1c2UgeworCUdTTV9DQVVTRV9JTlNVRkZfUlNSQwkJPSAweDFhLAorCUdTTV9DQVVTRV9NSVNTSU5HX0FQTgkJPSAweDFiLAorCUdTTV9DQVVTRV9VTktOT1dOX1BEUAkJPSAweDFjLAorCUdTTV9DQVVTRV9BVVRIX0ZBSUxFRAkJPSAweDFkLAorCUdTTV9DQVVTRV9BQ1RfUkVKX0dHU04JCT0gMHgxZSwKKwlHU01fQ0FVU0VfQUNUX1JFSl9VTlNQRUMJPSAweDFmLAorCUdTTV9DQVVTRV9TRVJWX09QVF9OT1RTVVBQCT0gMHgyMCwKKwlHU01fQ0FVU0VfUkVRX1NFUlZfT1BUX05PVFNVQgk9IDB4MjEsCisJR1NNX0NBVVNFX1NFUlZfT1BUX1RFTVBfT09PCT0gMHgyMiwKKwlHU01fQ0FVU0VfTlNBUElfSU5fVVNFCQk9IDB4MjMsCisJR1NNX0NBVVNFX0RFQUNUX1JFR1VMQVIJCT0gMHgyNCwKKwlHU01fQ0FVU0VfUU9TX05PVF9BQ0NFUFRFRAk9IDB4MjUsCisJR1NNX0NBVVNFX05FVF9GQUlMCQk9IDB4MjYsCisJR1NNX0NBVVNFX1JFQUNUX1JRRAkJPSAweDI3LAorCUdTTV9DQVVTRV9GRUFUVVJFX05PVFNVUFAJPSAweDI4LAorCUdTTV9DQVVTRV9JTlZBTElEX1RSQU5TX0lECT0gMHg1MSwKKwlHU01fQ0FVU0VfU0VNX0lOQ09SUl9NU0cJPSAweDVmLAorCUdTTV9DQVVTRV9JTlZfTUFORF9JTkZPCQk9IDB4NjAsCisJR1NNX0NBVVNFX01TR1RfTk9URVhJU1RfTk9USU1QTAk9IDB4NjEsCisJR1NNX0NBVVNFX01TR1RfSU5DT01QX1BfU1RBVEUJPSAweDYyLAorCUdTTV9DQVVTRV9JRV9OT1RFWElTVF9OT1RJTVBMCT0gMHg2MywKKwlHU01fQ0FVU0VfQ09ORF9JRV9FUlIJCT0gMHg2NCwKKwlHU01fQ0FVU0VfTVNHX0lOQ09NUF9QX1NUQVRFCT0gMHg2NSwKKwlHU01fQ0FVU0VfUFJPVE9fRVJSX1VOU1BFQwk9IDB4NmYsCit9OworCisvKiBTZWN0aW9uIDYuMS4yLjI6IFNlc3Npb24gbWFuYWdlbWVudCBzdGF0ZXMgb24gdGhlIG5ldHdvcmsgc2lkZSAqLworZW51bSBnc200OF9wZHBfc3RhdGUgeworCVBEUF9TX0lOQUNUSVZFLAorCVBEUF9TX0FDVElWRV9QRU5ESU5HLAorCVBEUF9TX0FDVElWRSwKKwlQRFBfU19JTkFDVElWRV9QRU5ESU5HLAorCVBEUF9TX01PRElGWV9QRU5ESU5HLAorfTsKKworLyogVGFibGUgMTAuNS4xNTUvM0dQUCBUUyAyNC4wMDggKi8KK2VudW0gZ3NtNDhfcGRwX3R5cGVfb3JnIHsKKwlQRFBfVFlQRV9PUkdfRVRTSQkJPSAweDAwLAorCVBEUF9UWVBFX09SR19JRVRGCQk9IDB4MDEsCit9OworZW51bSBnc200OF9wZHBfdHlwZV9uciB7CisJUERQX1RZUEVfTl9FVFNJX1JFU0VSVkVECT0gMHgwMCwKKwlQRFBfVFlQRV9OX0VUU0lfUFBQCQk9IDB4MDEsCisJUERQX1RZUEVfTl9JRVRGX0lQdjQJCT0gMHgyMSwKKwlQRFBfVFlQRV9OX0lFVEZfSVB2NgkJPSAweDU3LAorfTsKKworLyogRmlndXJlIDEwLjUuMTM4LzI0LjAwOCAvIENoYXB0ZXIgMTAuNS42LjUgKi8KK2VudW0gZ3NtNDhfcW9zX3JlbGlhYl9jbGFzcyB7CisJR1NNNDhfUU9TX1JDX0xMQ19BQ0tfUkxDX0FDS19EQVRBX1BST1QJPSAyLAorCUdTTTQ4X1FPU19SQ19MTENfVU5fUkxDX0FDS19EQVRBX1BST1QJPSAzLAorCUdTTTQ4X1FPU19SQ19MTENfVU5fUkxDX1VOX1BST1RfREFUQQk9IDQsCisJR1NNNDhfUU9TX1JDX0xMQ19VTl9STENfVU5fREFUQV9VTgk9IDUsCit9OworCisvKiBGaWd1cmUgMTAuNS4xMzgvMjQuMDA4IC8gQ2hhcHRlciAxMC41LjYuNSAqLworZW51bSBnc200OF9xb3NfcHJlY2VkX2NsYXNzIHsKKwlHU000OF9RT1NfUENfSElHSAk9IDEsCisJR1NNNDhfUU9TX1BDX05PUk1BTAk9IDIsCisJR1NNNDhfUU9TX1BDX0xPVwk9IDMsCit9OworCisvKiBGaWd1cmUgMTAuNS4xMzgvMjQuMDA4IC8gQ2hhcHRlciAxMC41LjYuNSAqLworZW51bSBnc200OF9xb3NfcGVha190cHV0IHsKKwlHU000OF9RT1NfUEVBS19UUFVUXzEwMDBicHMJPSAxLAorCUdTTTQ4X1FPU19QRUFLX1RQVVRfMjAwMGJwcwk9IDIsCisJR1NNNDhfUU9TX1BFQUtfVFBVVF80MDAwYnBzCT0gMywKKwlHU000OF9RT1NfUEVBS19UUFVUXzgwMDBicHMJPSA0LAorCUdTTTQ4X1FPU19QRUFLX1RQVVRfMTYwMDBicHMJPSA1LAorCUdTTTQ4X1FPU19QRUFLX1RQVVRfMzIwMDBicHMJPSA2LAorCUdTTTQ4X1FPU19QRUFLX1RQVVRfNjQwMDBicHMJPSA3LAorCUdTTTQ4X1FPU19QRUFLX1RQVVRfMTI4MDAwYnBzCT0gOCwKKwlHU000OF9RT1NfUEVBS19UUFVUXzI1NjAwMGJwcwk9IDksCit9OworCisvKiBGaWd1cmUgMTAuNS4xMzgvMjQuMDA4IC8gQ2hhcHRlciAxMC41LjYuNSAqLworZW51bSBnc200OF9xb3NfbWVhbl90cHV0IHsKKwlHU000OF9RT1NfTUVBTl9UUFVUXzEwMGJwaAk9IDEsCisJR1NNNDhfUU9TX01FQU5fVFBVVF8yMDBicGgJPSAyLAorCUdTTTQ4X1FPU19NRUFOX1RQVVRfNTAwYnBoCT0gMywKKwlHU000OF9RT1NfTUVBTl9UUFVUXzEwMDBicGgJPSA0LAorCUdTTTQ4X1FPU19NRUFOX1RQVVRfMjAwMGJwaAk9IDUsCisJR1NNNDhfUU9TX01FQU5fVFBVVF81MDAwYnBoCT0gNiwKKwlHU000OF9RT1NfTUVBTl9UUFVUXzEwMDAwYnBoCT0gNywKKwlHU000OF9RT1NfTUVBTl9UUFVUXzIwMDAwYnBoCT0gOCwKKwlHU000OF9RT1NfTUVBTl9UUFVUXzUwMDAwYnBoCT0gOSwKKwlHU000OF9RT1NfTUVBTl9UUFVUXzEwMGticGgJPSAxMCwKKwlHU000OF9RT1NfTUVBTl9UUFVUXzIwMGticGgJPSAxMSwKKwlHU000OF9RT1NfTUVBTl9UUFVUXzUwMGticGgJPSAweGMsCisJR1NNNDhfUU9TX01FQU5fVFBVVF8xTWJwaAk9IDB4ZCwKKwlHU000OF9RT1NfTUVBTl9UUFVUXzJNYnBoCT0gMHhlLAorCUdTTTQ4X1FPU19NRUFOX1RQVVRfNU1icGgJPSAweGYsCisJR1NNNDhfUU9TX01FQU5fVFBVVF8xME1icGgJPSAweDEwLAorCUdTTTQ4X1FPU19NRUFOX1RQVVRfMjBNYnBoCT0gMHgxMSwKKwlHU000OF9RT1NfTUVBTl9UUFVUXzUwTWJwaAk9IDB4MTIsCisJR1NNNDhfUU9TX01FQU5fVFBVVF9CRVNUX0VGRk9SVAk9IDB4MWYsCit9OworCisvKiBGaWd1cmUgMTAuNS4xMzgvMjQuMDA4IC8gQ2hhcHRlciAxMC41LjYuNSAqLworZW51bSBnc200OF9xb3NfZXJyX3NkdSB7CisJR1NNNDhfUU9TX0VSUlNEVV9OT0RFVEVDVAk9IDEsCisJR1NNNDhfUU9TX0VSUlNEVV9ZRVMJCT0gMiwKKwlHU000OF9RT1NfRVJSU0RVX05PCQk9IDMsCit9OworCisvKiBGaWd1cmUgMTAuNS4xMzgvMjQuMDA4IC8gQ2hhcHRlciAxMC41LjYuNSAqLworZW51bSBnc200OF9xb3NfZGVsaXZfb3JkZXIgeworCUdTTTQ4X1FPU19ET19PUkRFUkVECQk9IDEsCisJR1NNNDhfUU9TX0RPX1VOT1JERVJFRAkJPSAyLAorfTsKKworLyogRmlndXJlIDEwLjUuMTM4LzI0LjAwOCAvIENoYXB0ZXIgMTAuNS42LjUgKi8KK2VudW0gZ3NtNDhfcW9zX3RyYWZfY2xhc3MgeworCUdTTTQ4X1FPU19UQ19DT05WRVJTQVRJT05BTAk9IDEsCisJR1NNNDhfUU9TX1RDX1NUUkVBTUlORwkJPSAyLAorCUdTTTQ4X1FPU19UQ19JTlRFUkFDVElWRQk9IDMsCisJR1NNNDhfUU9TX1RDX0JBQ0tHUk9VTkQJCT0gNCwKK307CisKKy8qIEZpZ3VyZSAxMC41LjEzOC8yNC4wMDggLyBDaGFwdGVyIDEwLjUuNi41ICovCitlbnVtIGdzbTQ4X3Fvc19tYXhfc2R1X3NpemUgeworCS8qIHZhbHVlcyBiZWxvdyBpbiAxMCBvY3RldCBncmFudWxhcml0eSAqLworCUdTTTQ4X1FPU19NQVhTRFVfMTUwMgkJPSAweDk3LAorCUdTTTQ4X1FPU19NQVhTRFVfMTUxMAkJPSAweDk4LAorCUdTTTQ4X1FPU19NQVhTRFVfMTUyMAkJPSAweDk5LAorfTsKKworLyogRmlndXJlIDEwLjUuMTM4LzI0LjAwOCAvIENoYXB0ZXIgMTAuNS42LjUgKi8KK2VudW0gZ3NtNDhfcW9zX21heF9iaXRyYXRlIHsKKwlHU000OF9RT1NfTUJSQVRFXzFrCQk9IDB4MDEsCisJR1NNNDhfUU9TX01CUkFURV82M2sJCT0gMHgzZiwKKwlHU000OF9RT1NfTUJSQVRFXzY0awkJPSAweDQwLAorCUdTTTQ4X1FPU19NQlJBVEVfNTY4awkJPSAweDdmLAorCUdTTTQ4X1FPU19NQlJBVEVfNTc2awkJPSAweDgwLAorCUdTTTQ4X1FPU19NQlJBVEVfODY0MGsJCT0gMHhmZSwKKwlHU000OF9RT1NfTUJSQVRFXzBrCQk9IDB4ZmYsCit9OworCisvKiBGaWd1cmUgMTAuNS4xMzgvMjQuMDA4IC8gQ2hhcHRlciAxMC41LjYuNSAqLworZW51bSBnc200OF9xb3NfcmVzaWRfYmVyIHsKKwlHU000OF9RT1NfUkJFUl81ZV8yCQk9IDB4MDEsCisJR1NNNDhfUU9TX1JCRVJfMWVfMgkJPSAweDAyLAorCUdTTTQ4X1FPU19SQkVSXzVlXzMJCT0gMHgwMywKKwlHU000OF9RT1NfUkJFUl80ZV8zCQk9IDB4MDQsCisJR1NNNDhfUU9TX1JCRVJfMWVfMwkJPSAweDA1LAorCUdTTTQ4X1FPU19SQkVSXzFlXzQJCT0gMHgwNiwKKwlHU000OF9RT1NfUkJFUl8xZV81CQk9IDB4MDcsCisJR1NNNDhfUU9TX1JCRVJfMWVfNgkJPSAweDA4LAorCUdTTTQ4X1FPU19SQkVSXzZlXzgJCT0gMHgwOSwKK307CisKKy8qIEZpZ3VyZSAxMC41LjEzOC8yNC4wMDggLyBDaGFwdGVyIDEwLjUuNi41ICovCitlbnVtIGdzbTQ4X3Fvc19zZHVfZXJyIHsKKwlHU000OF9RT1NfU0VSUl8xZV8yCQk9IDB4MDEsCisJR1NNNDhfUU9TX1NFUlJfN2VfMgkJPSAweDAyLAorCUdTTTQ4X1FPU19TRVJSXzFlXzMJCT0gMHgwMywKKwlHU000OF9RT1NfU0VSUl8xZV80CQk9IDB4MDQsCisJR1NNNDhfUU9TX1NFUlJfMWVfNQkJPSAweDA1LAorCUdTTTQ4X1FPU19TRVJSXzFlXzYJCT0gMHgwNiwKKwlHU000OF9RT1NfU0VSUl8xZV8xCQk9IDB4MDcsCit9OworCisvKiBGaWd1cmUgMTAuNS4xMzgvMjQuMDA4IC8gQ2hhcHRlciAxMC41LjYuNSAqLworc3RydWN0IGdzbTQ4X3FvcyB7CisJLyogb2N0ZXQgMyAqLworCXVpbnQ4X3QgcmVsaWFiX2NsYXNzOjM7CisJdWludDhfdCBkZWxheV9jbGFzczozOworCXVpbnQ4X3Qgc3BhcmU6MjsKKwkvKiBvY3RldCA0ICovCisJdWludDhfdCBwcmVjZWRfY2xhc3M6MzsKKwl1aW50OF90IHNwYXJlMjoxOworCXVpbnQ4X3QgcGVha190cHV0OjQ7CisJLyogb2N0ZXQgNSAqLworCXVpbnQ4X3QgbWVhbl90cHV0OjU7CisJdWludDhfdCBzcGFyZTM6MzsKKwkvKiBvY3RldCA2ICovCisJdWludDhfdCBkZWxpdl9lcnJfc2R1OjM7CisJdWludDhfdCBkZWxpdl9vcmRlcjoyOworCXVpbnQ4X3QgdHJhZl9jbGFzczozOworCS8qIG9jdGV0IDcgKi8KKwl1aW50OF90IG1heF9zZHVfc2l6ZTsKKwkvKiBvY3RldCA4ICovCisJdWludDhfdCBtYXhfYml0cmF0ZV91cDsKKwkvKiBvY3RldCA5ICovCisJdWludDhfdCBtYXhfYml0cmF0ZV9kb3duOworCS8qIG9jdGV0IDEwICovCisJdWludDhfdCBzZHVfZXJyX3JhdGlvOjQ7CisJdWludDhfdCByZXNpZF9iZXI6NDsKKwkvKiBvY3RldCAxMSAqLworCXVpbnQ4X3QgaGFuZGxpbmdfcHJpbzoyOworCXVpbnQ4X3QgeGZlcl9kZWxheTo2OworCS8qIG9jdGV0IDEyICovCisJdWludDhfdCBndWFyX2JpdHJhdGVfdXA7CisJLyogb2N0ZXQgMTMgKi8KKwl1aW50OF90IGd1YXJfYml0cmF0ZV9kb3duOworCS8qIG9jdGV0IDE0ICovCisJdWludDhfdCBzcmNfc3RhdHNfZGVzYzo0OworCXVpbnQ4X3Qgc2lnX2luZDoxOworCXVpbnQ4X3Qgc3BhcmU1OjM7CisJLyogb2N0ZXQgMTUgKi8KKwl1aW50OF90IG1heF9iaXRyYXRlX2Rvd25fZXh0OworCS8qIG9jdGV0IDE2ICovCisJdWludDhfdCBndWFyX2JpdHJhdGVfZG93bl9leHQ7Cit9OworCisKK2ludCBncHJzX3RsbGlfdHlwZSh1aW50MzJfdCB0bGxpKTsKKworc3RydWN0IGdzbV9idHMgKmdzbTQ4X2J0c19ieV9yYV9pZChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCQkgICBjb25zdCB1aW50OF90ICpidWYsIHVuc2lnbmVkIGludCBsZW4pOworCisjZW5kaWYgLyogX0dTTTQ4X0dQUlNfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtXzA0XzExLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fMDRfMTEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTI3YWYxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtXzA0XzExLmgKQEAgLTAsMCArMSwzNiBAQAorI2lmbmRlZiBfR1NNXzA0XzExX0gKKyNkZWZpbmUgX0dTTV8wNF8xMV9ICisKKyNpbmNsdWRlIDxvc21vY29yZS9wcm90b2NvbC9nc21fMDRfMTEuaD4KKworLyogU01TIGRlbGl2ZXIgUERVICovCitzdHJ1Y3Qgc21zX2RlbGl2ZXIgeworCXVfaW50OF90IG10aToyOwkJLyogbWVzc2FnZSB0eXBlIGluZGljYXRvciAqLworCXVfaW50OF90IG1tczoxOwkJLyogbW9yZSBtZXNzYWdlcyB0byBzZW5kICovCisJdV9pbnQ4X3QgcnA6MTsJCS8qIHJlcGx5IHBhdGggKi8KKwl1X2ludDhfdCB1ZGhpOjE7CS8qIHVzZXIgZGF0YSBoZWFkZXIgaW5kaWNhdG9yICovCisJdV9pbnQ4X3Qgc3JpOjE7CQkvKiBzdGF0dXMgcmVwb3J0IGluZGljYXRpb24gKi8KKwl1X2ludDhfdCAqb3JpZ19hZGRyOwkvKiBvcmlnaW5hdGluZyBhZGRyZXNzICovCisJdV9pbnQ4X3QgcGlkOwkJLyogcHJvdG9jb2wgaWRlbnRpZmllciAqLworCXVfaW50OF90IGRjczsJCS8qIGRhdGEgY29kaW5nIHNjaGVtZSAqLworCQkJCS8qIHNlcnZpY2UgY2VudHJlIHRpbWUgc3RhbXAgKi8KKwl1X2ludDhfdCB1ZF9sZW47CS8qIHVzZXIgZGF0YSBsZW5ndGggKi8KKwl1X2ludDhfdCAqdXNlcl9kYXRhOwkvKiB1c2VyIGRhdGEgKi8KKworCXVfaW50OF90IG1zZ19yZWY7CS8qIG1lc3NhZ2UgcmVmZXJlbmNlICovCisJdV9pbnQ4X3QgKnNtc2M7Cit9OworCitzdHJ1Y3QgbXNnYjsKKworaW50IGdzbTA0MTFfcmN2X3NtcyhzdHJ1Y3QgbXNnYiAqbXNnLCB1X2ludDhfdCBsaW5rX2lkKTsKKworaW50IGdzbTQxMV9zZW5kX3Ntc19sY2hhbihzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubiwgc3RydWN0IGdzbV9zbXMgKnNtcyk7CisKK3N0cnVjdCBnc21fc21zICpzbXNfYWxsb2Modm9pZCk7Cit2b2lkIHNtc19mcmVlKHN0cnVjdCBnc21fc21zICpzbXMpOworCit2b2lkIF9nc200MTFfc21zX3RyYW5zX2ZyZWUoc3RydWN0IGdzbV90cmFucyAqdHJhbnMpOworaW50IGdzbTQxMV9zZW5kX3Ntc19zdWJzY3Ioc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQkgICBzdHJ1Y3QgZ3NtX3NtcyAqc21zKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtXzA0XzgwLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fMDRfODAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWFiMWM2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtXzA0XzgwLmgKQEAgLTAsMCArMSwyMiBAQAorI2lmbmRlZiBfR1NNXzA0XzgwX0gKKyNkZWZpbmUgX0dTTV8wNF84MF9ICisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzgwLmg+CisKKyNkZWZpbmUgTUFYX0xFTl9VU1NEX1NUUklORwkzMQorCitzdHJ1Y3QgdXNzZF9yZXF1ZXN0IHsKKwkJCWNoYXIgdGV4dFtNQVhfTEVOX1VTU0RfU1RSSU5HICsgMV07CisJCQl1X2ludDhfdCB0cmFuc2FjdGlvbl9pZDsKKwkJCXVfaW50OF90IGludm9rZV9pZDsKK307CisKK2ludCBnc20wNDgwX2RlY29kZV91c3NkX3JlcXVlc3QoY29uc3Qgc3RydWN0IG1zZ2IgKm1zZywgCisJCQkJc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxdWVzdCk7IAoraW50IGdzbTA0ODBfc2VuZF91c3NkX3Jlc3BvbnNlKGNvbnN0IHN0cnVjdCBtc2diICppbl9tc2csIGNvbnN0IGNoYXIqIHJlc3BvbnNlX3RleHQsIAorCQkJCQkJY29uc3Qgc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKTsKK2ludCBnc20wNDgwX3NlbmRfdXNzZF9yZWplY3QoY29uc3Qgc3RydWN0IG1zZ2IgKm1zZywgCisJCQkJY29uc3Qgc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxdWVzdCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtX2RhdGEuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV9kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM3OTRjMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV9kYXRhLmgKQEAgLTAsMCArMSw3NTIgQEAKKyNpZm5kZWYgX0dTTV9EQVRBX0gKKyNkZWZpbmUgX0dTTV9EQVRBX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCitlbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIHsKKwlHU01fUENIQU5fTk9ORSwKKwlHU01fUENIQU5fQ0NDSCwKKwlHU01fUENIQU5fQ0NDSF9TRENDSDQsCisJR1NNX1BDSEFOX1RDSF9GLAorCUdTTV9QQ0hBTl9UQ0hfSCwKKwlHU01fUENIQU5fU0RDQ0g4X1NBQ0NIOEMsCisJR1NNX1BDSEFOX1BEQ0gsCQkvKiBHUFJTIFBEQ0ggKi8KKwlHU01fUENIQU5fVENIX0ZfUERDSCwJLyogVENIL0YgaWYgdXNlZCwgUERDSCBvdGhlcndpc2UgKi8KKwlHU01fUENIQU5fVU5LTk9XTiwKK307CisKK2VudW0gZ3NtX2NoYW5fdCB7CisJR1NNX0xDSEFOX05PTkUsCisJR1NNX0xDSEFOX1NEQ0NILAorCUdTTV9MQ0hBTl9UQ0hfRiwKKwlHU01fTENIQU5fVENIX0gsCisJR1NNX0xDSEFOX1VOS05PV04sCit9OworCisvKiBSUkxQIG1vZGUgb2Ygb3BlcmF0aW9uICovCitlbnVtIHJybHBfbW9kZSB7CisJUlJMUF9NT0RFX05PTkUsCisJUlJMUF9NT0RFX01TX0JBU0VELAorCVJSTFBfTU9ERV9NU19QUkVGLAorCVJSTFBfTU9ERV9BU1NfUFJFRiwKK307CisKKy8qIENoYW5uZWwgUmVxdWVzdCByZWFzb24gKi8KK2VudW0gZ3NtX2NocmVxX3JlYXNvbl90IHsKKwlHU01fQ0hSRVFfUkVBU09OX0VNRVJHLAorCUdTTV9DSFJFUV9SRUFTT05fUEFHLAorCUdTTV9DSFJFUV9SRUFTT05fQ0FMTCwKKwlHU01fQ0hSRVFfUkVBU09OX0xPQ0FUSU9OX1VQRCwKKwlHU01fQ0hSRVFfUkVBU09OX09USEVSLAorfTsKKworI2luY2x1ZGUgPG9zbW9jb3JlL3RpbWVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tbmNjLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvYml0dmVjLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc3RhdGlzdGljcy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbV91dGlscy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3V0aWxzLmg+CisKKyNkZWZpbmUgVFJYX05SX1RTCTgKKyNkZWZpbmUgVFNfTUFYX0xDSEFOCTgKKworI2RlZmluZSBIQVJEQ09ERURfQVJGQ04gMTIzCisjZGVmaW5lIEhBUkRDT0RFRF9UU0MJNworI2RlZmluZSBIQVJEQ09ERURfQlNJQwkweDNmCS8qIE5DQyA9IDcgLyBCQ0MgPSA3ICovCisKKy8qIGZvciBtdWx0aS1kcm9wIGNvbmZpZyAqLworI2RlZmluZSBIQVJEQ09ERURfQlRTMF9UUwkxCisjZGVmaW5lIEhBUkRDT0RFRF9CVFMxX1RTCTYKKyNkZWZpbmUgSEFSRENPREVEX0JUUzJfVFMJMTEKKworZW51bSBnc21faG9va3MgeworCUdTTV9IT09LX05NX1NXTE9BRCwKKwlHU01fSE9PS19SUl9QQUdJTkcsCit9OworCitlbnVtIGdzbV9wYWdpbmdfZXZlbnQgeworCUdTTV9QQUdJTkdfU1VDQ0VFREVELAorCUdTTV9QQUdJTkdfRVhQSVJFRCwKKwlHU01fUEFHSU5HX09PTSwKK307CisKK2VudW0gYnRzX2dwcnNfbW9kZSB7CisJQlRTX0dQUlNfTk9ORSA9IDAsCisJQlRTX0dQUlNfR1BSUyA9IDEsCisJQlRTX0dQUlNfRUdQUlMgPSAyLAorfTsKKworLyogdGhlIGRhdGEgc3RydWN0dXJlIHN0b3JlZCBpbiBtc2diLT5jYiBmb3Igb3BlbmJzYyBhcHBzICovCitzdHJ1Y3Qgb3BlbmJzY19tc2diX2NiIHsKKwl1bnNpZ25lZCBjaGFyICpic3NncGg7CisJdW5zaWduZWQgY2hhciAqbGxjaDsKKworCS8qIENlbGwgSWRlbnRpZmllciAqLworCXVuc2lnbmVkIGNoYXIgKmJzc2dwX2NlbGxfaWQ7CisKKwkvKiBJZGVudGlmaWVycyBvZiBhIEJUUywgZXF1YWwgdG8gJ3N0cnVjdCBic3NncF9idHNfY3R4JyAqLworCXVfaW50MTZfdCBuc2VpOworCXVfaW50MTZfdCBidmNpOworCisJLyogSWRlbnRpZmllciBvZiBhIE1TIChpbnNpZGUgQlRTKSwgZXF1YWwgdG8gJ3N0cnVjdCBzZ3NuX21tX2N0eCcgKi8KKwl1X2ludDMyX3QgdGxsaTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisjZGVmaW5lIE9CU0NfTVNHQl9DQihfX21zZ2IpCSgoc3RydWN0IG9wZW5ic2NfbXNnYl9jYiAqKSYoKF9fbXNnYiktPmNiWzBdKSkKKyNkZWZpbmUgbXNnYl90bGxpKF9feCkJCU9CU0NfTVNHQl9DQihfX3gpLT50bGxpCisjZGVmaW5lIG1zZ2JfbnNlaShfX3gpCQlPQlNDX01TR0JfQ0IoX194KS0+bnNlaQorI2RlZmluZSBtc2diX2J2Y2koX194KQkJT0JTQ19NU0dCX0NCKF9feCktPmJ2Y2kKKyNkZWZpbmUgbXNnYl9nbW1oKF9feCkJCShfX3gpLT5sM2gKKyNkZWZpbmUgbXNnYl9ic3NncGgoX194KQlPQlNDX01TR0JfQ0IoX194KS0+YnNzZ3BoCisjZGVmaW5lIG1zZ2JfYnNzZ3BfbGVuKF9feCkJKChfX3gpLT50YWlsIC0gKHVpbnQ4X3QgKiltc2diX2Jzc2dwaChfX3gpKQorI2RlZmluZSBtc2diX2JjaWQoX194KQkJT0JTQ19NU0dCX0NCKF9feCktPmJzc2dwX2NlbGxfaWQKKyNkZWZpbmUgbXNnYl9sbGNoKF9feCkJCU9CU0NfTVNHQl9DQihfX3gpLT5sbGNoCisKK3N0cnVjdCBtc2diOwordHlwZWRlZiBpbnQgZ3NtX2NiZm4odW5zaWduZWQgaW50IGhvb2tudW0sCisJCSAgICAgdW5zaWduZWQgaW50IGV2ZW50LAorCQkgICAgIHN0cnVjdCBtc2diICptc2csCisJCSAgICAgdm9pZCAqZGF0YSwgdm9pZCAqcGFyYW0pOworCisvKgorICogVXNlIHRoZSBjaGFubmVsLiBBcyBzaWRlIGVmZmVjdCB0aGUgbGNoYW5uZWwgcmVjeWNsZSB0aW1lcgorICogd2lsbCBiZSBzdGFydGVkLgorICovCisjZGVmaW5lIExDSEFOX1JFTEVBU0VfVElNRU9VVCAyMCwgMAorI2RlZmluZSB1c2Vfc3Vic2NyX2Nvbihjb24pIFwKKwlkbyB7CShjb24pLT51c2VfY291bnQrKzsgXAorCQlERUJVR1AoRFJFRiwgImxjaGFuIChidHM9JWQsdHJ4PSVkLHRzPSVkLGNoPSVkKSBpbmNyZWFzZXMgdXNhZ2UgdG86ICVkXG4iLCBcCisJCQkoY29uKS0+bGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsIChjb24pLT5sY2hhbi0+dHMtPnRyeC0+bnIsIChjb24pLT5sY2hhbi0+dHMtPm5yLCBcCisJCQkoY29uKS0+bGNoYW4tPm5yLCAoY29uKS0+dXNlX2NvdW50KTsgXAorCQlic2Nfc2NoZWR1bGVfdGltZXIoJihjb24pLT5yZWxlYXNlX3RpbWVyLCBMQ0hBTl9SRUxFQVNFX1RJTUVPVVQpOyB9IHdoaWxlKDApOworCisjZGVmaW5lIHB1dF9zdWJzY3JfY29uKGNvbikgXAorCWRvIHsgKGNvbiktPnVzZV9jb3VudC0tOyBcCisJCURFQlVHUChEUkVGLCAibGNoYW4gKGJ0cz0lZCx0cng9JWQsdHM9JWQsY2g9JWQpIGRlY3JlYXNlcyB1c2FnZSB0bzogJWRcbiIsIFwKKwkJCShjb24pLT5sY2hhbi0+dHMtPnRyeC0+YnRzLT5uciwgKGNvbiktPmxjaGFuLT50cy0+dHJ4LT5uciwgKGNvbiktPmxjaGFuLT50cy0+bnIsIFwKKwkJCShjb24pLT5sY2hhbi0+bnIsIChjb24pLT51c2VfY291bnQpOyBcCisJfSB3aGlsZSgwKTsKKworCisvKiBSZWFsIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIGNvbnRhaW5pbmcgS2kgKi8KK2VudW0gZ3NtX2F1dGhfYWxnbyB7CisJQVVUSF9BTEdPX05PTkUsCisJQVVUSF9BTEdPX1hPUiwKKwlBVVRIX0FMR09fQ09NUDEyOHYxLAorfTsKKworc3RydWN0IGdzbV9hdXRoX2luZm8geworCWVudW0gZ3NtX2F1dGhfYWxnbyBhdXRoX2FsZ287CisJdW5zaWduZWQgaW50IGEzYThfa2lfbGVuOworCXVfaW50OF90IGEzYThfa2lbMTZdOworfTsKKworc3RydWN0IGdzbV9hdXRoX3R1cGxlIHsKKwlpbnQgdXNlX2NvdW50OworCWludCBrZXlfc2VxOworCXVfaW50OF90IHJhbmRbMTZdOworCXVfaW50OF90IHNyZXNbNF07CisJdV9pbnQ4X3Qga2NbOF07Cit9OworCisKK3N0cnVjdCBnc21fbGNoYW47CitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXI7CitzdHJ1Y3QgZ3NtX21uY2M7CitzdHJ1Y3QgcnRwX3NvY2tldDsKKworLyogTmV0d29yayBNYW5hZ2VtZW50IFN0YXRlICovCitzdHJ1Y3QgZ3NtX25tX3N0YXRlIHsKKwl1X2ludDhfdCBvcGVyYXRpb25hbDsKKwl1X2ludDhfdCBhZG1pbmlzdHJhdGl2ZTsKKwl1X2ludDhfdCBhdmFpbGFiaWxpdHk7Cit9OworCisvKgorICogTE9DQVRJT04gVVBEQVRJTkcgUkVRVUVTVCBzdGF0ZQorICoKKyAqIE91ciBjdXJyZW50IG9wZXJhdGlvbiBpczoKKyAqCS0gR2V0IGltZWkvdG1zaQorICoJLSBBY2NlcHQvUmVqZWN0IGFjY29yZGluZyB0byBnbG9iYWwgcG9saWN5CisgKi8KK3N0cnVjdCBnc21fbG9jX3VwZGF0aW5nX29wZXJhdGlvbiB7CisgICAgICAgIHN0cnVjdCB0aW1lcl9saXN0IHVwZGF0aW5nX3RpbWVyOworCXVuc2lnbmVkIGludCB3YWl0aW5nX2Zvcl9pbXNpIDogMTsKKwl1bnNpZ25lZCBpbnQgd2FpdGluZ19mb3JfaW1laSA6IDE7Cit9OworCisvKiBNYXhpbXVtIG51bWJlciBvZiBuZWlnaGJvciBjZWxscyB3aG9zZSBhdmVyYWdlIHdlIHRyYWNrICovCisjZGVmaW5lIE1BWF9ORUlHSF9NRUFTCQkxMAorLyogTWF4aW11bSBzaXplIG9mIHRoZSBhdmVyYWdpbmcgd2luZG93IGZvciBuZWlnaGJvciBjZWxscyAqLworI2RlZmluZSBNQVhfV0lOX05FSUdIX0FWRwkxMAorCisvKiBwcm9jZXNzZWQgbmVpZ2hib3IgbWVhc3VyZW1lbnRzIGZvciBvbmUgY2VsbCAqLworc3RydWN0IG5laWdoX21lYXNfcHJvYyB7CisJdV9pbnQxNl90IGFyZmNuOworCXVfaW50OF90IGJzaWM7CisJdV9pbnQ4X3QgcnhsZXZbTUFYX1dJTl9ORUlHSF9BVkddOworCXVuc2lnbmVkIGludCByeGxldl9jbnQ7CisJdV9pbnQ4X3QgbGFzdF9zZWVuX25yOworfTsKKworI2RlZmluZSBNQVhfQTVfS0VZX0xFTgkoMTI4LzgpCisjZGVmaW5lIFJTTF9FTkNfQUxHX0E1KHgpCSh4KzEpCisKKy8qIGlzIHRoZSBkYXRhIGxpbmsgZXN0YWJsaXNoZWQ/IHdobyBlc3RhYmxpc2hlZCBpdD8gKi8KKyNkZWZpbmUgTENIQU5fU0FQSV9VTlVTRUQJMAorI2RlZmluZSBMQ0hBTl9TQVBJX01TCQkxCisjZGVmaW5lIExDSEFOX1NBUElfTkVUCQkyCisKKy8qIHN0YXRlIG9mIGEgbG9naWNhbCBjaGFubmVsICovCitlbnVtIGdzbV9sY2hhbl9zdGF0ZSB7CisJTENIQU5fU19OT05FLAkJLyogY2hhbm5lbCBpcyBub3QgYWN0aXZlICovCisJTENIQU5fU19BQ1RfUkVRLAkvKiBjaGFubmVsIGFjdGl2YXRpbiByZXF1ZXN0ZWQgKi8KKwlMQ0hBTl9TX0FDVElWRSwJCS8qIGNoYW5uZWwgaXMgYWN0aXZlIGFuZCBvcGVyYXRpb25hbCAqLworCUxDSEFOX1NfUkVMX1JFUSwJLyogY2hhbm5lbCByZWxlYXNlIGhhcyBiZWVuIHJlcXVlc3RlZCAqLworCUxDSEFOX1NfSU5BQ1RJVkUsCS8qIGNoYW5uZWwgaXMgc2V0IGluYWN0aXZlICovCit9OworCisvKiB0aGUgcGVyIHN1YnNjcmliZXIgZGF0YSBmb3IgbGNoYW4gKi8KK3N0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uIHsKKwkvKiBUbyB3aG9tIHdlIGFyZSBhbGxvY2F0ZWQgYXQgdGhlIG1vbWVudCAqLworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCisJLyogVGltZXIgc3RhcnRlZCB0byByZWxlYXNlIHRoZSBjaGFubmVsICovCisJc3RydWN0IHRpbWVyX2xpc3QgcmVsZWFzZV90aW1lcjsKKworCS8qCisJICogT3BlcmF0aW9ucyB0aGF0IGhhdmUgYSBzdGF0ZSBhbmQgbWlnaHQgYmUgcGVuZGluZworCSAqLworCXN0cnVjdCBnc21fbG9jX3VwZGF0aW5nX29wZXJhdGlvbiAqbG9jX29wZXJhdGlvbjsKKworCS8qIHVzZSBjb3VudC4gaG93IG1hbnkgdXNlcnMgdXNlIHRoaXMgY2hhbm5lbCAqLworCXVuc2lnbmVkIGludCB1c2VfY291bnQ7CisKKwkvKiBBcmUgd2UgcGFydCBvZiBhIHNwZWNpYWwgInNpbGVudCIgY2FsbCAqLworCWludCBzaWxlbnRfY2FsbDsKKworCS8qIGJhY2sgcG9pbnRlcnMgKi8KKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworfTsKKworc3RydWN0IGdzbV9sY2hhbiB7CisJLyogVGhlIFRTIHRoYXQgd2UncmUgcGFydCBvZiAqLworCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHM7CisJLyogVGhlIGxvZ2ljYWwgc3Vic2xvdCBudW1iZXIgaW4gdGhlIFRTICovCisJdV9pbnQ4X3QgbnI7CisJLyogVGhlIGxvZ2ljYWwgY2hhbm5lbCB0eXBlICovCisJZW51bSBnc21fY2hhbl90IHR5cGU7CisJLyogUlNMIGNoYW5uZWwgbW9kZSAqLworCWVudW0gcnNsX2Ntb2Rfc3BkIHJzbF9jbW9kZTsKKwkvKiBJZiBUQ0gsIHRyYWZmaWMgY2hhbm5lbCBtb2RlICovCisJZW51bSBnc200OF9jaGFuX21vZGUgdGNoX21vZGU7CisJLyogU3RhdGUgKi8KKwllbnVtIGdzbV9sY2hhbl9zdGF0ZSBzdGF0ZTsKKwkvKiBQb3dlciBsZXZlbHMgZm9yIE1TIGFuZCBCVFMgKi8KKwl1X2ludDhfdCBic19wb3dlcjsKKwl1X2ludDhfdCBtc19wb3dlcjsKKwkvKiBFbmNyeXB0aW9uIGluZm9ybWF0aW9uICovCisJc3RydWN0IHsKKwkJdV9pbnQ4X3QgYWxnX2lkOworCQl1X2ludDhfdCBrZXlfbGVuOworCQl1X2ludDhfdCBrZXlbTUFYX0E1X0tFWV9MRU5dOworCX0gZW5jcjsKKworCXN0cnVjdCB0aW1lcl9saXN0IFQzMTAxOworCisJLyogQU1SIGJpdHMgKi8KKwlzdHJ1Y3QgZ3NtNDhfbXVsdGlfcmF0ZV9jb25mIG1yX2NvbmY7CisJCisJLyogRXN0YWJsaXNoZWQgZGF0YSBsaW5rIGxheWVyIHNlcnZpY2VzICovCisJdV9pbnQ4X3Qgc2FwaXNbOF07CisKKwkvKiBjYWNoZSBvZiBsYXN0IG1lYXN1cmVtZW50IHJlcG9ydHMgb24gdGhpcyBsY2hhbiAqLworCXN0cnVjdCBnc21fbWVhc19yZXAgbWVhc19yZXBbNl07CisJaW50IG1lYXNfcmVwX2lkeDsKKworCS8qIHRhYmxlIG9mIG5laWdoYm9yIGNlbGwgbWVhc3VyZW1lbnRzICovCisJc3RydWN0IG5laWdoX21lYXNfcHJvYyBuZWlnaF9tZWFzW01BWF9ORUlHSF9NRUFTXTsKKworCXN0cnVjdCB7CisJCXVfaW50MzJfdCBib3VuZF9pcDsKKwkJdV9pbnQzMl90IGNvbm5lY3RfaXA7CisJCXVfaW50MTZfdCBib3VuZF9wb3J0OworCQl1X2ludDE2X3QgY29ubmVjdF9wb3J0OworCQl1X2ludDE2X3QgY29ubl9pZDsKKwkJdV9pbnQ4X3QgcnRwX3BheWxvYWQ7CisJCXVfaW50OF90IHJ0cF9wYXlsb2FkMjsKKwkJdV9pbnQ4X3Qgc3BlZWNoX21vZGU7CisJCXN0cnVjdCBydHBfc29ja2V0ICpydHBfc29ja2V0OworCX0gYWJpc19pcDsKKworCXN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uIGNvbm47Cit9OworCitzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgeworCS8qIE51bWJlciBvZiBFMSBsaW5rICovCisJdV9pbnQ4X3QJZTFfbnI7CisJLyogTnVtYmVyIG9mIEUxIFRTIGluc2lkZSBFMSBsaW5rICovCisJdV9pbnQ4X3QJZTFfdHM7CisJLyogU3ViLXNsb3Qgd2l0aGluIHRoZSBFMSBUUywgMHhmZiBpZiBmdWxsIFRTICovCisJdV9pbnQ4X3QJZTFfdHNfc3M7Cit9OworCisjZGVmaW5lIFRTX0ZfUERDSF9NT0RFCTB4MTAwMAorLyogT25lIFRpbWVzbG90IGluIGEgVFJYICovCitzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgeworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCS8qIG51bWJlciBvZiB0aGlzIHRpbWVzbG90IGF0IHRoZSBUUlggKi8KKwl1X2ludDhfdCBucjsKKworCWVudW0gZ3NtX3BoeXNfY2hhbl9jb25maWcgcGNoYW47CisKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCBubV9hdHRyOworCXVfaW50OF90IG5tX2NoYW5fY29tYjsKKworCS8qIFRvIHdoaWNoIEUxIHN1YnNsb3QgYXJlIHdlIGNvbm5lY3RlZCAqLworCXN0cnVjdCBnc21fZTFfc3Vic2xvdCBlMV9saW5rOworCisJc3RydWN0IGdzbV9sY2hhbiBsY2hhbltUU19NQVhfTENIQU5dOworfTsKKworLyogT25lIFRSWCBpbiBhIEJUUyAqLworc3RydWN0IGdzbV9idHNfdHJ4IHsKKwkvKiBsaXN0IGhlYWRlciBpbiBidHMtPnRyeF9saXN0ICovCisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKworCXN0cnVjdCBnc21fYnRzICpidHM7CisJLyogbnVtYmVyIG9mIHRoaXMgVFJYIGluIHRoZSBCVFMgKi8KKwl1X2ludDhfdCBucjsKKwkvKiBob3cgZG8gd2UgdGFsayBSU0wgd2l0aCB0aGlzIFRSWD8gKi8KKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgcnNsX2UxX2xpbms7CisJdV9pbnQ4X3QgcnNsX3RlaTsKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpyc2xfbGluazsKKworCXN0cnVjdCBnc21fbm1fc3RhdGUgbm1fc3RhdGU7CisJc3RydWN0IHRsdl9wYXJzZWQgbm1fYXR0cjsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOworCX0gYmJfdHJhbnNjOworCisJdV9pbnQxNl90IGFyZmNuOworCWludCBub21pbmFsX3Bvd2VyOwkJLyogaW4gZEJtICovCisJdW5zaWduZWQgaW50IG1heF9wb3dlcl9yZWQ7CS8qIGluIGFjdHVhbCBkQiAqLworCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJc3RydWN0IHsKKwkJCQlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOworCQkJfSBiYnNpZzsKKwkJCXN0cnVjdCB7CisJCQkJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwkJCX0gcGE7CisJCX0gYnMxMTsKKwl9OworCXN0cnVjdCBnc21fYnRzX3RyeF90cyB0c1tUUlhfTlJfVFNdOworfTsKKworZW51bSBnc21fYnRzX3R5cGUgeworCUdTTV9CVFNfVFlQRV9VTktOT1dOLAorCUdTTV9CVFNfVFlQRV9CUzExLAorCUdTTV9CVFNfVFlQRV9OQU5PQlRTLAorfTsKKworc3RydWN0IGdzbV9idHNfbW9kZWwgeworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisKKwllbnVtIGdzbV9idHNfdHlwZSB0eXBlOworCWNvbnN0IGNoYXIgKm5hbWU7CisKKwlzdHJ1Y3QgdGx2X2RlZmluaXRpb24gbm1fYXR0X3RsdmRlZjsKK307CisKKy8qKgorICogQSBwZW5kaW5nIHBhZ2luZyByZXF1ZXN0IAorICovCitzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0IHsKKwkvKiBsaXN0X2hlYWQgZm9yIGxpc3Qgb2YgYWxsIHBhZ2luZyByZXF1ZXN0cyAqLworCXN0cnVjdCBsbGlzdF9oZWFkIGVudHJ5OworCS8qIHRoZSBzdWJzY3JpYmVyIHdoaWNoIHdlJ3JlIHBhZ2luZy4gTGF0ZXIgZ3NtX3BhZ2luZ19yZXF1ZXN0CisJICogc2hvdWxkIHByb2JhYmx5IGJlY29tZSBhIHBhcnQgb2YgdGhlIGdzbV9zdWJzY3JpYmVyIHN0cnVjdD8gKi8KKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKwkvKiBiYWNrLXBvaW50ZXIgdG8gdGhlIEJUUyBvbiB3aGljaCB3ZSBhcmUgcGFnaW5nICovCisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwkvKiB3aGF0IGtpbmQgb2YgY2hhbm5lbCB0eXBlIGRvIHdlIGFzayB0aGUgTVMgdG8gZXN0YWJsaXNoICovCisJaW50IGNoYW5fdHlwZTsKKworCS8qIFRpbWVyIDMxMTM6IGhvdyBsb25nIGRvIHdlIHRyeSB0byBwYWdlPyAqLworCXN0cnVjdCB0aW1lcl9saXN0IFQzMTEzOworCisJLyogY2FsbGJhY2sgdG8gYmUgY2FsbGVkIGluIGNhc2UgcGFnaW5nIGNvbXBsZXRlcyAqLworCWdzbV9jYmZuICpjYmZuOworCXZvaWQgKmNiZm5fcGFyYW07Cit9OworCisvKgorICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgcGFnaW5nIHN0YXR1cyBvZiBvbmUgQlRTLiBJdAorICogaW5jbHVkZXMgYSBudW1iZXIgb2YgcGVuZGluZyByZXF1ZXN0cywgYSBiYWNrIHBvaW50ZXIKKyAqIHRvIHRoZSBnc21fYnRzLCBhIHRpbWVyIGFuZCBzb21lIG1vcmUgc3RhdGUuCisgKi8KK3N0cnVjdCBnc21fYnRzX3BhZ2luZ19zdGF0ZSB7CisJLyogcGVuZGluZyByZXF1ZXN0cyAqLworCXN0cnVjdCBsbGlzdF9oZWFkIHBlbmRpbmdfcmVxdWVzdHM7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKworCXN0cnVjdCB0aW1lcl9saXN0IHdvcmtfdGltZXI7CisKKwkvKiBsb2FkICovCisJdV9pbnQxNl90IGF2YWlsYWJsZV9zbG90czsKK307CisKK3N0cnVjdCBnc21fZW52YWJ0c2UgeworCXN0cnVjdCBnc21fbm1fc3RhdGUgbm1fc3RhdGU7Cit9OworCitzdHJ1Y3QgZ3NtX2J0c19ncHJzX25zdmMgeworCXN0cnVjdCBnc21fYnRzICpidHM7CisJLyogZGF0YSByZWFkIHZpYSBWVFkgY29uZmlnIGZpbGUsIHRvIGNvbmZpZ3VyZSB0aGUgQlRTCisJICogdmlhIE9NTCBmcm9tIEJTQyAqLworCWludCBpZDsKKwl1X2ludDE2X3QgbnN2Y2k7CisJdV9pbnQxNl90IGxvY2FsX3BvcnQ7CS8qIG9uIHRoZSBCVFMgKi8KKwl1X2ludDE2X3QgcmVtb3RlX3BvcnQ7CS8qIG9uIHRoZSBTR1NOICovCisJdV9pbnQzMl90IHJlbW90ZV9pcDsJLyogb24gdGhlIFNHU04gKi8KKworCXN0cnVjdCBnc21fbm1fc3RhdGUgbm1fc3RhdGU7Cit9OworCisvKiBPbmUgQlRTICovCitzdHJ1Y3QgZ3NtX2J0cyB7CisJLyogbGlzdCBoZWFkZXIgaW4gbmV0LT5idHNfbGlzdCAqLworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldHdvcms7CisJLyogbnVtYmVyIG9mIHRocyBCVFMgaW4gbmV0d29yayAqLworCXVfaW50OF90IG5yOworCS8qIENlbGwgSWRlbnRpdHkgKi8KKwl1X2ludDE2X3QgY2VsbF9pZGVudGl0eTsKKwkvKiBsb2NhdGlvbiBhcmVhIGNvZGUgb2YgdGhpcyBCVFMgKi8KKwl1X2ludDE2X3QgbG9jYXRpb25fYXJlYV9jb2RlOworCS8qIFRyYWluaW5nIFNlcXVlbmNlIENvZGUgKi8KKwl1X2ludDhfdCB0c2M7CisJLyogQmFzZSBTdGF0aW9uIElkZW50aWZpY2F0aW9uIENvZGUgKEJTSUMpICovCisJdV9pbnQ4X3QgYnNpYzsKKwkvKiB0eXBlIG9mIEJUUyAqLworCWVudW0gZ3NtX2J0c190eXBlIHR5cGU7CisJc3RydWN0IGdzbV9idHNfbW9kZWwgKm1vZGVsOworCWVudW0gZ3NtX2JhbmQgYmFuZDsKKwkvKiBzaG91bGQgdGhlIGNoYW5uZWwgYWxsb2NhdG9yIGFsbG9jYXRlIGNoYW5uZWxzIGZyb20gaGlnaCBUUlggdG8gVFJYMCwKKwkgKiByYXRoZXIgdGhhbiBzdGFydGluZyBmcm9tIFRSWDAgYW5kIGdvIHVwd2FyZHM/ICovCisJaW50IGNoYW5fYWxsb2NfcmV2ZXJzZTsKKwkvKiBtYXhpbXVtIFR4IHBvd2VyIHRoYXQgdGhlIE1TIGlzIHBlcm1pdHRlZCB0byB1c2UgaW4gdGhpcyBjZWxsICovCisJaW50IG1zX21heF9wb3dlcjsKKworCS8qIGhvdyBkbyB3ZSB0YWxrIE9NTCB3aXRoIHRoaXMgVFJYPyAqLworCXN0cnVjdCBnc21fZTFfc3Vic2xvdCBvbWxfZTFfbGluazsKKwl1X2ludDhfdCBvbWxfdGVpOworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKm9tbF9saW5rOworCisJLyogQWJpcyBuZXR3b3JrIG1hbmFnZW1lbnQgTyZNIGhhbmRsZSAqLworCXN0cnVjdCBhYmlzX25tX2ggKm5taDsKKwlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOworCXN0cnVjdCB0bHZfcGFyc2VkIG5tX2F0dHI7CisKKwkvKiBudW1iZXIgb2YgdGhpcyBCVFMgb24gZ2l2ZW4gRTEgbGluayAqLworCXVfaW50OF90IGJ0c19ucjsKKworCS8qIHBhZ2luZyBzdGF0ZSBhbmQgY29udHJvbCAqLworCXN0cnVjdCBnc21fYnRzX3BhZ2luZ19zdGF0ZSBwYWdpbmc7CisKKwkvKiBDQ0NIIGlzIG9uIEMwICovCisJc3RydWN0IGdzbV9idHNfdHJ4ICpjMDsKKworCXN0cnVjdCB7CisJCXN0cnVjdCBnc21fbm1fc3RhdGUgbm1fc3RhdGU7CisJfSBzaXRlX21ncjsKKworCS8qIHBhcmFtZXRlcnMgZnJvbSB3aGljaCB3ZSBidWlsZCBTWVNURU0gSU5GT1JNQVRJT04gKi8KKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgZ3NtNDhfcmFjaF9jb250cm9sIHJhY2hfY29udHJvbDsKKwkJdV9pbnQ4X3QgbmNjX3Blcm1pdHRlZDsKKwkJc3RydWN0IGdzbTQ4X2NlbGxfc2VsX3BhciBjZWxsX3NlbF9wYXI7CisJCXN0cnVjdCBnc200OF9jZWxsX29wdGlvbnMgY2VsbF9vcHRpb25zOworCQlzdHJ1Y3QgZ3NtNDhfY29udHJvbF9jaGFubmVsX2Rlc2NyIGNoYW5fZGVzYzsKKwkJc3RydWN0IGJpdHZlYyBuZWlnaF9saXN0OworCQlzdHJ1Y3QgYml0dmVjIGNlbGxfYWxsb2M7CisJCXN0cnVjdCB7CisJCQkvKiBiaXRtYXNrIGxhcmdlIGVub3VnaCBmb3IgYWxsIHBvc3NpYmxlIEFSRkNOJ3MgKi8KKwkJCXVfaW50OF90IG5laWdoX2xpc3RbMTAyNC84XTsKKwkJCXVfaW50OF90IGNlbGxfYWxsb2NbMTAyNC84XTsKKwkJfSBkYXRhOworCX0gc2lfY29tbW9uOworCisJLyogaXAuYWNjZXNzcyBVbml0IElEJ3MgaGF2ZSBTaXRlL0JUUy9UUlggbGF5b3V0ICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdV9pbnQxNl90IHNpdGVfaWQ7CisJCQl1X2ludDE2X3QgYnRzX2lkOworCQkJdV9pbnQzMl90IGZsYWdzOworCQl9IGlwX2FjY2VzczsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCB7CisJCQkJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwkJCX0gY2NsazsKKwkJCXN0cnVjdCB7CisJCQkJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwkJCX0gcmFjazsKKwkJCXN0cnVjdCBnc21fZW52YWJ0c2UgZW52YWJ0c2VbNF07CisJCX0gYnMxMTsKKwl9OworCisJLyogTm90IGVudGlyZWx5IHN1cmUgaG93IGlwLmFjY2VzcyBzcGVjaWZpYyB0aGlzIGlzICovCisJc3RydWN0IHsKKwkJZW51bSBidHNfZ3Byc19tb2RlIG1vZGU7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOworCQkJdV9pbnQxNl90IG5zZWk7CisJCX0gbnNlOworCQlzdHJ1Y3QgeworCQkJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwkJCXVfaW50MTZfdCBidmNpOworCQl9IGNlbGw7CisJCXN0cnVjdCBnc21fYnRzX2dwcnNfbnN2YyBuc3ZjWzJdOworCQl1X2ludDhfdCByYWM7CisJfSBncHJzOworCisJLyogUkFDSCBOTSB2YWx1ZXMgKi8KKwlpbnQgcmFjaF9iX3RocmVzaDsKKwlpbnQgcmFjaF9sZGF2Z19zbG90czsKKwkKKwkvKiB0cmFuc2NlaXZlcnMgKi8KKwlpbnQgbnVtX3RyeDsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCB0cnhfbGlzdDsKK307CisKKy8qIFNvbWUgc3RhdGlzdGljcyBvZiBvdXIgbmV0d29yayAqLworc3RydWN0IGdzbW5ldF9zdGF0cyB7CisJc3RydWN0IHsKKwkJc3RydWN0IGNvdW50ZXIgKnRvdGFsOworCQlzdHJ1Y3QgY291bnRlciAqbm9fY2hhbm5lbDsKKwl9IGNocmVxOworCXN0cnVjdCB7CisJCXN0cnVjdCBjb3VudGVyICphdHRlbXB0ZWQ7CisJCXN0cnVjdCBjb3VudGVyICpub19jaGFubmVsOwkvKiBubyBjaGFubmVsIGF2YWlsYWJsZSAqLworCQlzdHJ1Y3QgY291bnRlciAqdGltZW91dDsJCS8qIFQzMTAzIHRpbWVvdXQgKi8KKwkJc3RydWN0IGNvdW50ZXIgKmNvbXBsZXRlZDsJLyogSE8gQ09NUEwgcmVjZWl2ZWQgKi8KKwkJc3RydWN0IGNvdW50ZXIgKmZhaWxlZDsJCS8qIEhPIEZBSUwgcmVjZWl2ZWQgKi8KKwl9IGhhbmRvdmVyOworCXN0cnVjdCB7CisJCXN0cnVjdCBjb3VudGVyICphdHRhY2g7CisJCXN0cnVjdCBjb3VudGVyICpub3JtYWw7CisJCXN0cnVjdCBjb3VudGVyICpwZXJpb2RpYzsKKwkJc3RydWN0IGNvdW50ZXIgKmRldGFjaDsKKwl9IGxvY191cGRfdHlwZTsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgY291bnRlciAqcmVqZWN0OworCQlzdHJ1Y3QgY291bnRlciAqYWNjZXB0OworCX0gbG9jX3VwZF9yZXNwOworCXN0cnVjdCB7CisJCXN0cnVjdCBjb3VudGVyICphdHRlbXB0ZWQ7CisJCXN0cnVjdCBjb3VudGVyICpkZXRhY2hlZDsKKwkJc3RydWN0IGNvdW50ZXIgKmNvbXBsZXRlZDsKKwkJc3RydWN0IGNvdW50ZXIgKmV4cGlyZWQ7CisJfSBwYWdpbmc7CisJc3RydWN0IHsKKwkJc3RydWN0IGNvdW50ZXIgKnN1Ym1pdHRlZDsgLyogTU8gU01TIHN1Ym1pc3Npb25zICovCisJCXN0cnVjdCBjb3VudGVyICpub19yZWNlaXZlcjsKKwkJc3RydWN0IGNvdW50ZXIgKmRlbGl2ZXJlZDsgLyogTVQgU01TIGRlbGl2ZXJpZXMgKi8KKwkJc3RydWN0IGNvdW50ZXIgKnJwX2Vycl9tZW07CisJCXN0cnVjdCBjb3VudGVyICpycF9lcnJfb3RoZXI7CisJfSBzbXM7CisJc3RydWN0IHsKKwkJc3RydWN0IGNvdW50ZXIgKmRpYWxsZWQ7CS8qIHRvdGFsIG51bWJlciBvZiBkaWFsbGVkIGNhbGxzICovCisJCXN0cnVjdCBjb3VudGVyICphbGVydGVkOwkvKiB3ZSBhbGVydGVkIHRoZSBvdGhlciBlbmQgKi8KKwkJc3RydWN0IGNvdW50ZXIgKmNvbm5lY3RlZDsvKiBob3cgbWFueSBjYWxscyB3ZXJlIGFjY2VwdGVkICovCisJfSBjYWxsOworCXN0cnVjdCB7CisJCXN0cnVjdCBjb3VudGVyICpyZl9mYWlsOworCQlzdHJ1Y3QgY291bnRlciAqcmxsX2VycjsKKwl9IGNoYW47CisJc3RydWN0IHsKKwkJc3RydWN0IGNvdW50ZXIgKm9tbF9mYWlsOworCQlzdHJ1Y3QgY291bnRlciAqcnNsX2ZhaWw7CisJfSBidHM7Cit9OworCitlbnVtIGdzbV9hdXRoX3BvbGljeSB7CisJR1NNX0FVVEhfUE9MSUNZX0NMT1NFRCwgLyogb25seSBzdWJzY3JpYmVycyBhdXRob3JpemVkIGluIERCICovCisJR1NNX0FVVEhfUE9MSUNZX0FDQ0VQVF9BTEwsIC8qIGFjY2VwdCBldmVyeW9uZSwgZXZlbiBpZiBub3QgYXV0aG9yaXplZCBpbiBEQiAqLworCUdTTV9BVVRIX1BPTElDWV9UT0tFTiwgLyogYWNjZXB0IGZpcnN0LCBzZW5kIHRva2VuIHBlciBzbXMsIHRoZW4gcmV2b2tlIGF1dGhvcml6YXRpb24gKi8KK307CisKKyNkZWZpbmUgR1NNX1QzMTAxX0RFRkFVTFQgMTAKKyNkZWZpbmUgR1NNX1QzMTEzX0RFRkFVTFQgNjAKKworc3RydWN0IGdzbV9uZXR3b3JrIHsKKwkvKiBnbG9iYWwgcGFyYW1ldGVycyAqLworCXVfaW50MTZfdCBjb3VudHJ5X2NvZGU7CisJdV9pbnQxNl90IG5ldHdvcmtfY29kZTsKKwljaGFyICpuYW1lX2xvbmc7CisJY2hhciAqbmFtZV9zaG9ydDsKKwllbnVtIGdzbV9hdXRoX3BvbGljeSBhdXRoX3BvbGljeTsKKwllbnVtIGdzbTQ4X3JlamVjdF92YWx1ZSByZWplY3RfY2F1c2U7CisJaW50IGE1X2VuY3J5cHRpb247CisJaW50IG5lY2k7CisJaW50IHNlbmRfbW1faW5mbzsKKwlzdHJ1Y3QgeworCQlpbnQgYWN0aXZlOworCQkvKiBXaW5kb3cgUlhMRVYgYXZlcmFnaW5nICovCisJCXVuc2lnbmVkIGludCB3aW5fcnhsZXZfYXZnOwkvKiBudW1iZXIgb2YgU0FDQ0ggZnJhbWVzICovCisJCS8qIFdpbmRvdyBSWFFVQUwgYXZlcmFnaW5nICovCisJCXVuc2lnbmVkIGludCB3aW5fcnhxdWFsX2F2ZzsJLyogbnVtYmVyIG9mIFNBQ0NIIGZyYW1lcyAqLworCQkvKiBXaW5kb3cgUlhMRVYgbmVpZ2hib3VyaW5nIGNlbGxzIGF2ZXJhZ2luZyAqLworCQl1bnNpZ25lZCBpbnQgd2luX3J4bGV2X2F2Z19uZWlnaDsgLyogbnVtYmVyIG9mIFNBQ0NIIGZyYW1lcyAqLworCisJCS8qIGhvdyBvZnRlbiBzaG91bGQgd2UgY2hlY2sgZm9yIHBvd2VyIGJ1ZGdldCBITyAqLworCQl1bnNpZ25lZCBpbnQgcHdyX2ludGVydmFsOwkvKiBTQUNDSCBmcmFtZXMgKi8KKwkJLyogaG93IG11Y2ggYmV0dGVyIGRvZXMgYSBuZWlnaGJvciBjZWxsIGhhdmUgdG8gYmUgPyAqLworCQl1bnNpZ25lZCBpbnQgcHdyX2h5c3RlcmVzaXM7CS8qIGRCbSAqLworCQkvKiBtYXhpbXVtIGRpc3RhY25lIGJlZm9yZSB3ZSB0cnkgYSBoYW5kb3ZlciAqLworCQl1bnNpZ25lZCBpbnQgbWF4X2Rpc3RhbmNlOwkvKiBUQSB2YWx1ZXMgKi8KKwl9IGhhbmRvdmVyOworCisJc3RydWN0IGdzbW5ldF9zdGF0cyBzdGF0czsKKworCS8qIGxheWVyIDQgKi8KKwlpbnQgKCptbmNjX3JlY3YpIChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgaW50IG1zZ190eXBlLCB2b2lkICphcmcpOworCXN0cnVjdCBsbGlzdF9oZWFkIHVwcXVldWU7CisJc3RydWN0IGxsaXN0X2hlYWQgdHJhbnNfbGlzdDsKKworCXVuc2lnbmVkIGludCBudW1fYnRzOworCXN0cnVjdCBsbGlzdF9oZWFkIGJ0c19saXN0OworCisJLyogdGltZXIgdmFsdWVzICovCisJaW50IFQzMTAxOworCWludCBUMzEwMzsKKwlpbnQgVDMxMDU7CisJaW50IFQzMTA3OworCWludCBUMzEwOTsKKwlpbnQgVDMxMTE7CisJaW50IFQzMTEzOworCWludCBUMzExNTsKKwlpbnQgVDMxMTc7CisJaW50IFQzMTE5OworCWludCBUMzE0MTsKKworCS8qIFJhZGlvIFJlc291cmNlIExvY2F0aW9uIFByb3RvY29sIChUUyAwNC4zMSkgKi8KKwlzdHJ1Y3QgeworCQllbnVtIHJybHBfbW9kZSBtb2RlOworCX0gcnJscDsKK307CisKKyNkZWZpbmUgU01TX0hEUl9TSVpFCTEyOAorI2RlZmluZSBTTVNfVEVYVF9TSVpFCTI1Ngorc3RydWN0IGdzbV9zbXMgeworCXVuc2lnbmVkIGxvbmcgbG9uZyBpZDsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnNlbmRlcjsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnJlY2VpdmVyOworCisJdW5zaWduZWQgbG9uZyB2YWxpZGl0eV9taW51dGVzOworCXVfaW50OF90IHJlcGx5X3BhdGhfcmVxOworCXVfaW50OF90IHN0YXR1c19yZXBfcmVxOworCXVfaW50OF90IHVkX2hkcl9pbmQ7CisJdV9pbnQ4X3QgcHJvdG9jb2xfaWQ7CisJdV9pbnQ4X3QgZGF0YV9jb2Rpbmdfc2NoZW1lOworCXVfaW50OF90IG1zZ19yZWY7CisJY2hhciBkZXN0X2FkZHJbMjArMV07CS8qIERBIExWIGlzIDEyIGJ5dGVzIG1heCwgaS5lLiAxMCBieXRlcworCQkJCSAqIEJDRCA9PSAyMCBieXRlcyBzdHJpbmcgKi8KKwl1X2ludDhfdCB1c2VyX2RhdGFfbGVuOworCXVfaW50OF90IHVzZXJfZGF0YVtTTVNfVEVYVF9TSVpFXTsKKworCWNoYXIgdGV4dFtTTVNfVEVYVF9TSVpFXTsKK307CisKKworc3RydWN0IGdzbV9uZXR3b3JrICpnc21fbmV0d29ya19pbml0KHVfaW50MTZfdCBjb3VudHJ5X2NvZGUsIHVfaW50MTZfdCBuZXR3b3JrX2NvZGUsCisJCQkJICAgICBpbnQgKCptbmNjX3JlY3YpKHN0cnVjdCBnc21fbmV0d29yayAqLCBpbnQsIHZvaWQgKikpOworc3RydWN0IGdzbV9idHMgKmdzbV9idHNfYWxsb2Moc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGVudW0gZ3NtX2J0c190eXBlIHR5cGUsCisJCQkgICAgICB1X2ludDhfdCB0c2MsIHVfaW50OF90IGJzaWMpOworc3RydWN0IGdzbV9idHNfdHJ4ICpnc21fYnRzX3RyeF9hbGxvYyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBnc21fc2V0X2J0c190eXBlKHN0cnVjdCBnc21fYnRzICpidHMsIGVudW0gZ3NtX2J0c190eXBlIHR5cGUpOworCitzdHJ1Y3QgZ3NtX2J0cyAqZ3NtX2J0c19udW0oc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGludCBudW0pOworCisvKiBHZXQgcmVmZXJlbmNlIHRvIGEgbmVpZ2hib3IgY2VsbCBvbiBhIGdpdmVuIEJDQ0ggQVJGQ04gKi8KK3N0cnVjdCBnc21fYnRzICpnc21fYnRzX25laWdoYm9yKGNvbnN0IHN0cnVjdCBnc21fYnRzICpidHMsCisJCQkJIHVfaW50MTZfdCBhcmZjbiwgdV9pbnQ4X3QgYnNpYyk7CisKK3N0cnVjdCBnc21fYnRzX3RyeCAqZ3NtX2J0c190cnhfbnVtKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBudW0pOworCitjb25zdCBjaGFyICpnc21fcGNoYW5fbmFtZShlbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIGMpOworZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBnc21fcGNoYW5fcGFyc2UoY29uc3QgY2hhciAqbmFtZSk7Citjb25zdCBjaGFyICpnc21fbGNoYW50X25hbWUoZW51bSBnc21fY2hhbl90IGMpOworY29uc3QgY2hhciAqZ3NtX2NocmVxX25hbWUoZW51bSBnc21fY2hyZXFfcmVhc29uX3QgYyk7CitjaGFyICpnc21fdHJ4X25hbWUoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpOworY2hhciAqZ3NtX3RzX25hbWUoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyk7CitjaGFyICpnc21fbGNoYW5fbmFtZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7Citjb25zdCBjaGFyICpnc21fbGNoYW5zX25hbWUoZW51bSBnc21fbGNoYW5fc3RhdGUgcyk7CisKK2VudW0gZ3NtX2UxX2V2ZW50IHsKKwlFVlRfRTFfTk9ORSwKKwlFVlRfRTFfVEVJX1VQLAorCUVWVF9FMV9URUlfRE4sCit9OworCit2b2lkIHNldF90c19lMWxpbmsoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cywgdV9pbnQ4X3QgZTFfbnIsCisJCSAgIHVfaW50OF90IGUxX3RzLCB1X2ludDhfdCBlMV90c19zcyk7CitlbnVtIGdzbV9idHNfdHlwZSBwYXJzZV9idHN0eXBlKGNvbnN0IGNoYXIgKmFyZyk7Citjb25zdCBjaGFyICpidHN0eXBlMnN0cihlbnVtIGdzbV9idHNfdHlwZSB0eXBlKTsKK3N0cnVjdCBnc21fYnRzX3RyeCAqZ3NtX2J0c190cnhfYnlfbnIoc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IG5yKTsKK3N0cnVjdCBnc21fYnRzICpnc21fYnRzX2J5X2xhYyhzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgdW5zaWduZWQgaW50IGxhYywKKwkJCQlzdHJ1Y3QgZ3NtX2J0cyAqc3RhcnRfYnRzKTsKKworZXh0ZXJuIHZvaWQgKnRhbGxfYnNjX2N0eDsKK2V4dGVybiBpbnQgaXBhY2NfcnRwX2RpcmVjdDsKKworc3RhdGljIGlubGluZSBpbnQgaXNfaXBhY2Nlc3NfYnRzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3dpdGNoIChidHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9OQU5PQlRTOgorCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX3NpZW1lbnNfYnRzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3dpdGNoIChidHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitlbnVtIGdzbV9hdXRoX3BvbGljeSBnc21fYXV0aF9wb2xpY3lfcGFyc2UoY29uc3QgY2hhciAqYXJnKTsKK2NvbnN0IGNoYXIgKmdzbV9hdXRoX3BvbGljeV9uYW1lKGVudW0gZ3NtX2F1dGhfcG9saWN5IHBvbGljeSk7CisKK2VudW0gcnJscF9tb2RlIHJybHBfbW9kZV9wYXJzZShjb25zdCBjaGFyICphcmcpOworY29uc3QgY2hhciAqcnJscF9tb2RlX25hbWUoZW51bSBycmxwX21vZGUgbW9kZSk7CisKK2VudW0gYnRzX2dwcnNfbW9kZSBidHNfZ3Byc19tb2RlX3BhcnNlKGNvbnN0IGNoYXIgKmFyZyk7Citjb25zdCBjaGFyICpidHNfZ3Byc19tb2RlX25hbWUoZW51bSBidHNfZ3Byc19tb2RlIG1vZGUpOworCit2b2lkIGdzbV90cnhfbG9ja19yZihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgaW50IGxvY2tlZCk7CisKK2ludCBnc200OF9yYV9pZF9ieV9idHModV9pbnQ4X3QgKmJ1Ziwgc3RydWN0IGdzbV9idHMgKmJ0cyk7Cit2b2lkIGdwcnNfcmFfaWRfYnlfYnRzKHN0cnVjdCBncHJzX3JhX2lkICpyYWlkLCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK3N0cnVjdCBnc21fbWVhc19yZXAgKmxjaGFuX25leHRfbWVhc19yZXAoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworCitpbnQgZ3NtX2J0c19tb2RlbF9yZWdpc3RlcihzdHJ1Y3QgZ3NtX2J0c19tb2RlbCAqbW9kZWwpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fc3Vic2NyaWJlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NTM5OTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fc3Vic2NyaWJlci5oCkBAIC0wLDAgKzEsOTUgQEAKKyNpZm5kZWYgX0dTTV9TVUJTQ1JfSAorI2RlZmluZSBfR1NNX1NVQlNDUl9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlICJnc21fZGF0YS5oIgorI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorCisjZGVmaW5lIEdTTV9JTUVJX0xFTkdUSCAxNworI2RlZmluZSBHU01fSU1TSV9MRU5HVEggMTcKKyNkZWZpbmUgR1NNX05BTUVfTEVOR1RIIDEyOAorCisjZGVmaW5lIEdTTV9FWFRFTlNJT05fTEVOR1RIIDE1IC8qIE1TSVNETiBjYW4gb25seSBiZSAxNSBkaWdpdHMgbGVuZ3RoICovCisjZGVmaW5lIEdTTV9NSU5fRVhURU4gMjAwMDAKKyNkZWZpbmUgR1NNX01BWF9FWFRFTiA0OTk5OQorCisvKiByZXNlcnZlZCBhY2NvcmRpbmcgdG8gR1NNIDAzLjAzIMKnIDIuNCAqLworI2RlZmluZSBHU01fUkVTRVJWRURfVE1TSSAgIDB4RkZGRkZGRkYKKworCisjZGVmaW5lIEdTTV9TVUJTQ1JJQkVSX0ZJUlNUX0NPTlRBQ1QJMHgwMDAwMDAwMQorI2RlZmluZSB0bXNpX2Zyb21fc3RyaW5nKHN0cikgc3RydG91bChzdHIsIE5VTEwsIDEwKQorCitzdHJ1Y3QgZ3NtX2VxdWlwbWVudCB7CisJbG9uZyBsb25nIHVuc2lnbmVkIGludCBpZDsKKwljaGFyIGltZWlbR1NNX0lNRUlfTEVOR1RIXTsKKwljaGFyIG5hbWVbR1NNX05BTUVfTEVOR1RIXTsKKworCXN0cnVjdCBnc200OF9jbGFzc21hcmsxIGNsYXNzbWFyazE7CisJdV9pbnQ4X3QgY2xhc3NtYXJrMl9sZW47CisJdV9pbnQ4X3QgY2xhc3NtYXJrMlszXTsKKwl1X2ludDhfdCBjbGFzc21hcmszX2xlbjsKKwl1X2ludDhfdCBjbGFzc21hcmszWzE0XTsKK307CisKK3N0cnVjdCBnc21fc3Vic2NyaWJlciB7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQ7CisJbG9uZyBsb25nIHVuc2lnbmVkIGludCBpZDsKKwljaGFyIGltc2lbR1NNX0lNU0lfTEVOR1RIXTsKKwl1X2ludDMyX3QgdG1zaTsKKwl1X2ludDE2X3QgbGFjOworCWNoYXIgbmFtZVtHU01fTkFNRV9MRU5HVEhdOworCWNoYXIgZXh0ZW5zaW9uW0dTTV9FWFRFTlNJT05fTEVOR1RIXTsKKwlpbnQgYXV0aG9yaXplZDsKKworCS8qIFRlbXBvcmFyeSBmaWVsZCB3aGljaCBpcyBub3Qgc3RvcmVkIGluIHRoZSBEQi9ITFIgKi8KKwl1X2ludDMyX3QgZmxhZ3M7CisKKwkvKiBFdmVyeSB1c2VyIGNhbiBvbmx5IGhhdmUgb25lIGVxdWlwbWVudCBpbiB1c2UgYXQgYW55IGdpdmVuCisJICogcG9pbnQgaW4gdGltZSAqLworCXN0cnVjdCBnc21fZXF1aXBtZW50IGVxdWlwbWVudDsKKworCS8qIGZvciBpbnRlcm5hbCBtYW5hZ2VtZW50ICovCisJaW50IHVzZV9jb3VudDsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBlbnRyeTsKKworCS8qIHBlbmRpbmcgcmVxdWVzdHMgKi8KKwlpbnQgaW5fY2FsbGJhY2s7CisJc3RydWN0IGxsaXN0X2hlYWQgcmVxdWVzdHM7Cit9OworCitlbnVtIGdzbV9zdWJzY3JpYmVyX2ZpZWxkIHsKKwlHU01fU1VCU0NSSUJFUl9JTVNJLAorCUdTTV9TVUJTQ1JJQkVSX1RNU0ksCisJR1NNX1NVQlNDUklCRVJfRVhURU5TSU9OLAorCUdTTV9TVUJTQ1JJQkVSX0lELAorfTsKKworZW51bSBnc21fc3Vic2NyaWJlcl91cGRhdGVfcmVhc29uIHsKKwlHU01fU1VCU0NSSUJFUl9VUERBVEVfQVRUQUNIRUQsCisJR1NNX1NVQlNDUklCRVJfVVBEQVRFX0RFVEFDSEVELAorCUdTTV9TVUJTQ1JJQkVSX1VQREFURV9FUVVJUE1FTlQsCit9OworCitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcl9nZXQoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfcHV0KHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKTsKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX2dldF9ieV90bXNpKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LAorCQkJCQkgIHVfaW50MzJfdCB0bXNpKTsKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX2dldF9ieV9pbXNpKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LAorCQkJCQkgIGNvbnN0IGNoYXIgKmltc2kpOworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfZ2V0X2J5X2V4dGVuc2lvbihzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCQkJICAgICAgIGNvbnN0IGNoYXIgKmV4dCk7CitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcl9nZXRfYnlfaWQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCXVuc2lnbmVkIGxvbmcgbG9uZyBpZCk7CitpbnQgc3Vic2NyX3VwZGF0ZShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnMsIHN0cnVjdCBnc21fYnRzICpidHMsIGludCByZWFzb24pOwordm9pZCBzdWJzY3JfcHV0X2NoYW5uZWwoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOwordm9pZCBzdWJzY3JfZ2V0X2NoYW5uZWwoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSwgZ3NtX2NiZm4gKmNiZm4sIHZvaWQgKnBhcmFtKTsKKworY2hhciAqc3Vic2NyX25hbWUoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworCisvKiBpbnRlcm5hbCAqLworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfYWxsb2Modm9pZCk7CitleHRlcm4gc3RydWN0IGxsaXN0X2hlYWQgYWN0aXZlX3N1YnNjcmliZXJzOworCisjZW5kaWYgLyogX0dTTV9TVUJTQ1JfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvaGFuZG92ZXIuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2hhbmRvdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFiMWIwNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2hhbmRvdmVyLmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIF9IQU5ET1ZFUl9ICisjZGVmaW5lIF9IQU5ET1ZFUl9ICisvKiBIYW5kIG92ZXIgdGhlIHNwZWNpZmllZCBsb2dpY2FsIGNoYW5uZWwgdG8gdGhlIHNwZWNpZmllZCBuZXcgQlRTLgorICogVGhpcyBpcyB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIGFjdHVhbCBoYW5kb3ZlciBhbGdvcml0aG0sCisgKiBhZnRlciBpdCBoYXMgZGVjaWRlZCBpdCB3YW50cyB0byBpbml0aWF0ZSBITyB0byBhIHNwZWNpZmljIEJUUyAqLworaW50IGJzY19oYW5kb3Zlcl9zdGFydChzdHJ1Y3QgZ3NtX2xjaGFuICpvbGRfbGNoYW4sIHN0cnVjdCBnc21fYnRzICpidHMpOworCisjZW5kaWYgLyogX0hBTkRPVkVSX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2lwYWNjZXNzLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9pcGFjY2Vzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZGRmZDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9pcGFjY2Vzcy5oCkBAIC0wLDAgKzEsMTA5IEBACisjaWZuZGVmIF9JUEFDQ0VTU19ICisjZGVmaW5lIF9JUEFDQ0VTU19ICisKKyNpbmNsdWRlICJlMV9pbnB1dC5oIgorI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorCisjZGVmaW5lIElQQV9UQ1BfUE9SVF9PTUwJMzAwMgorI2RlZmluZSBJUEFfVENQX1BPUlRfUlNMCTMwMDMKKworc3RydWN0IGlwYWNjZXNzX2hlYWQgeworCXVfaW50MTZfdCBsZW47CS8qIG5ldHdvcmsgYnl0ZSBvcmRlciAqLworCXVfaW50OF90IHByb3RvOworCXVfaW50OF90IGRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworZW51bSBpcGFjY2Vzc19wcm90byB7CisJSVBBQ19QUk9UT19SU0wJCT0gMHgwMCwKKwlJUEFDX1BST1RPX0lQQUNDRVNTCT0gMHhmZSwKKwlJUEFDX1BST1RPX1NDQ1AJCT0gMHhmZCwKKwlJUEFDX1BST1RPX09NTAkJPSAweGZmLAorfTsKKworZW51bSBpcGFjY2Vzc19tc2d0eXBlIHsKKwlJUEFDX01TR1RfUElORwkJPSAweDAwLAorCUlQQUNfTVNHVF9QT05HCQk9IDB4MDEsCisJSVBBQ19NU0dUX0lEX0dFVAk9IDB4MDQsCisJSVBBQ19NU0dUX0lEX1JFU1AJPSAweDA1LAorCUlQQUNfTVNHVF9JRF9BQ0sJPSAweDA2LAorfTsKKworZW51bSBpcGFjY2Vzc19pZF90YWdzIHsKKwlJUEFDX0lEVEFHX1NFUk5SCQk9IDB4MDAsCisJSVBBQ19JRFRBR19VTklUTkFNRQkJPSAweDAxLAorCUlQQUNfSURUQUdfTE9DQVRJT04xCQk9IDB4MDIsCisJSVBBQ19JRFRBR19MT0NBVElPTjIJCT0gMHgwMywKKwlJUEFDX0lEVEFHX0VRVUlQVkVSUwkJPSAweDA0LAorCUlQQUNfSURUQUdfU1dWRVJTSU9OCQk9IDB4MDUsCisJSVBBQ19JRFRBR19JUEFERFIJCT0gMHgwNiwKKwlJUEFDX0lEVEFHX01BQ0FERFIJCT0gMHgwNywKKwlJUEFDX0lEVEFHX1VOSVQJCQk9IDB4MDgsCit9OworCitpbnQgaXBhY2Nlc3NfY29ubmVjdChzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSwgc3RydWN0IHNvY2thZGRyX2luICpzYSk7CisKKy8qCisgKiBtZXRob2RzIGZvciBwYXJzaW5nIGFuZCBzZW5kaW5nIGEgbWVzc2FnZQorICovCitpbnQgaXBhY2Nlc3NfcmN2bXNnX2Jhc2Uoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGJzY19mZCAqYmZkKTsKK3N0cnVjdCBtc2diICppcGFjY2Vzc19yZWFkX21zZyhzdHJ1Y3QgYnNjX2ZkICpiZmQsIGludCAqZXJyb3IpOwordm9pZCBpcGFjY2Vzc19wcmVwZW5kX2hlYWRlcihzdHJ1Y3QgbXNnYiAqbXNnLCBpbnQgcHJvdG8pOworaW50IGlwYWNjZXNzX3NlbmRfaWRfYWNrKGludCBmZCk7CitpbnQgaXBhY2Nlc3Nfc2VuZF9pZF9yZXEoaW50IGZkKTsKKworaW50IGlwYWNjZXNzX2lkdGFnX3BhcnNlKHN0cnVjdCB0bHZfcGFyc2VkICpkZWMsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbik7CisKK2ludCBpcGFjY2Vzc19kcm9wX29tbChzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBpcGFjY2Vzc19kcm9wX3JzbChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCk7CisKKy8qCisgKiBGaXJtd2FyZSBzcGVjaWZpYyBoZWFkZXIKKyAqLworc3RydWN0IHNkcF9maXJtd2FyZSB7CisJY2hhciBtYWdpY1s0XTsKKwljaGFyIG1vcmVfbWFnaWNbMl07CisJdV9pbnQxNl90IG1vcmVfbW9yZV9tYWdpYzsKKwl1X2ludDMyX3QgaGVhZGVyX2xlbmd0aDsKKwl1X2ludDMyX3QgZmlsZV9sZW5ndGg7CisJY2hhciBzd19wYXJ0WzIwXTsKKwljaGFyIHRleHQxWzY0XTsKKwljaGFyIHRpbWVbMTJdOworCWNoYXIgZGF0ZVsxNF07CisJY2hhciB0ZXh0MlsxMF07CisJY2hhciB2ZXJzaW9uWzIwXTsKKwl1X2ludDE2X3QgdGFibGVfb2Zmc2V0OworCS8qIHN0dWZmIGkgZG9uJ3Qga25vdyAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNkcF9oZWFkZXJfZW50cnkgeworCXVfaW50MTZfdCBzb21ldGhpbmcxOworCWNoYXIgdGV4dDFbNjRdOworCWNoYXIgdGltZVsxMl07CisJY2hhciBkYXRlWzE0XTsKKwljaGFyIHRleHQyWzEwXTsKKwljaGFyIHZlcnNpb25bMjBdOworCXVfaW50MzJfdCBsZW5ndGg7CisJdV9pbnQzMl90IGFkZHIxOworCXVfaW50MzJfdCBhZGRyMjsKKwl1X2ludDMyX3Qgc3RhcnQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc2RwX2hlYWRlcl9pdGVtIHsKKwlzdHJ1Y3Qgc2RwX2hlYWRlcl9lbnRyeSBoZWFkZXJfZW50cnk7CisJc3RydWN0IGxsaXN0X2hlYWQgZW50cnk7CisJb2ZmX3QgYWJzb2x1dGVfb2Zmc2V0OworfTsKKworc3RydWN0IHNkcF9oZWFkZXIgeworCXN0cnVjdCBzZHBfZmlybXdhcmUgZmlybXdhcmVfaW5mbzsKKworCS8qIGZvciBtb3JlX21hZ2ljIGEgbGlzdCBvZiBzZHBfaGVhZGVyX2VudHJ5X2xpc3QgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBoZWFkZXJfbGlzdDsKKworCS8qIHRoZSBlbnRyeSBvZiB0aGUgc2RwX2hlYWRlciAqLworCXN0cnVjdCBsbGlzdF9oZWFkIGVudHJ5OworfTsKKworaW50IGlwYWNjZXNzX2FuYWx5emVfZmlsZShpbnQgZmQsIGNvbnN0IHVuc2lnbmVkIGludCBzdF9zaXplLCBjb25zdCB1bnNpZ25lZCBiYXNlX29mZnNldCwgc3RydWN0IGxsaXN0X2hlYWQgKmxpc3QpOworCisjZW5kaWYgLyogX0lQQUNDRVNTX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21lYXNfcmVwLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tZWFzX3JlcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMmM4ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tZWFzX3JlcC5oCkBAIC0wLDAgKzEsODUgQEAKKyNpZm5kZWYgX01FQVNfUkVQX0gKKyNkZWZpbmUgX01FQVNfUkVQX0gKKworI2RlZmluZSBNUkNfRl9QUk9DRVNTRUQJMHgwMDAxCisKKy8qIGV4dHJhY3RlZCBmcm9tIGEgTDMgbWVhc3VyZW1lbnQgcmVwb3J0IElFICovCitzdHJ1Y3QgZ3NtX21lYXNfcmVwX2NlbGwgeworCXVfaW50OF90IHJ4bGV2OworCXVfaW50OF90IGJzaWM7CisJdV9pbnQ4X3QgbmVpZ2hfaWR4OworCXVfaW50MTZfdCBhcmZjbjsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7Cit9OworCisvKiBSWCBMZXZlbCBhbmQgUlggUXVhbGl0eSAqLworc3RydWN0IGdzbV9yeF9sZXZfcXVhbCB7CisJdV9pbnQ4X3QgcnhfbGV2OworCXVfaW50OF90IHJ4X3F1YWw7Cit9OworCisvKiB1bmlkaXJlY3Rpb25hbCBtZWFzdW1yZW1lbnQgcmVwb3J0ICovCitzdHJ1Y3QgZ3NtX21lYXNfcmVwX3VuaWRpciB7CisJc3RydWN0IGdzbV9yeF9sZXZfcXVhbCBmdWxsOworCXN0cnVjdCBnc21fcnhfbGV2X3F1YWwgc3ViOworfTsKKworI2RlZmluZSBNRUFTX1JFUF9GX1VMX0RUWAkweDAxCisjZGVmaW5lIE1FQVNfUkVQX0ZfRExfVkFMSUQJMHgwMgorI2RlZmluZSBNRUFTX1JFUF9GX0JBMQkJMHgwNAorI2RlZmluZSBNRUFTX1JFUF9GX0RMX0RUWAkweDA4CisjZGVmaW5lIE1FQVNfUkVQX0ZfTVNfVE8JMHgxMAorI2RlZmluZSBNRUFTX1JFUF9GX01TX0wxCTB4MjAKKyNkZWZpbmUgTUVBU19SRVBfRl9GUEMJCTB4NDAKKworLyogcGFyc2VkIHVwbGluayBhbmQgZG93bmxpbmsgbWVhc3VyZW1lbnQgcmVzdWx0ICovCitzdHJ1Y3QgZ3NtX21lYXNfcmVwIHsKKwkvKiBiYWNrLXBvaW50ZXIgdG8gdGhlIGxvZ2ljYWwgY2hhbm5lbCAqLworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCisJLyogbnVtYmVyIG9mIHRoZSBtZWFzdXJlbWVudCByZXBvcnQgKi8KKwl1X2ludDhfdCBucjsKKwkvKiBmbGFncywgc2VlIE1FQVNfUkVQX0ZfKiAqLworCXVuc2lnbmVkIGludCBmbGFnczsKKworCS8qIHVwbGluayBhbmQgZG93bmxpbmsgcnhsZXYsIHJ4cXVhbDsgZnVsbCBhbmQgc3ViICovCisJc3RydWN0IGdzbV9tZWFzX3JlcF91bmlkaXIgdWw7CisJc3RydWN0IGdzbV9tZWFzX3JlcF91bmlkaXIgZGw7CisKKwl1X2ludDhfdCBic19wb3dlcjsKKwl1X2ludDhfdCBtc190aW1pbmdfb2Zmc2V0OworCXN0cnVjdCB7CisJCWludDhfdCBwd3I7CS8qIE1TIHBvd2VyIGluIGRCbSAqLworCQl1X2ludDhfdCB0YTsJLyogTVMgdGltaW5nIGFkdmFuY2UgKi8KKwl9IG1zX2wxOworCisJLyogbmVpZ2hib3IgbWVhc3VyZW1lbnQgcmVwb3J0cyBmb3IgdXAgdG8gNiBjZWxscyAqLworCWludCBudW1fY2VsbDsKKwlzdHJ1Y3QgZ3NtX21lYXNfcmVwX2NlbGwgY2VsbFs2XTsKK307CisKK2VudW0gbWVhc19yZXBfZmllbGQgeworCU1FQVNfUkVQX0RMX1JYTEVWX0ZVTEwsCisJTUVBU19SRVBfRExfUlhMRVZfU1VCLAorCU1FQVNfUkVQX0RMX1JYUVVBTF9GVUxMLAorCU1FQVNfUkVQX0RMX1JYUVVBTF9TVUIsCisJTUVBU19SRVBfVUxfUlhMRVZfRlVMTCwKKwlNRUFTX1JFUF9VTF9SWExFVl9TVUIsCisJTUVBU19SRVBfVUxfUlhRVUFMX0ZVTEwsCisJTUVBU19SRVBfVUxfUlhRVUFMX1NVQiwKK307CisKKy8qIG9idGFpbiBhbiBhdmVyYWdlIG92ZXIgdGhlIGxhc3QgJ251bScgZmllbGRzIGluIHRoZSBtZWFzIHJlcHMgKi8KK2ludCBnZXRfbWVhc19yZXBfYXZnKGNvbnN0IHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLAorCQkgICAgIGVudW0gbWVhc19yZXBfZmllbGQgZmllbGQsIHVuc2lnbmVkIGludCBudW0pOworCisvKiBDaGVjayBpZiBOIG91dCBvZiBNIGxhc3QgdmFsdWVzIGZvciBGSUVMRCBhcmUgPj0gYmQgKi8KK2ludCBtZWFzX3JlcF9uX291dF9vZl9tX2JlKGNvbnN0IHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLAorCQkJZW51bSBtZWFzX3JlcF9maWVsZCBmaWVsZCwKKwkJCXVuc2lnbmVkIGludCBuLCB1bnNpZ25lZCBpbnQgbSwgaW50IGJlKTsKKwordW5zaWduZWQgaW50IGNhbGNfaW5pdGlhbF9pZHgodW5zaWduZWQgaW50IGFycmF5X3NpemUsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgbWVhc19yZXBfaWR4LAorCQkJICAgICAgdW5zaWduZWQgaW50IG51bV92YWx1ZXMpOworCisjZW5kaWYgLyogX01FQVNfUkVQX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21nY3AuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21nY3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWI3ZmMxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbWdjcC5oCkBAIC0wLDAgKzEsMTM1IEBACisvKiBBIE1lZGlhIEdhdGV3YXkgQ29udHJvbCBQcm90b2NvbCBNZWRpYSBHYXRld2F5OiBSRkMgMzQzNSAqLworCisvKgorICogKEMpIDIwMDktMjAxMCBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiAoQykgMjAwOS0yMDEwIGJ5IE9uLVdhdmVzCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBPUEVOQlNDX01HQ1BfSAorI2RlZmluZSBPUEVOQlNDX01HQ1BfSAorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNkZWZpbmUgUlRQX1BPUlRfREVGQVVMVCA0MDAwCisKKy8qKgorICogQ2FsY3VsYXRlIHRoZSBSVFAgYXVkaW8gcG9ydCBmb3IgdGhlIGdpdmVuIG11bHRpcGxleAorICogYW5kIHRoZSBkaXJlY3Rpb24uIFRoaXMgYWxsb3dzIGEgc2VtaSBzdGF0aWMgZW5kcG9pbnQKKyAqIHRvIHBvcnQgY2FsY3VsYXRpb24gcmVtb3ZpbmcgdGhlIG5lZWQgZm9yIHRoZSBCU0MKKyAqIGFuZCB0aGUgTWVkaWFHYXRld2F5IHRvIGNvbW11bmljYXRlLgorICoKKyAqIFBvcnQgdXNhZ2UgZXhwbGFpbmVkOgorICogICAgICAgYmFzZSArIChtdWx0aXBsZXggKiAyKSArIDAgPT0gbG9jYWwgcG9ydCB0byB3YWl0IGZvciBuZXR3b3JrIHBhY2tldHMKKyAqICAgICAgIGJhc2UgKyAobXVsdGlwbGV4ICogMikgKyAxID09IGxvY2FsIHBvcnQgZm9yIHJ0Y3AKKyAqCisgKiBUaGUgYWJvdmUgcG9ydCB3aWxsIHJlY2VpdmUgcGFja2V0cyBmcm9tIHRoZSBCVFMgdGhhdCBuZWVkCisgKiB0byBiZSBwYXRjaGVkIGFuZCBmb3J3YXJkZWQgdG8gdGhlIG5ldHdvcmsuCisgKiBUaGUgYWJvdmUgcG9ydCB3aWxsIHJlY2VpdmUgcGFja2V0cyBmcm9tIHRoZSBuZXR3b3JrIHRoYXQKKyAqIG5lZWQgdG8gYmUgcGF0Y2hlZCBhbmQgZm9yd2FyZGVkIHRvIHRoZSBCVFMuCisgKgorICogV2UgYXNzdW1lIHRvIGhhdmUgYSBzdGF0aWMgQlRTIElQIGFkZHJlc3Mgc28gd2UgY2FuIGRpZmZlcmVudGlhdGUKKyAqIG5ldHdvcmsgYW5kIEJUUy4KKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHJ0cF9jYWxjdWxhdGVfcG9ydChpbnQgbXVsdGlwbGV4LCBpbnQgYmFzZSkKK3sKKwlyZXR1cm4gYmFzZSArIChtdWx0aXBsZXggKiAyKTsKK30KKworCisvKgorICogSGFuZGxpbmcgb2YgTUdDUCBFbmRwb2ludHMgYW5kIHRoZSBNR0NQIENvbmZpZworICovCitzdHJ1Y3QgbWdjcF9lbmRwb2ludDsKK3N0cnVjdCBtZ2NwX2NvbmZpZzsKKworI2RlZmluZSBNR0NQX0VORFBfQ1JDWCAxCisjZGVmaW5lIE1HQ1BfRU5EUF9ETENYIDIKKyNkZWZpbmUgTUdDUF9FTkRQX01EQ1ggMworCisvKgorICogd2hhdCB0byBkbyB3aXRoIHRoZSBtc2c/CisgKgktIGNvbnRpbnVlIGFzIHVzdWFsPworICoJLSByZWplY3QgYW5kIHNlbmQgYSBmYWlsdXJlIGNvZGU/CisgKgktIGRlZmVyPyBkbyBub3Qgc2VuZCBhbnl0aGluZworICovCisjZGVmaW5lIE1HQ1BfUE9MSUNZX0NPTlQJNAorI2RlZmluZSBNR0NQX1BPTElDWV9SRUpFQ1QJNQorI2RlZmluZSBNR0NQX1BPTElDWV9ERUZFUgk2CisKK3R5cGVkZWYgaW50ICgqbWdjcF9jaGFuZ2UpKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBpbnQgZW5kcG9pbnQsIGludCBzdGF0ZSwgaW50IGxvY2FsX3J0cCk7Cit0eXBlZGVmIGludCAoKm1nY3BfcG9saWN5KShzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgaW50IGVuZHBvaW50LCBpbnQgc3RhdGUsIGNvbnN0IGNoYXIgKnRyYW5zYWN0aW9faWQpOwordHlwZWRlZiBpbnQgKCptZ2NwX3Jlc2V0KShzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZyk7CisKK3N0cnVjdCBtZ2NwX2NvbmZpZyB7CisJaW50IHNvdXJjZV9wb3J0OworCWNoYXIgKmxvY2FsX2lwOworCWNoYXIgKnNvdXJjZV9hZGRyOworCXVuc2lnbmVkIGludCBudW1iZXJfZW5kcG9pbnRzOworCWNoYXIgKmJ0c19pcDsKKwljaGFyICpjYWxsX2FnZW50X2FkZHI7CisKKwlzdHJ1Y3QgaW5fYWRkciBidHNfaW47CisJY2hhciAqYXVkaW9fbmFtZTsKKwlpbnQgYXVkaW9fcGF5bG9hZDsKKwlpbnQgYXVkaW9fbG9vcDsKKwlpbnQgZWFybHlfYmluZDsKKwlpbnQgcnRwX2Jhc2VfcG9ydDsKKworCWNoYXIgKmZvcndhcmRfaXA7CisJaW50IGZvcndhcmRfcG9ydDsKKworCS8qIHNwZWMgaGFuZGxpbmcgKi8KKwlpbnQgZm9yY2VfcmVhbGxvYzsKKworCW1nY3BfY2hhbmdlIGNoYW5nZV9jYjsKKwltZ2NwX3BvbGljeSBwb2xpY3lfY2I7CisJbWdjcF9yZXNldCByZXNldF9jYjsKKwl2b2lkICpkYXRhOworCisJc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHBvaW50czsKKwl1bnNpZ25lZCBpbnQgbGFzdF9jYWxsX2lkOworfTsKKworLyogY29uZmlnIG1hbmFnZW1lbnQgKi8KK3N0cnVjdCBtZ2NwX2NvbmZpZyAqbWdjcF9jb25maWdfYWxsb2Modm9pZCk7CitpbnQgbWdjcF9wYXJzZV9jb25maWcoY29uc3QgY2hhciAqY29uZmlnX2ZpbGUsIHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnKTsKK2ludCBtZ2NwX3Z0eV9pbml0KHZvaWQpOworaW50IG1nY3BfZW5kcG9pbnRzX2FsbG9jYXRlKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnKTsKK2ludCBtZ2NwX2JpbmRfcnRwX3BvcnQoc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHAsIGludCBydHBfcG9ydCk7Cit2b2lkIG1nY3BfZnJlZV9lbmRwKHN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwKTsKKworLyoKKyAqIGZvcm1hdCBoZWxwZXIgZnVuY3Rpb25zCisgKi8KK3N0cnVjdCBtc2diICptZ2NwX2hhbmRsZV9tZXNzYWdlKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnKTsKK3N0cnVjdCBtc2diICptZ2NwX2NyZWF0ZV9yZXNwb25zZV93aXRoX2RhdGEoaW50IGNvZGUsIGNvbnN0IGNoYXIgKm1zZywgY29uc3QgY2hhciAqdHJhbnMsIGNvbnN0IGNoYXIgKmRhdGEpOworCisvKiBhZGMgaGVscGVyICovCitzdGF0aWMgaW5saW5lIGludCBtZ2NwX3RpbWVzbG90X3RvX2VuZHBvaW50KGludCBtdWx0aXBsZXgsIGludCB0aW1lc2xvdCkKK3sKKwlpZiAodGltZXNsb3QgPT0gMCkKKwkJdGltZXNsb3QgPSAxOworCXJldHVybiB0aW1lc2xvdCArICgzMSAqIG11bHRpcGxleCk7Cit9CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tZ2NwX2ludGVybmFsLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tZ2NwX2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVhZWMzMAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21nY3BfaW50ZXJuYWwuaApAQCAtMCwwICsxLDc4IEBACisvKiBNR0NQIFByaXZhdGUgRGF0YSAqLworCisvKgorICogKEMpIDIwMDktMjAxMCBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiAoQykgMjAwOS0yMDEwIGJ5IE9uLVdhdmVzCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBPUEVOQlNDX01HQ1BfREFUQV9ICisjZGVmaW5lIE9QRU5CU0NfTUdDUF9EQVRBX0gKKworI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorCisjZGVmaW5lIENJX1VOVVNFRCAwCisKK3N0cnVjdCBtZ2NwX2VuZHBvaW50IHsKKwlpbnQgY2k7CisJY2hhciAqY2FsbGlkOworCWNoYXIgKmxvY2FsX29wdGlvbnM7CisJaW50IGNvbm5fbW9kZTsKKworCWludCBidHNfcGF5bG9hZF90eXBlOworCWludCBuZXRfcGF5bG9hZF90eXBlOworCisJLyogdGhlIGxvY2FsIHJ0cCBwb3J0IHdlIGFyZSBiaW5kaW5nIHRvICovCisJaW50IHJ0cF9wb3J0OworCisJLyoKKwkgKiBSVFAgbWFuZ2xpbmc6CisJICogIC0gd2UgZ2V0IFJUUCBhbmQgUlRDUCB0byB1cyBhbmQgbmVlZCB0byBmb3J3YXJkIHRvIHRoZSBCVFMKKwkgKiAgLSB3ZSBnZXQgUlRQIGFuZCBSVENQIGZyb20gdGhlIEJUUyBhbmQgZm9yd2FyZCB0byB0aGUgbmV0d29yaworCSAqLworCXN0cnVjdCBic2NfZmQgbG9jYWxfcnRwOworCXN0cnVjdCBic2NfZmQgbG9jYWxfcnRjcDsKKworCXN0cnVjdCBpbl9hZGRyIHJlbW90ZTsKKwlzdHJ1Y3QgaW5fYWRkciBidHM7CisKKwkvKiBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KKwlpbnQgbmV0X3J0cCwgbmV0X3J0Y3A7CisJaW50IGJ0c19ydHAsIGJ0c19ydGNwOworCisJLyogYmFja3BvaW50ZXIgKi8KKwlzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZzsKKworCS8qIHN0YXRpc3RpY3MgKi8KKwl1bnNpZ25lZCBpbnQgaW5fYnRzOworCXVuc2lnbmVkIGludCBpbl9yZW1vdGU7Cit9OworCisjZGVmaW5lIEVORFBPSU5UX05VTUJFUihlbmRwKSBhYnMoZW5kcCAtIGVuZHAtPmNmZy0+ZW5kcG9pbnRzKQorCitzdHJ1Y3QgbWdjcF9tc2dfcHRyIHsKKwl1bnNpZ25lZCBpbnQgc3RhcnQ7CisJdW5zaWduZWQgaW50IGxlbmd0aDsKK307CisKK2ludCBtZ2NwX2FuYWx5emVfaGVhZGVyKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnLAorCQkJc3RydWN0IG1nY3BfbXNnX3B0ciAqcHRyLCBpbnQgc2l6ZSwKKwkJCWNvbnN0IGNoYXIgKip0cmFuc2FjdGlvbl9pZCwgc3RydWN0IG1nY3BfZW5kcG9pbnQgKiplbmRwKTsKK2ludCBtZ2NwX3NlbmRfZHVtbXkoc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHApOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21pc2RuLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9taXNkbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMzhkZTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9taXNkbi5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qIChDKSAyMDA4IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBNSVNETl9ICisjZGVmaW5lIE1JU0ROX0gKKworI2luY2x1ZGUgImUxX2lucHV0LmgiCisKK2ludCBtaV9zZXR1cChpbnQgY2FyZG5yLCAgc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUsIGludCByZWxlYXNlX2wyKTsKK2ludCBfYWJpc19ubV9zZW5kbXNnKHN0cnVjdCBtc2diICptc2cpOworaW50IG1pX2UxX2xpbmVfdXBkYXRlKHN0cnVjdCBlMWlucF9saW5lICpsaW5lKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tbmNjLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tbmNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I4MzM5YQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21uY2MuaApAQCAtMCwwICsxLDE1OSBAQAorLyogR1NNIE1vYmlsZSBSYWRpbyBJbnRlcmZhY2UgTGF5ZXIgMyBtZXNzYWdlcyBvbiB0aGUgQS1iaXMgaW50ZXJmYWNlIAorICogM0dQUCBUUyAwNC4wOCB2ZXJzaW9uIDcuMjEuMCBSZWxlYXNlIDE5OTggLyBFVFNJIFRTIDEwMCA5NDAgVjcuMjEuMCAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOCwgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX01OQ0NfSAorI2RlZmluZSBfTU5DQ19ICisKKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tbmNjLmg+CisKKy8qIE9uZSBlbmQgb2YgYSBjYWxsICovCitzdHJ1Y3QgZ3NtX2NhbGwgeworCXN0cnVjdCBsbGlzdF9oZWFkIGVudHJ5OworCisJLyogbmV0d29yayBoYW5kbGUgKi8KKwl2b2lkICpuZXQ7CisKKwkvKiB0aGUgJ2xvY2FsJyB0cmFuc2FjdGlvbiAqLworCXVfaW50MzJfdCBjYWxscmVmOworCS8qIHRoZSAncmVtb3RlJyB0cmFuc2FjdGlvbiAqLworCXVfaW50MzJfdCByZW1vdGVfcmVmOworfTsKKworI2RlZmluZSBNTkNDX1NFVFVQX1JFUQkJMHgwMTAxCisjZGVmaW5lIE1OQ0NfU0VUVVBfSU5ECQkweDAxMDIKKyNkZWZpbmUgTU5DQ19TRVRVUF9SU1AJCTB4MDEwMworI2RlZmluZSBNTkNDX1NFVFVQX0NORgkJMHgwMTA0CisjZGVmaW5lIE1OQ0NfU0VUVVBfQ09NUExfUkVRCTB4MDEwNQorI2RlZmluZSBNTkNDX1NFVFVQX0NPTVBMX0lORAkweDAxMDYKKy8qIE1OQ0NfUkVKXyogaXMgcGVyZm9tZWQgdmlhIE1OQ0NfUkVMXyogKi8KKyNkZWZpbmUgTU5DQ19DQUxMX0NPTkZfSU5ECTB4MDEwNworI2RlZmluZSBNTkNDX0NBTExfUFJPQ19SRVEJMHgwMTA4CisjZGVmaW5lIE1OQ0NfUFJPR1JFU1NfUkVRCTB4MDEwOQorI2RlZmluZSBNTkNDX0FMRVJUX1JFUQkJMHgwMTBhCisjZGVmaW5lIE1OQ0NfQUxFUlRfSU5ECQkweDAxMGIKKyNkZWZpbmUgTU5DQ19OT1RJRllfUkVRCQkweDAxMGMKKyNkZWZpbmUgTU5DQ19OT1RJRllfSU5ECQkweDAxMGQKKyNkZWZpbmUgTU5DQ19ESVNDX1JFUQkJMHgwMTBlCisjZGVmaW5lIE1OQ0NfRElTQ19JTkQJCTB4MDEwZgorI2RlZmluZSBNTkNDX1JFTF9SRVEJCTB4MDExMAorI2RlZmluZSBNTkNDX1JFTF9JTkQJCTB4MDExMQorI2RlZmluZSBNTkNDX1JFTF9DTkYJCTB4MDExMgorI2RlZmluZSBNTkNDX0ZBQ0lMSVRZX1JFUQkweDAxMTMKKyNkZWZpbmUgTU5DQ19GQUNJTElUWV9JTkQJMHgwMTE0CisjZGVmaW5lIE1OQ0NfU1RBUlRfRFRNRl9JTkQJMHgwMTE1CisjZGVmaW5lIE1OQ0NfU1RBUlRfRFRNRl9SU1AJMHgwMTE2CisjZGVmaW5lIE1OQ0NfU1RBUlRfRFRNRl9SRUoJMHgwMTE3CisjZGVmaW5lIE1OQ0NfU1RPUF9EVE1GX0lORAkweDAxMTgKKyNkZWZpbmUgTU5DQ19TVE9QX0RUTUZfUlNQCTB4MDExOQorI2RlZmluZSBNTkNDX01PRElGWV9SRVEJCTB4MDExYQorI2RlZmluZSBNTkNDX01PRElGWV9JTkQJCTB4MDExYgorI2RlZmluZSBNTkNDX01PRElGWV9SU1AJCTB4MDExYworI2RlZmluZSBNTkNDX01PRElGWV9DTkYJCTB4MDExZAorI2RlZmluZSBNTkNDX01PRElGWV9SRUoJCTB4MDExZQorI2RlZmluZSBNTkNDX0hPTERfSU5ECQkweDAxMWYKKyNkZWZpbmUgTU5DQ19IT0xEX0NORgkJMHgwMTIwCisjZGVmaW5lIE1OQ0NfSE9MRF9SRUoJCTB4MDEyMQorI2RlZmluZSBNTkNDX1JFVFJJRVZFX0lORAkweDAxMjIKKyNkZWZpbmUgTU5DQ19SRVRSSUVWRV9DTkYJMHgwMTIzCisjZGVmaW5lIE1OQ0NfUkVUUklFVkVfUkVKCTB4MDEyNAorI2RlZmluZSBNTkNDX1VTRVJJTkZPX1JFUQkweDAxMjUKKyNkZWZpbmUgTU5DQ19VU0VSSU5GT19JTkQJMHgwMTI2CisjZGVmaW5lIE1OQ0NfUkVKX1JFUQkJMHgwMTI3CisjZGVmaW5lIE1OQ0NfUkVKX0lORAkJMHgwMTI4CisKKyNkZWZpbmUgTU5DQ19CUklER0UJCTB4MDIwMAorI2RlZmluZSBNTkNDX0ZSQU1FX1JFQ1YJCTB4MDIwMQorI2RlZmluZSBNTkNDX0ZSQU1FX0RST1AJCTB4MDIwMgorI2RlZmluZSBNTkNDX0xDSEFOX01PRElGWQkweDAyMDMKKworI2RlZmluZSBHU01fVENIRl9GUkFNRQkJMHgwMzAwCisjZGVmaW5lIEdTTV9UQ0hGX0ZSQU1FX0VGUgkweDAzMDEKKworI2RlZmluZSBHU01fTUFYX0ZBQ0lMSVRZCTEyOAorI2RlZmluZSBHU01fTUFYX1NTVkVSU0lPTgkxMjgKKyNkZWZpbmUgR1NNX01BWF9VU0VSVVNFUgkxMjgKKworI2RlZmluZQlNTkNDX0ZfQkVBUkVSX0NBUAkweDAwMDEKKyNkZWZpbmUgTU5DQ19GX0NBTExFRAkJMHgwMDAyCisjZGVmaW5lIE1OQ0NfRl9DQUxMSU5HCQkweDAwMDQKKyNkZWZpbmUgTU5DQ19GX1JFRElSRUNUSU5HCTB4MDAwOAorI2RlZmluZSBNTkNDX0ZfQ09OTkVDVEVECTB4MDAxMAorI2RlZmluZSBNTkNDX0ZfQ0FVU0UJCTB4MDAyMAorI2RlZmluZSBNTkNDX0ZfVVNFUlVTRVIJCTB4MDA0MAorI2RlZmluZSBNTkNDX0ZfUFJPR1JFU1MJCTB4MDA4MAorI2RlZmluZSBNTkNDX0ZfRU1FUkdFTkNZCTB4MDEwMAorI2RlZmluZSBNTkNDX0ZfRkFDSUxJVFkJCTB4MDIwMAorI2RlZmluZSBNTkNDX0ZfU1NWRVJTSU9OCTB4MDQwMAorI2RlZmluZSBNTkNDX0ZfQ0NDQVAJCTB4MDgwMAorI2RlZmluZSBNTkNDX0ZfS0VZUEFECQkweDEwMDAKKyNkZWZpbmUgTU5DQ19GX1NJR05BTAkJMHgyMDAwCisKK3N0cnVjdCBnc21fbW5jYyB7CisJLyogY29udGV4dCBiYXNlZCBpbmZvcm1hdGlvbiAqLworCXVfaW50MzJfdAltc2dfdHlwZTsKKwl1X2ludDMyX3QJY2FsbHJlZjsKKworCS8qIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCAqLworCXVfaW50MzJfdAlmaWVsZHM7CisKKwkvKiBkYXRhIGRlcml2ZWQgaW5mb3JtYXRpb25zIChNTkNDX0ZfIGJhc2VkKSAqLworCXN0cnVjdCBnc21fbW5jY19iZWFyZXJfY2FwCWJlYXJlcl9jYXA7CisJc3RydWN0IGdzbV9tbmNjX251bWJlcgkJY2FsbGVkOworCXN0cnVjdCBnc21fbW5jY19udW1iZXIJCWNhbGxpbmc7CisJc3RydWN0IGdzbV9tbmNjX251bWJlcgkJcmVkaXJlY3Rpbmc7CisJc3RydWN0IGdzbV9tbmNjX251bWJlcgkJY29ubmVjdGVkOworCXN0cnVjdCBnc21fbW5jY19jYXVzZQkJY2F1c2U7CisJc3RydWN0IGdzbV9tbmNjX3Byb2dyZXNzCXByb2dyZXNzOworCXN0cnVjdCBnc21fbW5jY191c2VydXNlcgl1c2VydXNlcjsKKwlzdHJ1Y3QgZ3NtX21uY2NfZmFjaWxpdHkJZmFjaWxpdHk7CisJc3RydWN0IGdzbV9tbmNjX2NjY2FwCQljY2NhcDsKKwlzdHJ1Y3QgZ3NtX21uY2Nfc3N2ZXJzaW9uCXNzdmVyc2lvbjsKKwlzdHJ1Y3QJeworCQlpbnQJCXN1cDsKKwkJaW50CQlpbnY7CisJfSBjbGlyOworCWludAkJc2lnbmFsOworCisJLyogZGF0YSBkZXJpdmVkIGluZm9ybWF0aW9uLCBub3QgTU5DQ19GIGJhc2VkICovCisJaW50CQlrZXlwYWQ7CisJaW50CQltb3JlOworCWludAkJbm90aWZ5OyAvKiAwLi4xMjcgKi8KKwlpbnQJCWVtZXJnZW5jeTsKKwljaGFyCQlpbXNpWzE2XTsKKworCXVuc2lnbmVkIGNoYXIJbGNoYW5fbW9kZTsKK307CisKK3N0cnVjdCBnc21fZGF0YV9mcmFtZSB7CisJdV9pbnQzMl90CW1zZ190eXBlOworCXVfaW50MzJfdAljYWxscmVmOworCXVuc2lnbmVkIGNoYXIJZGF0YVswXTsKK307CisKK2NoYXIgKmdldF9tbmNjX25hbWUoaW50IHZhbHVlKTsKK2ludCBtbmNjX3JlY3Yoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGludCBtc2dfdHlwZSwgdm9pZCAqYXJnKTsKK3ZvaWQgbW5jY19zZXRfY2F1c2Uoc3RydWN0IGdzbV9tbmNjICpkYXRhLCBpbnQgbG9jLCBpbnQgdmFsKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9vcGVuYnNjZGVmaW5lcy5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvb3BlbmJzY2RlZmluZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODJlNTkyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvb3BlbmJzY2RlZmluZXMuaApAQCAtMCwwICsxLDM1IEBACisvKiAKKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBPUEVOQlNDREVGSU5FU19ICisjZGVmaW5lIE9QRU5CU0NERUZJTkVTX0gKKworI2lmZGVmIEJVSUxESU5HX09OX1dJTkRPV1MKKyAgICAjaWZkZWYgQlVJTERJTkdfT1BFTkJTQworICAgICAgICAjZGVmaW5lIEJTQ19BUEkgX19kZWNsc3BlYyhkbGxleHBvcnQpCisgICAgI2Vsc2UKKyAgICAgICAgI2RlZmluZSBCU0NfQVBJIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorICAgICNlbmRpZgorI2Vsc2UKKyAgICAjZGVmaW5lIEJTQ19BUEkgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3BhZ2luZy5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvcGFnaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNiZGNhOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3BhZ2luZy5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qIFBhZ2luZyBoZWxwZXIgYW5kIG1hbmFnZXIuLi4uICovCisvKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBQQUdJTkdfSAorI2RlZmluZSBQQUdJTkdfSAorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlICJnc21fZGF0YS5oIgorI2luY2x1ZGUgImdzbV9zdWJzY3JpYmVyLmgiCisjaW5jbHVkZSA8b3Ntb2NvcmUvdGltZXIuaD4KKworLyogY2FsbCBvbmNlIGZvciBldmVyeSBnc21fYnRzLi4uICovCit2b2lkIHBhZ2luZ19pbml0KHN0cnVjdCBnc21fYnRzICpidHMpOworCisvKiBzY2hlZHVsZSBwYWdpbmcgcmVxdWVzdCAqLworaW50IHBhZ2luZ19yZXF1ZXN0KHN0cnVjdCBnc21fbmV0d29yayAqbmV0d29yaywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCSAgIGludCB0eXBlLCBnc21fY2JmbiAqY2Jmbiwgdm9pZCAqZGF0YSk7CisKKy8qIHN0b3AgcGFnaW5nIHJlcXVlc3RzICovCit2b2lkIHBhZ2luZ19yZXF1ZXN0X3N0b3Aoc3RydWN0IGdzbV9idHMgKmJ0cywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQkgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworCisvKiB1cGRhdGUgcGFnaW5nIGxvYWQgKi8KK3ZvaWQgcGFnaW5nX3VwZGF0ZV9idWZmZXJfc3BhY2Uoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQxNl90KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9yZXN0X29jdGV0cy5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvcmVzdF9vY3RldHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDkwMTE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvcmVzdF9vY3RldHMuaApAQCAtMCwwICsxLDEzMyBAQAorI2lmbmRlZiBfUkVTVF9PQ1RFVFNfSAorI2RlZmluZSBfUkVTVF9PQ1RFVFNfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKworLyogZ2VuZXJhdGUgU0kxIHJlc3Qgb2N0ZXRzICovCitpbnQgcmVzdF9vY3RldHNfc2kxKHVfaW50OF90ICpkYXRhLCB1X2ludDhfdCAqbmNoX3Bvcyk7CisKK3N0cnVjdCBnc200OF9zaV9zZWxlY3Rpb25fcGFyYW1zIHsKKwl1X2ludDE2X3QgcGVuYWx0eV90aW1lOjUsCisJCSAgdGVtcF9vZmZzOjMsCisJCSAgY2VsbF9yZXNlbF9vZmY6NiwKKwkJICBjYnE6MSwKKwkJICBwcmVzZW50OjE7Cit9OworCitzdHJ1Y3QgZ3NtNDhfc2lfcG93ZXJfb2Zmc2V0IHsKKwl1X2ludDhfdCBwb3dlcl9vZmZzZXQ6MiwKKwkJIHByZXNlbnQ6MTsKK307CisKK3N0cnVjdCBnc200OF9zaTNfZ3Byc19pbmQgeworCXVfaW50OF90IHNpMTNfcG9zaXRpb246MSwKKwkJIHJhX2NvbG91cjozLAorCQkgcHJlc2VudDoxOworfTsKKworc3RydWN0IGdzbTQ4X2xzYV9wYXJhbXMgeworCXVfaW50MzJfdCBwcmlvX3RocjozLAorCQkgbHNhX29mZnNldDozLAorCQkgbWNjOjEyLAorCQkgbW5jOjEyOworCXVuc2lnbmVkIGludCBwcmVzZW50OworfTsKKworc3RydWN0IGdzbTQ4X3NpX3JvX2luZm8geworCXN0cnVjdCBnc200OF9zaV9zZWxlY3Rpb25fcGFyYW1zIHNlbGVjdGlvbl9wYXJhbXM7CisJc3RydWN0IGdzbTQ4X3NpX3Bvd2VyX29mZnNldCBwb3dlcl9vZmZzZXQ7CisJdV9pbnQ4X3Qgc2kydGVyX2luZGljYXRvcjsKKwl1X2ludDhfdCBlYXJseV9jbV9jdHJsOworCXN0cnVjdCB7CisJCXVfaW50OF90IHdoZXJlOjMsCisJCQkgcHJlc2VudDoxOworCX0gc2NoZWR1bGluZzsKKwlzdHJ1Y3QgZ3NtNDhfc2kzX2dwcnNfaW5kIGdwcnNfaW5kOworCisJLyogU0kgNCBzcGVjaWZpYyAqLworCXN0cnVjdCBnc200OF9sc2FfcGFyYW1zIGxzYV9wYXJhbXM7CisJdV9pbnQxNl90IGNlbGxfaWQ7CisJdV9pbnQ4X3QgYnJlYWtfaW5kOwkvKiBkbyB3ZSBoYXZlIFNJNyArIFNJOCA/ICovCit9OworCisKKy8qIEdlbmVyYXRlIFNJMyBSZXN0IE9jdGVzdHMgKENoYXB0ZXIgMTAuNS4yLjM0IC8gVGFibGUgMTAuNC43MikgKi8KK2ludCByZXN0X29jdGV0c19zaTModV9pbnQ4X3QgKmRhdGEsIGNvbnN0IHN0cnVjdCBnc200OF9zaV9yb19pbmZvICpzaTMpOworCisvKiBHZW5lcmF0ZSBTSTQgUmVzdCBPY3RldHMgKENoYXB0ZXIgMTAuNS4yLjM1KSAqLworaW50IHJlc3Rfb2N0ZXRzX3NpNCh1X2ludDhfdCAqZGF0YSwgY29uc3Qgc3RydWN0IGdzbTQ4X3NpX3JvX2luZm8gKnNpNCk7CisKK2VudW0gcGJjY2hfY2Fycmllcl90eXBlIHsKKwlQQkNDSF9CQ0NILAorCVBCQ0NIX0FSRkNOLAorCVBCQ0NIX01BSU8KK307CisKKy8qIFRTIDAzLjYwIENoYXB0ZXIgNi4zLjMuMTogTmV0d29yayBNb2RlIG9mIE9wZXJhdGlvbiAqLworZW51bSBncHJzX25tbyB7CisJR1BSU19OTU9fSQk9IDAsCS8qIENTIHBhZ2luIG9uIEdQUlMgcGFnaW5nIG9yIHRyYWZmaWMgY2hhbm5lbCAqLworCUdQUlNfTk1PX0lJCT0gMSwJLyogYWxsIHBhZ2luZyBvbiBDQ0NIICovCisJR1BSU19OTU9fSUlJCT0gMiwJLyogbm8gcGFnaW5nIGNvb3JkaW5hdGlvbiAqLworfTsKKworLyogVFMgMDQuNjAgMTIuMjQgKi8KK3N0cnVjdCBncHJzX2NlbGxfb3B0aW9ucyB7CisJZW51bSBncHJzX25tbyBubW87CisJLyogVDMxNjg6IHdhaXQgZm9yIHBhY2tldCB1cGxpbmsgYXNzaWdubWVudCBtZXNzYWdlICovCisJdV9pbnQzMl90IHQzMTY4OwkvKiBpbiBtaWxsaXNlY29uZHMgKi8KKwkvKiBUMzE5Mjogd2FpdCBmb3IgcmVsZWFzZSBvZiB0aGUgVEJGIGFmdGVyIHJlY2VwdGlvbiBvZiB0aGUgZmluYWwgYmxvY2sgKi8KKwl1X2ludDMyX3QgdDMxOTI7CS8qIGluIG1pbGxpc2Vjb25kcyAqLworCXVfaW50MzJfdCBkcnhfdGltZXJfbWF4Oy8qIGluIHNlY29uZHMgKi8KKwl1X2ludDMyX3QgYnNfY3ZfbWF4OworCisJdV9pbnQ4X3QgZXh0X2luZm9fcHJlc2VudDsKKwlzdHJ1Y3QgeworCQl1X2ludDhfdCBlZ3Byc19zdXBwb3J0ZWQ7CisJCQl1X2ludDhfdCB1c2VfZWdwcnNfcF9jaF9yZXE7CisJCQl1X2ludDhfdCBiZXBfcGVyaW9kOworCQl1X2ludDhfdCBwZmNfc3VwcG9ydGVkOworCQl1X2ludDhfdCBkdG1fc3VwcG9ydGVkOworCQl1X2ludDhfdCBic3NfcGFnaW5nX2Nvb3JkaW5hdGlvbjsKKwl9IGV4dF9pbmZvOworfTsKKworLyogVFMgMDQuNjAgVGFibGUgMTIuOS4yICovCitzdHJ1Y3QgZ3Byc19wb3dlcl9jdHJsX3BhcnMgeworCXVfaW50OF90IGFscGhhOworCXVfaW50OF90IHRfYXZnX3c7CisJdV9pbnQ4X3QgdF9hdmdfdDsKKwl1X2ludDhfdCBwY19tZWFzX2NoYW47CisJdV9pbnQ4X3Qgbl9hdmdfaTsKK307CisKK3N0cnVjdCBnc200OF9zaTEzX2luZm8geworCXN0cnVjdCBncHJzX2NlbGxfb3B0aW9ucyBjZWxsX29wdHM7CisJc3RydWN0IGdwcnNfcG93ZXJfY3RybF9wYXJzIHB3cl9jdHJsX3BhcnM7CisJdV9pbnQ4X3QgYmNjaF9jaGFuZ2VfbWFyazsKKwl1X2ludDhfdCBzaV9jaGFuZ2VfZmllbGQ7CisJdV9pbnQ4X3QgcGJjY2hfcHJlc2VudDsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVfaW50OF90IHJhYzsKKwkJCXVfaW50OF90IHNwZ2NfY2NjaF9zdXA7CisJCQl1X2ludDhfdCBuZXRfY3RybF9vcmQ7CisJCQl1X2ludDhfdCBwcmlvX2FjY190aHI7CisJCX0gbm9fcGJjY2g7CisJCXN0cnVjdCB7CisJCQl1X2ludDhfdCBwc2kxX3JlcF9wZXI7CisJCQl1X2ludDhfdCBwYjsKKwkJCXVfaW50OF90IHRzYzsKKwkJCXVfaW50OF90IHRuOworCQkJZW51bSBwYmNjaF9jYXJyaWVyX3R5cGUgY2Fycmllcl90eXBlOworCQkJdV9pbnQxNl90IGFyZmNuOworCQkJdV9pbnQ4X3QgbWFpbzsKKwkJfSBwYmNjaDsKKwl9OworfTsKKworLyogR2VuZXJhdGUgU0kxMyBSZXN0IE9jdGVzdHMgKENoYXB0ZXIgMTAuNS4yLjM3YikgKi8KK2ludCByZXN0X29jdGV0c19zaTEzKHVfaW50OF90ICpkYXRhLCBjb25zdCBzdHJ1Y3QgZ3NtNDhfc2kxM19pbmZvICpzaTEzKTsKKworI2VuZGlmIC8qIF9SRVNUX09DVEVUU19IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9yczIzMi5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvcnMyMzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTE4N2NhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvcnMyMzIuaApAQCAtMCwwICsxLDkgQEAKKyNpZm5kZWYgX1JTMjMyX0gKKyNkZWZpbmUgX1JTMjMyX0gKKworaW50IHJzMjMyX3NldHVwKGNvbnN0IGNoYXIgKnNlcmlhbF9wb3J0LCB1bnNpZ25lZCBpbnQgZGVsYXlfbXMsCisJCXN0cnVjdCBnc21fYnRzICpidHMpOworCitpbnQgaGFuZGxlX3NlcmlhbF9tc2coc3RydWN0IG1zZ2IgKm1zZyk7CisKKyNlbmRpZiAvKiBfUlMyMzJfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvcnRwX3Byb3h5LmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ydHBfcHJveHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWIxYTVmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvcnRwX3Byb3h5LmgKQEAgLTAsMCArMSw5MSBAQAorI2lmbmRlZiBfUlRQX1BST1hZX0gKKyNkZWZpbmUgX1JUUF9QUk9YWV9ICisKKy8qIFJUUCBwcm94eSBoYW5kbGluZyBmb3IgaXAuYWNjZXNzIG5hbm9CVFMgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKworI2RlZmluZSBSVFBfUFRfR1NNX0ZVTEwgMworI2RlZmluZSBSVFBfUFRfR1NNX0hBTEYgOTYKKyNkZWZpbmUgUlRQX1BUX0dTTV9FRlIgOTcKKyNkZWZpbmUgUlRQX1BUX0FNUl9GVUxMIDk4CisjZGVmaW5lIFJUUF9QVF9BTVJfSEFMRiA5OQorCitlbnVtIHJ0cF9yeF9hY3Rpb24geworCVJUUF9OT05FLAorCVJUUF9QUk9YWSwKKwlSVFBfUkVDVl9VUFNUUkVBTSwKK307CisKK2VudW0gcnRwX3R4X2FjdGlvbiB7CisJUlRQX1NFTkRfTk9ORSwKKwlSVFBfU0VORF9ET1dOU1RSRUFNLAorfTsKKworc3RydWN0IHJ0cF9zdWJfc29ja2V0IHsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luX2xvY2FsOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW5fcmVtb3RlOworCisJc3RydWN0IGJzY19mZCBiZmQ7CisJLyogbGlua2VkIGxpc3Qgb2YgdG8tYmUtdHJhbnNtaXR0ZWQgbXNnYidzICovCisJc3RydWN0IGxsaXN0X2hlYWQgdHhfcXVldWU7Cit9OworCitzdHJ1Y3QgcnRwX3NvY2tldCB7CisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKworCXN0cnVjdCBydHBfc3ViX3NvY2tldCBydHA7CisJc3RydWN0IHJ0cF9zdWJfc29ja2V0IHJ0Y3A7CisKKwkvKiB3aGF0IHNob3VsZCB3ZSBkbyBvbiByZWNlaXZlPyAqLworCWVudW0gcnRwX3J4X2FjdGlvbiByeF9hY3Rpb247CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJc3RydWN0IHJ0cF9zb2NrZXQgKm90aGVyX3NvY2s7CisJCX0gcHJveHk7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldDsKKwkJCXVfaW50MzJfdCBjYWxscmVmOworCQl9IHJlY2VpdmU7CisJfTsKKwllbnVtIHJ0cF90eF9hY3Rpb24gdHhfYWN0aW9uOworCXN0cnVjdCB7CisJCXVfaW50MTZfdCBzZXF1ZW5jZTsKKwkJdV9pbnQzMl90IHRpbWVzdGFtcDsKKwkJdV9pbnQzMl90IHNzcmM7CisJCXN0cnVjdCB0aW1ldmFsIGxhc3RfdHY7CisJfSB0cmFuc21pdDsKK307CisKK3N0cnVjdCBydHBfc29ja2V0ICpydHBfc29ja2V0X2NyZWF0ZSh2b2lkKTsKK2ludCBydHBfc29ja2V0X2JpbmQoc3RydWN0IHJ0cF9zb2NrZXQgKnJzLCB1X2ludDMyX3QgaXApOworaW50IHJ0cF9zb2NrZXRfY29ubmVjdChzdHJ1Y3QgcnRwX3NvY2tldCAqcnMsIHVfaW50MzJfdCBpcCwgdV9pbnQxNl90IHBvcnQpOworaW50IHJ0cF9zb2NrZXRfcHJveHkoc3RydWN0IHJ0cF9zb2NrZXQgKnRoaXMsIHN0cnVjdCBydHBfc29ja2V0ICpvdGhlcik7CitpbnQgcnRwX3NvY2tldF91cHN0cmVhbShzdHJ1Y3QgcnRwX3NvY2tldCAqdGhpcywgc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIHVfaW50MzJfdCBjYWxscmVmKTsKK2ludCBydHBfc29ja2V0X2ZyZWUoc3RydWN0IHJ0cF9zb2NrZXQgKnJzKTsKK2ludCBydHBfc2VuZF9mcmFtZShzdHJ1Y3QgcnRwX3NvY2tldCAqcnMsIHN0cnVjdCBnc21fZGF0YV9mcmFtZSAqZnJhbWUpOworCisjZW5kaWYgLyogX1JUUF9QUk9YWV9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zZ3NuLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zZ3NuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRjNTNjMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3Nnc24uaApAQCAtMCwwICsxLDMwIEBACisjaWZuZGVmIF9TR1NOX0gKKyNkZWZpbmUgX1NHU05fSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfbnMuaD4KKworc3RydWN0IHNnc25fY29uZmlnIHsKKwkvKiBwYXJzZWQgZnJvbSBjb25maWcgZmlsZSAqLworCXVfaW50MzJfdCBuc2lwX2xpc3Rlbl9pcDsKKwl1X2ludDE2X3QgbnNpcF9saXN0ZW5fcG9ydDsKKworCS8qIG1pc2MgKi8KKwlzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2k7Cit9OworCisKKy8qIHNnc25fdnR5LmMgKi8KKworaW50IHNnc25fdnR5X2luaXQodm9pZCk7CitpbnQgc2dzbl9wYXJzZV9jb25maWcoY29uc3QgY2hhciAqY29uZmlnX2ZpbGUsIHN0cnVjdCBzZ3NuX2NvbmZpZyAqY2ZnKTsKKworLyogc2dzbi5jICovCisKKy8qIE1haW4gaW5wdXQgZnVuY3Rpb24gZm9yIEdiIHByb3h5ICovCitpbnQgc2dzbl9yY3Ztc2coc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdwcnNfbnN2YyAqbnN2YywgdWludDE2X3QgbnNfYnZjaSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc2lnbmFsLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2YzZmUzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc2lnbmFsLmgKQEAgLTAsMCArMSwxNDcgQEAKKy8qIEdlbmVyaWMgc2lnbmFsbGluZy9ub3RpZmljYXRpb24gaW5mcmFzdHJ1Y3R1cmUgKi8KKy8qIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBPUEVOQlNDX1NJR05BTF9ICisjZGVmaW5lIE9QRU5CU0NfU0lHTkFMX0gKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9zaWduYWwuaD4KKworLyoKKyAqIFNpZ25hbGxpbmcgc3Vic3lzdGVtcworICovCitlbnVtIHNpZ25hbF9zdWJzeXN0ZW1zIHsKKwlTU19QQUdJTkcsCisJU1NfU01TLAorCVNTX0FCSVNJUCwKKwlTU19OTSwKKwlTU19MQ0hBTiwKKwlTU19TVUJTQ1IsCisJU1NfU0NBTEwsCisJU1NfR0xPQkFMLAorCVNTX0NIQUxMT0MsCit9OworCisvKiBTU19QQUdJTkcgc2lnbmFscyAqLworZW51bSBzaWduYWxfcGFnaW5nIHsKKwlTX1BBR0lOR19TVUNDRUVERUQsCisJU19QQUdJTkdfRVhQSVJFRCwKK307CisKKy8qIFNTX1NNUyBzaWduYWxzICovCitlbnVtIHNpZ25hbF9zbXMgeworCVNfU01TX1NVQk1JVFRFRCwJLyogQSBTTVMgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHN1Ym1pdHRlZCB0byB1cyAqLworCVNfU01TX0RFTElWRVJFRCwJLyogQSBTTVMgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGRlbGl2ZXJlZCB0byBhIE1TICovCisJU19TTVNfU01NQSwJCS8qIEEgTVMgdGVsbHMgdXMgaXQgaGFzIG1vcmUgc3BhY2UgYXZhaWxhYmxlICovCisJU19TTVNfTUVNX0VYQ0VFREVELAkvKiBBIE1TIHRlbGxzIHVzIGl0IGhhcyBubyBtb3JlIHNwYWNlIGF2YWlsYWJsZSAqLworfTsKKworLyogU1NfQUJJU0lQIHNpZ25hbHMgKi8KK2VudW0gc2lnbmFsX2FiaXNpcCB7CisJU19BQklTSVBfQ1JDWF9BQ0ssCisJU19BQklTSVBfTURDWF9BQ0ssCisJU19BQklTSVBfRExDWF9JTkQsCit9OworCisvKiBTU19OTSBzaWduYWxzICovCitlbnVtIHNpZ25hbF9ubSB7CisJU19OTV9TV19BQ1RJVl9SRVAsCS8qIEdTTSAxMi4yMSBzb2Z0d2FyZSBhY3RpdmF0ZWQgcmVwb3J0ICovCisJU19OTV9GQUlMX1JFUCwJCS8qIEdTTSAxMi4yMSBmYWlsdXJlIGV2ZW50IHJlcG9ydCAqLworCVNfTk1fTkFDSywJCS8qIEdTTSAxMi4yMSB2YXJpb3VzIE5NX01UXypfTkFDSyBoYXBwZW5lZCAqLworCVNfTk1fSVBBQ0NfTkFDSywJLyogR1NNIDEyLjIxIG5hbm9CVFMgZXh0ZW5zaW9ucyBOTV9NVF9JUEFDQ18qXypfTkFDSyBoYXBwZW5lZCAqLworCVNfTk1fSVBBQ0NfQUNLLAkJLyogR1NNIDEyLjIxIG5hbm9CVFMgZXh0ZW5zaW9ucyBOTV9NVF9JUEFDQ18qXypfQUNLIGhhcHBlbmVkICovCisJU19OTV9JUEFDQ19SRVNUQVJUX0FDSywgLyogbmFub0JUUyBoYXMgc2VuZCBhIHJlc3RhcnQgYWNrICovCisJU19OTV9JUEFDQ19SRVNUQVJUX05BQ0ssLyogbmFub0JUUyBoYXMgc2VuZCBhIHJlc3RhcnQgYWNrICovCisJU19OTV9URVNUX1JFUCwJCS8qIEdTTSAxMi4yMSBUZXN0IFJlcG9ydCAqLworfTsKKworLyogU1NfTENIQU4gc2lnbmFscyAqLworZW51bSBzaWduYWxfbGNoYW4geworCS8qCisJICogVGhlIGxjaGFuIGdvdCBmcmVlZCB3aXRoIGFuIHVzZV9jb3VudCAhPSAwIGFuZCBlcnJvcgorCSAqIHJlY292ZXJ5IG5lZWRzIHRvIGJlIGNhcnJpZWQgb3V0IGZyb20gd2l0aGluIHRoZQorCSAqIHNpZ25hbCBoYW5kbGVyLgorCSAqLworCVNfTENIQU5fVU5FWFBFQ1RFRF9SRUxFQVNFLAorCVNfTENIQU5fQUNUSVZBVEVfQUNLLAkJLyogMDguNTggQ2hhbm5lbCBBY3RpdmF0ZSBBQ0sgKi8KKwlTX0xDSEFOX0FDVElWQVRFX05BQ0ssCQkvKiAwOC41OCBDaGFubmVsIEFjdGl2YXRlIE5BQ0sgKi8KKwlTX0xDSEFOX0hBTkRPVkVSX0NPTVBMLAkJLyogMDQuMDggSGFuZG92ZXIgQ29tcGxldGVkICovCisJU19MQ0hBTl9IQU5ET1ZFUl9GQUlMLAkJLyogMDQuMDggSGFuZG92ZXIgRmFpbGVkICovCisJU19MQ0hBTl9IQU5ET1ZFUl9ERVRFQ1QsCS8qIDA4LjU4IEhhbmRvdmVyIERldGVjdCAqLworCVNfTENIQU5fTUVBU19SRVAsCQkvKiAwOC41OCBNZWFzdXJlbWVudCBSZXBvcnQgKi8KK307CisKKy8qIFNTX0NIQUxMT0Mgc2lnbmFscyAqLworZW51bSBzaWduYWxfY2hhbGxvYyB7CisJU19DSEFMTE9DX0FMTE9DX0ZBSUwsCS8qIGFsbG9jYXRpb24gb2YgbGNoYW4gaGFzIGZhaWxlZCAqLworCVNfQ0hBTExPQ19GUkVFRCwJLyogbGNoYW4gaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGZyZWVkICovCit9OworCisvKiBTU19TVUJTQ1Igc2lnbmFscyAqLworZW51bSBzaWduYWxfc3Vic2NyIHsKKwlTX1NVQlNDUl9BVFRBQ0hFRCwKKwlTX1NVQlNDUl9ERVRBQ0hFRCwKKwlTX1NVQlNDUl9JREVOVElUWSwJCS8qIHdlJ3ZlIHJlY2VpdmVkIHNvbWUgaWRlbnRpdHkgaW5mb3JtYXRpb24gKi8KK307CisKKy8qIFNTX1NDQUxMIHNpZ25hbHMgKi8KK2VudW0gc2lnbmFsX3NjYWxsIHsKKwlTX1NDQUxMX1NVQ0NFU1MsCisJU19TQ0FMTF9FWFBJUkVELAorCVNfU0NBTExfREVUQUNIRUQsCit9OworCitlbnVtIHNpZ25hbF9nbG9iYWwgeworCVNfR0xPQkFMX1NIVVRET1dOLAorfTsKKworc3RydWN0IGdzbV9zdWJzY3JpYmVyOworCitzdHJ1Y3QgcGFnaW5nX3NpZ25hbF9kYXRhIHsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCisJLyogTlVMTCBpbiBjYXNlIHRoZSBwYWdpbmcgZGlkbid0IHdvcmsgKi8KKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKK307CisKK3N0cnVjdCBzY2FsbF9zaWduYWxfZGF0YSB7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisJdm9pZCAqZGF0YTsKK307CisKK3N0cnVjdCBpcGFjY19hY2tfc2lnbmFsX2RhdGEgeworCXN0cnVjdCBnc21fYnRzICpidHM7CisJdV9pbnQ4X3QgbXNnX3R5cGU7CQorfTsKKworc3RydWN0IGNoYWxsb2Nfc2lnbmFsX2RhdGEgeworCXN0cnVjdCBnc21fYnRzICpidHM7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisJZW51bSBnc21fY2hhbl90IHR5cGU7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3NpbGVudF9jYWxsLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zaWxlbnRfY2FsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZmM1MTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zaWxlbnRfY2FsbC5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgX1NJTEVOVF9DQUxMX0gKKyNkZWZpbmUgX1NJTEVOVF9DQUxMX0gKKworZXh0ZXJuIGludCBnc21fc2lsZW50X2NhbGxfc3RhcnQoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgdHlwZSk7CitleHRlcm4gaW50IGdzbV9zaWxlbnRfY2FsbF9zdG9wKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKTsKK2V4dGVybiBpbnQgc2lsZW50X2NhbGxfcngoc3RydWN0IG1zZ2IgKm1zZyk7CitleHRlcm4gaW50IHNpbGVudF9jYWxsX3Jlcm91dGUoc3RydWN0IG1zZ2IgKm1zZyk7CisKKyNlbmRpZiAvKiBfU0lMRU5UX0NBTExfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc3ViY2hhbl9kZW11eC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc3ViY2hhbl9kZW11eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZmEwMjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zdWJjaGFuX2RlbXV4LmgKQEAgLTAsMCArMSwxMDIgQEAKKyNpZm5kZWYgX1NVQkNIX0RFTVVYX0gKKyNkZWZpbmUgX1NVQkNIX0RFTVVYX0gKKy8qIEEgRTEgc3ViLWNoYW5uZWwgKGRlKW11bHRpcGxleGVyIHdpdGggVFJBVSBmcmFtZSBzeW5jICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorCisjZGVmaW5lIE5SX1NVQkNICTQKKyNkZWZpbmUgVFJBVV9GUkFNRV9TSVpFCTQwCisjZGVmaW5lIFRSQVVfRlJBTUVfQklUUwkoVFJBVV9GUkFNRV9TSVpFKjgpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERFTVVMVElQTEVYRVIgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGRlbXV4X3N1YmNoIHsKKwl1X2ludDhfdCBvdXRfYml0YnVmW1RSQVVfRlJBTUVfQklUU107CisJdV9pbnQxNl90IG91dF9pZHg7IC8qIG5leHQgYml0IHRvIGJlIHdyaXR0ZW4gaW4gb3V0X2JpdGJ1ZiAqLworCS8qIG51bWJlciBvZiBjb25zZWN1dGl2ZSB6ZXJvcyB0aGF0IHdlIGhhdmUgcmVjZWl2ZWQgKGZvciBzeW5jKSAqLworCXVuc2lnbmVkIGludCBjb25zZWN1dGl2ZV96ZXJvczsKKwkvKiBhcmUgd2UgaW4gVFJBVSBmcmFtZSBzeW5jIG9yIG5vdD8gKi8KKwl1bnNpZ25lZCBpbnQgaW5fc3luYzsKK307CisKK3N0cnVjdCBzdWJjaF9kZW11eCB7CisJLyogYml0bWFzayBvZiBjdXJyZW50bHkgYWN0aXZlIHN1YmNoYW5uZWxzICovCisJdV9pbnQ4X3QgY2hhbl9hY3RpdjsKKwkvKiBvbmUgZGVtdXhfc3ViY2ggc3RydWN0IGZvciBldmVyeSBzdWJjaGFubmVsICovCisJc3RydWN0IGRlbXV4X3N1YmNoIHN1YmNoW05SX1NVQkNIXTsKKwkvKiBjYWxsYmFjayB0byBiZSBjYWxsZWQgb25jZSB3ZSBoYXZlIHJlY2VpdmVkIGEgY29tcGxldGUKKwkgKiBmcmFtZSBvbiBhIGdpdmVuIHN1YmNoYW5uZWwgKi8KKwlpbnQgKCpvdXRfY2IpKHN0cnVjdCBzdWJjaF9kZW11eCAqZG14LCBpbnQgY2gsIHVfaW50OF90ICpkYXRhLCBpbnQgbGVuLAorCQkgICAgICB2b2lkICopOworCS8qIHVzZXItcHJvdmlkZWQgZGF0YSwgdHJhbnNwYXJlbnRseSBwYXNzZWQgdG8gb3V0X2NiKCkgKi8KKwl2b2lkICpkYXRhOworfTsKKworLyogaW5pdGlhbGl6ZSBvbmUgZGVtdWx0aXBsZXhlciBpbnN0YW5jZSAqLworaW50IHN1YmNoX2RlbXV4X2luaXQoc3RydWN0IHN1YmNoX2RlbXV4ICpkbXgpOworCisvKiBmZWVkICdsZW4nIG51bWJlciBvZiBtdXhlZCBieXRlcyBpbnRvIHRoZSBkZW11bHRpcGxleGVyICovCitpbnQgc3ViY2hfZGVtdXhfaW4oc3RydWN0IHN1YmNoX2RlbXV4ICpkbXgsIHVfaW50OF90ICpkYXRhLCBpbnQgbGVuKTsKKworLyogYWN0aXZhdGUgZGVjb2RpbmcvcHJvY2Vzc2luZyBmb3Igb25lIHN1YmNoYW5uZWwgKi8KK2ludCBzdWJjaF9kZW11eF9hY3RpdmF0ZShzdHJ1Y3Qgc3ViY2hfZGVtdXggKmRteCwgaW50IHN1YmNoKTsKKworLyogZGVhY3RpdmF0ZSBkZWNvZGluZy9wcm9jZXNzaW5nIGZvciBvbmUgc3ViY2hhbm5lbCAqLworaW50IHN1YmNoX2RlbXV4X2RlYWN0aXZhdGUoc3RydWN0IHN1YmNoX2RlbXV4ICpkbXgsIGludCBzdWJjaCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE1VTFRJUExFWEVSICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIG9uZSBlbGVtZW50IGluIHRoZSB0eF9xdWV1ZSBvZiBhIG11eGVyIHN1Yi1jaGFubmVsICovCitzdHJ1Y3Qgc3ViY2hfdHhxX2VudHJ5IHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCisJdW5zaWduZWQgaW50IGJpdF9sZW47CS8qIHRvdGFsIG51bWJlciBvZiBiaXRzIGluICdiaXRzJyAqLworCXVuc2lnbmVkIGludCBuZXh0X2JpdDsJLyogbmV4dCBiaXQgdG8gYmUgdHJhbnNtaXR0ZWQgKi8KKworCXVfaW50OF90IGJpdHNbMF07CS8qIG9uZSBiaXQgcGVyIGJ5dGUgKi8KK307CisKK3N0cnVjdCBtdXhfc3ViY2ggeworCXN0cnVjdCBsbGlzdF9oZWFkIHR4X3F1ZXVlOworfTsKKworLyogc3RydWN0dXJlIHJlcHJlc2VudGluZyBvbmUgaW5zdGFuY2Ugb2YgdGhlIHN1YmNoYW5uZWwgbXV4ZXIgKi8KK3N0cnVjdCBzdWJjaF9tdXggeworCXN0cnVjdCBtdXhfc3ViY2ggc3ViY2hbTlJfU1VCQ0hdOworfTsKKworLyogaW5pdGlhbGl6ZSBhIHN1YmNoYW5uZWwgbXV4ZXIgaW5zdGFuY2UgKi8KK2ludCBzdWJjaGFuX211eF9pbml0KHN0cnVjdCBzdWJjaF9tdXggKm14KTsKKworLyogcmVxdWVzdCB0aGUgb3V0cHV0IG9mICdsZW4nIG11bHRpcGxleGVkIGJ5dGVzICovCitpbnQgc3ViY2hhbl9tdXhfb3V0KHN0cnVjdCBzdWJjaF9tdXggKm14LCB1X2ludDhfdCAqZGF0YSwgaW50IGxlbik7CisKKy8qIGVucXVldWUgc29tZSBkYXRhIGludG8gb25lIHN1Yi1jaGFubmVsIG9mIHRoZSBtdXhlciAqLworaW50IHN1YmNoYW5fbXV4X2VucXVldWUoc3RydWN0IHN1YmNoX211eCAqbXgsIGludCBzX25yLCBjb25zdCB1X2ludDhfdCAqZGF0YSwKKwkJCWludCBsZW4pOworCisjZW5kaWYgLyogX1NVQkNIX0RFTVVYX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3N5c3RlbV9pbmZvcm1hdGlvbi5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc3lzdGVtX2luZm9ybWF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgyYTlhYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3N5c3RlbV9pbmZvcm1hdGlvbi5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBfU1lTVEVNX0lORk9fSAorI2RlZmluZSBfU1lTVEVNX0lORk9fSAorCitpbnQgZ3NtX2dlbmVyYXRlX3NpKHVfaW50OF90ICpvdXRwdXQsIHN0cnVjdCBnc21fYnRzICpidHMsIGludCB0eXBlKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90ZWxuZXRfaW50ZXJmYWNlLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90ZWxuZXRfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhjMzZiNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RlbG5ldF9pbnRlcmZhY2UuaApAQCAtMCwwICsxLDQzIEBACisvKiBtaW5pbWFsaXN0aWMgdGVsbmV0L25ldHdvcmsgaW50ZXJmYWNlIGl0IG1pZ2h0IHR1cm4gaW50byBhIHdpcmUgaW50ZXJmYWNlICovCisvKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBURUxORVRfSU5URVJGQUNFX0gKKyNkZWZpbmUgVEVMTkVUX0lOVEVSRkFDRV9ICisKKyNpbmNsdWRlICJnc21fZGF0YS5oIgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKworI2luY2x1ZGUgPHZ0eS92dHkuaD4KKworc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBlbnRyeTsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldHdvcms7CisJc3RydWN0IGJzY19mZCBmZDsKKwlzdHJ1Y3QgdnR5ICp2dHk7CisJc3RydWN0IGxvZ190YXJnZXQgKmRiZzsKK307CisKKwordm9pZCB0ZWxuZXRfaW5pdChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldHdvcmssIGludCBwb3J0KTsKKworaW50IGJzY192dHlfaW5pdChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdHJhbnNhY3Rpb24uaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RyYW5zYWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBhMDA4YgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RyYW5zYWN0aW9uLmgKQEAgLTAsMCArMSw3NiBAQAorI2lmbmRlZiBfVFJBTlNBQ1RfSAorI2RlZmluZSBfVFJBTlNBQ1RfSAorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8xMS5oPgorCisvKiBPbmUgdHJhbnNhY3Rpb24gKi8KK3N0cnVjdCBnc21fdHJhbnMgeworCS8qIEVudHJ5IGluIGxpc3Qgb2YgYWxsIHRyYW5zYWN0aW9ucyAqLworCXN0cnVjdCBsbGlzdF9oZWFkIGVudHJ5OworCisJLyogVGhlIHByb3RvY29sIHdpdGhpbiB3aGljaCB3ZSBsaXZlICovCisJdV9pbnQ4X3QgcHJvdG9jb2w7CisKKwkvKiBUaGUgY3VycmVudCB0cmFuc2FjdGlvbiBJRCAqLworCXVfaW50OF90IHRyYW5zYWN0aW9uX2lkOworCQorCS8qIFRvIHdob20gd2UgYmVsb25nLCB1bmlxdWUgaWRlbnRpZmllciBvZiByZW1vdGUgTU0gZW50aXR5ICovCisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisKKwkvKiBUaGUgYXNzb2NpYXRlZCBjb25uZWN0aW9uIHdlIGFyZSB1c2luZyB0byB0cmFuc21pdCBtZXNzYWdlcyAqLworCXN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uOworCisJLyogcmVmZXJlbmNlIGZyb20gTU5DQyBvciBvdGhlciBhcHBsaWNhdGlvbiAqLworCXVfaW50MzJfdCBjYWxscmVmOworCisJLyogaWYgdHJhZmZpYyBjaGFubmVsIHJlY2VpdmUgd2FzIHJlcXVlc3RlZCAqLworCWludCB0Y2hfcmVjdjsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKworCQkJLyogY3VycmVudCBjYWxsIHN0YXRlICovCisJCQlpbnQgc3RhdGU7CisKKwkJCS8qIGN1cnJlbnQgdGltZXIgYW5kIG1lc3NhZ2UgcXVldWUgKi8KKwkJCWludCBUY3VycmVudDsJCS8qIGN1cnJlbnQgQ0MgdGltZXIgKi8KKwkJCWludCBUMzA4X3NlY29uZDsJLyogdXNlZCB0byBzZW5kIHJlbGVhc2UgYWdhaW4gKi8KKwkJCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCQkJc3RydWN0IGdzbV9tbmNjIG1zZzsJLyogc3RvcmVzIHNldHVwL2Rpc2Nvbm5lY3QvcmVsZWFzZSBtZXNzYWdlICovCisJCX0gY2M7CisJCXN0cnVjdCB7CisJCQl1X2ludDhfdCBsaW5rX2lkOwkvKiBSU0wgTGluayBJRCB0byBiZSB1c2VkIGZvciB0aGlzIHRyYW5zICovCisJCQlpbnQgaXNfbXQ7CS8qIGlzIHRoaXMgYSBNTyAoMCkgb3IgTVQgKDEpIHRyYW5zZmVyICovCisJCQllbnVtIGdzbTQxMV9jcF9zdGF0ZSBjcF9zdGF0ZTsKKwkJCXN0cnVjdCB0aW1lcl9saXN0IGNwX3RpbWVyOworCisJCQllbnVtIGdzbTQxMV9ycF9zdGF0ZSBycF9zdGF0ZTsKKworCQkJc3RydWN0IGdzbV9zbXMgKnNtczsKKwkJfSBzbXM7CisJfTsKK307CisKKworCitzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuc19maW5kX2J5X2lkKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJCSAgIHVfaW50OF90IHByb3RvLCB1X2ludDhfdCB0cmFuc19pZCk7CitzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuc19maW5kX2J5X2NhbGxyZWYoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCXVfaW50MzJfdCBjYWxscmVmKTsKKworc3RydWN0IGdzbV90cmFucyAqdHJhbnNfYWxsb2Moc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQkgICAgICB1X2ludDhfdCBwcm90b2NvbCwgdV9pbnQ4X3QgdHJhbnNfaWQsCisJCQkgICAgICB1X2ludDMyX3QgY2FsbHJlZik7Cit2b2lkIHRyYW5zX2ZyZWUoc3RydWN0IGdzbV90cmFucyAqdHJhbnMpOworCitpbnQgdHJhbnNfYXNzaWduX3RyYW5zX2lkKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJICB1X2ludDhfdCBwcm90b2NvbCwgdV9pbnQ4X3QgdGlfZmxhZyk7CisKKy8qIHVwZGF0ZSBhbGwgdHJhbnNhY3Rpb25zIHRvIHVzZSBhIGRpZmZlcmVudCBMQ0hBTiwgZS5nLgorICogYWZ0ZXIgaGFuZG92ZXIgaGFzIHN1Y2NlZWRlZCAqLworaW50IHRyYW5zX2xjaGFuX2NoYW5nZShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubl9vbGQsCisJCSAgICAgICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubl9uZXcpOworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90cmF1X2ZyYW1lLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90cmF1X2ZyYW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkyM2Q0YQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RyYXVfZnJhbWUuaApAQCAtMCwwICsxLDY1IEBACisjaWZuZGVmIF9UUkFVX0ZSQU1FX0gKKyNkZWZpbmUgX1RSQVVfRlJBTUVfSAorLyogVFJBVSBmcmFtZSBoYW5kbGluZyBhY2NvcmRpbmcgdG8gR1NNIFRTIDA4LjYwICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvKiAyMSBmb3IgRlIvRUZSLCAyNSBmb3IgQU1SLCAxNSBmb3IgT00sIDE1IGZvciBkYXRhLCAxMyBmb3IgRS1kYXRhLCAyMSBpZGxlICovCisjZGVmaW5lIE1BWF9DX0JJVFMJMjUKKy8qIDI2MCBmb3IgRlIvRUZSLCAyNTYgZm9yIEFNUiwgMjY0IGZvciBPTSwgMjg4IGZvciBFLWRhdGEgKi8KKyNkZWZpbmUgTUFYX0RfQklUUwkyODgKKy8qIGZvciBhbGwgc3BlZWNoIGZyYW1lcyAqLworI2RlZmluZSBNQVhfVF9CSVRTCTQKKy8qIGZvciBPTSAqLworI2RlZmluZSBNQVhfU19CSVRTCTYKKy8qIGZvciBFLWRhdGEgKi8KKyNkZWZpbmUgTUFYX01fQklUUwkyCisKK3N0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgeworCXVfaW50OF90IGNfYml0c1tNQVhfQ19CSVRTXTsKKwl1X2ludDhfdCBkX2JpdHNbTUFYX0RfQklUU107CisJdV9pbnQ4X3QgdF9iaXRzW01BWF9UX0JJVFNdOworCXVfaW50OF90IHNfYml0c1tNQVhfU19CSVRTXTsKKwl1X2ludDhfdCBtX2JpdHNbTUFYX01fQklUU107Cit9OworCisjZGVmaW5lIFRSQVVfRlRfRlJfVVAJCTB4MDIJLyogMCAwIDAgMSAwIC0gMy41LjEuMS4xICovCisjZGVmaW5lIFRSQVVfRlRfRlJfRE9XTgkJMHgxYwkvKiAxIDEgMSAwIDAgLSAzLjUuMS4xLjEgKi8KKyNkZWZpbmUgVFJBVV9GVF9FRlIJCTB4MWEJLyogMSAxIDAgMSAwIC0gMy41LjEuMS4xICovCisjZGVmaW5lIFRSQVVfRlRfQU1SCQkweDA2CS8qIDAgMCAxIDEgMCAtIDMuNS4xLjIgKi8KKyNkZWZpbmUgVFJBVV9GVF9PTV9VUAkJMHgwNwkvKiAwIDAgMSAwIDEgLSAzLjUuMiAqLworI2RlZmluZSBUUkFVX0ZUX09NX0RPV04JCTB4MWIJLyogMSAxIDAgMSAxIC0gMy41LjIgKi8KKyNkZWZpbmUgVFJBVV9GVF9EQVRBX1VQCQkweDA4CS8qIDAgMSAwIDAgMCAtIDMuNS4zICovCisjZGVmaW5lIFRSQVVfRlRfREFUQV9ET1dOCTB4MTYJLyogMSAwIDEgMSAwIC0gMy41LjMgKi8KKyNkZWZpbmUgVFJBVV9GVF9EMTQ1X1NZTkMJMHgxNAkvKiAxIDAgMSAwIDAgLSAzLjUuMyAqLworI2RlZmluZSBUUkFVX0ZUX0VEQVRBCQkweDFmCS8qIDEgMSAxIDEgMSAtIDMuNS40ICovCisjZGVmaW5lIFRSQVVfRlRfSURMRV9VUAkJMHgxMAkvKiAxIDAgMCAwIDAgLSAzLjUuNSAqLworI2RlZmluZSBUUkFVX0ZUX0lETEVfRE9XTgkweDBlCS8qIDAgMSAxIDEgMCAtIDMuNS41ICovCisKKworaW50IGRlY29kZV90cmF1X2ZyYW1lKHN0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgKmZyLCBjb25zdCB1X2ludDhfdCAqdHJhdV9iaXRzKTsKK2ludCBlbmNvZGVfdHJhdV9mcmFtZSh1X2ludDhfdCAqdHJhdV9iaXRzLCBjb25zdCBzdHJ1Y3QgZGVjb2RlZF90cmF1X2ZyYW1lICpmcik7CitpbnQgdHJhdV9mcmFtZV91cDJkb3duKHN0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgKmZyKTsKK3VfaW50OF90ICp0cmF1X2lkbGVfZnJhbWUodm9pZCk7CisKKworI2VuZGlmIC8qIF9UUkFVX0ZSQU1FX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RyYXVfbXV4LmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90cmF1X211eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZWI3MDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90cmF1X211eC5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qIFNpbXBsZSBUUkFVIGZyYW1lIHJlZmxlY3RvciB0byByb3V0ZSB2b2ljZSBjYWxscyAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKy8qIFRoZSAiVFJBVSBtdXggbWFwIiBkZWZpbmVzIHdoaWNoIHBhcnRpY3VsYXIgMTZrYml0IHN1Yi1zbG90IChpbiB3aGljaCBFMQorICogdGltZXNsb3Qgb24gd2hpY2ggRTEgaW50ZXJmYWNlKSBzaG91bGQgYmUgZGlyZWN0bHkgbXV4ZWQgdG8gd2hpY2ggb3RoZXIgCisgKiBzdWItc2xvdC4gIEVudHJpZXMgaW4gdGhlIG11eCBtYXAgYXJlIGFsd2F5cyBiaS1kaXJlY3Rpb25hbC4gCisgKgorICogVGhlIGlkZWEgb2YgYWxsIHRoaXMgaXMgdG8gZGlyZWN0bHkgc3dpdGNoIHZvaWNlIGNoYW5uZWxzIGluIHRoZSBCU0MKKyAqIGZyb20gb25lIHBob25lIHRvIGFub3RoZXIuICBXZSBkbyB0aGlzIHJpZ2h0IG5vdyBzaW5jZSB3ZSBkb24ndCBzdXBwb3J0CisgKiBhbnkgZXh0ZXJuYWwgaW50ZXJmYWNlIGZvciB2b2ljZSBjaGFubmVscywgYW5kIGluIHRoZSBmdXR1cmUgYXMgYW4KKyAqIG9wdGltaXphdGlvbiB0byByb3V0aW5nIHRoZW0gZXh0ZXJuYWxseS4KKyAqLworCisvKiBtYXAgYSBUUkFVIG11eCBtYXAgZW50cnkgKi8KK2ludCB0cmF1X211eF9tYXAoY29uc3Qgc3RydWN0IGdzbV9lMV9zdWJzbG90ICpzcmMsCisJCSBjb25zdCBzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKmRzdCk7CitpbnQgdHJhdV9tdXhfbWFwX2xjaGFuKGNvbnN0IHN0cnVjdCBnc21fbGNoYW4gKnNyYywJCisJCQljb25zdCBzdHJ1Y3QgZ3NtX2xjaGFuICpkc3QpOworCisvKiB1bm1hcCBhIFRSQVUgbXV4IG1hcCBlbnRyeSAqLworaW50IHRyYXVfbXV4X3VubWFwKGNvbnN0IHN0cnVjdCBnc21fZTFfc3Vic2xvdCAqc3MsIHVfaW50MzJfdCBjYWxscmVmKTsKKworLyogd2UgZ2V0IGNhbGxlZCBieSBzdWJjaGFuX2RlbXV4ICovCitpbnQgdHJhdV9tdXhfaW5wdXQoc3RydWN0IGdzbV9lMV9zdWJzbG90ICpzcmNfZTFfc3MsCisJCSAgIGNvbnN0IHVfaW50OF90ICp0cmF1X2JpdHMsIGludCBudW1fYml0cyk7CisKKy8qIGFkZCBhIHRyYXUgcmVjZWl2ZXIgKi8KK2ludCB0cmF1X3JlY3ZfbGNoYW4oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50MzJfdCBjYWxscmVmKTsKKworLyogc2VuZCB0cmF1IGZyb20gYXBwbGljYXRpb24gKi8KK2ludCB0cmF1X3NlbmRfZnJhbWUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHN0cnVjdCBnc21fZGF0YV9mcmFtZSAqZnJhbWUpOwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdXNzZC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdXNzZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZWEzMWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy91c3NkLmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfVVNTRF9ICisjZGVmaW5lIF9VU1NEX0gKKworLyogSGFuZGxlciBmdW5jdGlvbiBmb3IgbW9iaWxlLW9yaWdpbmF0ZWQgVVNTRCBtZXNzYWdlcyAqLworCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorCitpbnQgaGFuZGxlX3Jjdl91c3NkKHN0cnVjdCBtc2diICptc2cpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3Z0eS5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdnR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFiMTE0OAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3Z0eS5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgT1BFTkJTQ19WVFlfSAorI2RlZmluZSBPUEVOQlNDX1ZUWV9ICisKK3N0cnVjdCBnc21fbmV0d29yazsKK3N0cnVjdCB2dHk7CisKK3ZvaWQgb3BlbmJzY192dHlfYWRkX2NtZHModm9pZCk7Cit2b2lkIG9wZW5ic2NfdnR5X3ByaW50X3N0YXRpc3RpY3Moc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX25ldHdvcmsgKik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL3NjY3AvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL2luY2x1ZGUvc2NjcC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzhhNTE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL3NjY3AvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyIEBACitzY2NwX0hFQURFUlMgPSBzY2NwX3R5cGVzLmggc2NjcC5oCitzY2NwZGlyID0gJChpbmNsdWRlZGlyKS9zY2NwCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvc2NjcC9zY2NwLmggYi9vcGVuYnNjL2luY2x1ZGUvc2NjcC9zY2NwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA0YTJhYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9zY2NwL3NjY3AuaApAQCAtMCwwICsxLDE3MiBAQAorLyoKKyAqIFNDQ1AgbWFuYWdlbWVudCBjb2RlCisgKgorICogKEMpIDIwMDksIDIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIFNDQ1BfSAorI2RlZmluZSBTQ0NQX0gKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAic2NjcF90eXBlcy5oIgorCitzdHJ1Y3QgbXNnYjsKK3N0cnVjdCBzY2NwX3N5c3RlbTsKKworZW51bSB7CisJU0NDUF9DT05ORUNUSU9OX1NUQVRFX05PTkUsCisJU0NDUF9DT05ORUNUSU9OX1NUQVRFX1JFUVVFU1QsCisJU0NDUF9DT05ORUNUSU9OX1NUQVRFX0NPTkZJUk0sCisJU0NDUF9DT05ORUNUSU9OX1NUQVRFX0VTVEFCTElTSEVELAorCVNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUxFQVNFLAorCVNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUxFQVNFX0NPTVBMRVRFLAorCVNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUZVU0VELAorCVNDQ1BfQ09OTkVDVElPTl9TVEFURV9TRVRVUF9FUlJPUiwKK307CisKK3N0cnVjdCBzb2NrYWRkcl9zY2NwIHsKKwlzYV9mYW1pbHlfdAlzY2NwX2ZhbWlseTsJCS8qIEFGX1NDQ1AgaW4gdGhlIGZ1dHVyZT8/PyAqLworCXVfaW50OF90CXNjY3Bfc3NuOwkJLyogc3Vic3N5c3RlbSBudW1iZXIgZm9yIHJvdXRpbmcgKi8KKworCS8qIFRPRE8gZmlsbCBpbiBhZGRyZXNzIGluZGljYXRvci4uLiBpZiB0aGF0IGlzIGV2ZXIgbmVlZGVkICovCisKKwkvKiBub3Qgc3VyZSBhYm91dCB0aGVzZSAqLworCS8qIHVfaW50OF90ICAgIHNjY3BfY2xhc3M7ICovCit9OworCisvKgorICogcGFyc2VkIHN0cnVjdHVyZSBvZiBhbiBhZGRyZXNzCisgKi8KK3N0cnVjdCBzY2NwX2FkZHJlc3MgeworCXN0cnVjdCBzY2NwX2NhbGxlZF9wYXJ0eV9hZGRyZXNzICAgIGFkZHJlc3M7CisJdV9pbnQ4X3QJCQkgICAgc3NuOworCXVfaW50OF90CQkJICAgIHBvaVsyXTsKK307CisKK3N0cnVjdCBzY2NwX29wdGlvbmFsX2RhdGEgeworCXVfaW50OF90CQkJICAgIGRhdGFfbGVuOworCXVfaW50OF90CQkJICAgIGRhdGFfc3RhcnQ7Cit9OworCitzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uIHsKKwkvKiBwdWJsaWMgKi8KKwl2b2lkICpkYXRhX2N0eDsKKwl2b2lkICgqZGF0YV9jYikoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubiwgc3RydWN0IG1zZ2IgKm1zZywgdW5zaWduZWQgaW50IGxlbik7CisKKwl2b2lkICpzdGF0ZV9jdHg7CisJdm9pZCAoKnN0YXRlX2NiKShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICosIGludCBvbGRfc3RhdGUpOworCisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSBzb3VyY2VfbG9jYWxfcmVmZXJlbmNlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCisJaW50IGNvbm5lY3Rpb25fc3RhdGU7CisKKwkvKiBwcml2YXRlICovCisJLyogbGlzdCBvZiBhY3RpdmUgY29ubmVjdGlvbnMgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBzY2NwX3N5c3RlbSAqc3lzdGVtOworCWludCBpbmNvbWluZzsKK307CisKKy8qKgorICogc3lzdGVtIGZ1bmN0aW9uYWxpdHkgdG8gaW1wbGVtZW50IG9uIHRvcCBvZiBhbnkgb3RoZXIgdHJhbnNwb3J0IGxheWVyOgorICogICBjYWxsIHNjY3Bfc3lzdGVtX2luY29taW5nIGZvciBpbmNvbWluZyBkYXRhIChmcm9tIHRoZSBuZXR3b3JrKQorICogICBzY2NwIHdpbGwgY2FsbCBvdXRnb2luZyB3aGVuZXZlciBvdXRnb2luZyBkYXRhIGV4aXN0cworICovCitpbnQgc2NjcF9zeXN0ZW1faW5pdCh2b2lkICgqb3V0Z29pbmcpKHN0cnVjdCBtc2diICpkYXRhLCB2b2lkICpjdHgpLCB2b2lkICpjb250ZXh0KTsKK2ludCBzY2NwX3N5c3RlbV9pbmNvbWluZyhzdHJ1Y3QgbXNnYiAqZGF0YSk7CisKKy8qKgorICogU2VuZCBkYXRhIG9uIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24KKyAqLworaW50IHNjY3BfY29ubmVjdGlvbl93cml0ZShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgbXNnYiAqZGF0YSk7CitpbnQgc2NjcF9jb25uZWN0aW9uX3NlbmRfaXQoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CitpbnQgc2NjcF9jb25uZWN0aW9uX2Nsb3NlKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIGludCBjYXVzZSk7CitpbnQgc2NjcF9jb25uZWN0aW9uX2ZyZWUoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CisKKy8qKgorICogaW50ZXJuYWwuLiAKKyAqLworaW50IHNjY3BfY29ubmVjdGlvbl9mb3JjZV9mcmVlKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm4pOworCisvKioKKyAqIENyZWF0ZSBhIG5ldyBzb2NrZXQuIFNldCB5b3VyIGNhbGxiYWNrcyBhbmQgdGhlbiBjYWxsIGJpbmQgdG8gb3BlbgorICogdGhlIGNvbm5lY3Rpb24uCisgKi8KK3N0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKnNjY3BfY29ubmVjdGlvbl9zb2NrZXQodm9pZCk7CisKKy8qKgorICogT3BlbiB0aGUgY29ubmVjdGlvbiBhbmQgc2VuZCBhZGRpdGlvbmFsIGRhdGEKKyAqLworaW50IHNjY3BfY29ubmVjdGlvbl9jb25uZWN0KHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm4sCisJCQkgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3AgKnNjY3BfY2FsbGVkLAorCQkJICAgIHN0cnVjdCBtc2diICpkYXRhKTsKKworLyoqCisgKiBtb3N0bHkgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS4gU2V0IHRoZSBhY2NlcHQgY2FsbGJhY2suCisgKiBUT0RPOiBhZGQgdHJ1ZSByb3V0aW5nIGluZm9ybWF0aW9uLi4uIGluIGFuYWxvZ3kgdG8gc29ja2V0LCBiaW5kLCBhY2NlcHQKKyAqLworaW50IHNjY3BfY29ubmVjdGlvbl9zZXRfaW5jb21pbmcoY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3AgKnNvY2ssCisJCQkJIGludCAoKmFjY2VwdF9jYikoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgdm9pZCAqZGF0YSksCisJCQkJIHZvaWQgKnVzZXJfZGF0YSk7CisKKy8qKgorICogU2VuZCBkYXRhIGluIHRlcm1zIG9mIHVuaXQgZGF0YS4gQSBmaXhlZCBhZGRyZXNzIGluZGljYXRvciB3aWxsIGJlIHVzZWQuCisgKi8KK2ludCBzY2NwX3dyaXRlKHN0cnVjdCBtc2diICpkYXRhLAorCSAgICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCAqc29ja19zZW5kZXIsCisJICAgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwICpzb2NrX3RhcmdldCwgaW50IGNsYXNzKTsKK2ludCBzY2NwX3NldF9yZWFkKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwICpzb2NrLAorCQkgIGludCAoKnJlYWRfY2IpKHN0cnVjdCBtc2diICptc2diLCB1bnNpZ25lZCBpbnQsIHZvaWQgKnVzZXJfZGF0YSksCisJCSAgdm9pZCAqdXNlcl9kYXRhKTsKKworLyogZ2VuZXJpYyBzb2NrIGFkZHJlc3NlcyAqLworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwIHNjY3Bfc3NuX2Jzc2FwOworCisvKiBoZWxwZXJzICovCit1X2ludDMyX3Qgc2NjcF9zcmNfcmVmX3RvX2ludChzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlICpyZWYpOworc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSBzY2NwX3NyY19yZWZfZnJvbV9pbnQodV9pbnQzMl90KTsKKworLyoqCisgKiBCZWxvdyB0aGlzIGFyZSBoZWxwZXIgZnVuY3Rpb25zIGFuZCBzdHJ1Y3RzIGZvciBwYXJzaW5nIFNDQ1AgbWVzc2FnZXMKKyAqLworc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0IHsKKwlzdHJ1Y3Qgc2NjcF9hZGRyZXNzIGNhbGxlZDsKKwlzdHJ1Y3Qgc2NjcF9hZGRyZXNzIGNhbGxpbmc7CisKKwkvKiBwb2ludCB0byB0aGUgbXNnIHBhY2tldCAqLworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgKnNvdXJjZV9sb2NhbF9yZWZlcmVuY2U7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSAqZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCisJLyogZGF0YSBwb2ludGVyICovCisJaW50IGRhdGFfbGVuOworfTsKKworLyoKKyAqIGhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBuYXQgY29kZQorICovCitpbnQgc2NjcF9kZXRlcm1pbmVfbXNnX3R5cGUoc3RydWN0IG1zZ2IgKm1zZyk7CitpbnQgc2NjcF9wYXJzZV9oZWFkZXIoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0ICpyZXN1bHQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9zY2NwL3NjY3BfdHlwZXMuaCBiL29wZW5ic2MvaW5jbHVkZS9zY2NwL3NjY3BfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmJkNzBmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL3NjY3Avc2NjcF90eXBlcy5oCkBAIC0wLDAgKzEsNDIwIEBACisvKgorICogSVRVIFEuNzEzIGRlZmluZWQgdHlwZXMgZm9yIFNDQ1AKKyAqCisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpZm5kZWYgU0NDUF9UWVBFU19ICisjZGVmaW5lIFNDQ1BfVFlQRVNfSAorCisjaW5jbHVkZSA8ZW5kaWFuLmg+CisKKy8qIFRhYmxlIDEvUS43MTMgLSBTQ0NQIG1lc3NhZ2UgdHlwZXMgKi8KK2VudW0gc2NjcF9tZXNzYWdlX3R5cGVzIHsKKwlTQ0NQX01TR19UWVBFX0NSCT0gMSwKKwlTQ0NQX01TR19UWVBFX0NDCT0gMiwKKwlTQ0NQX01TR19UWVBFX0NSRUYJPSAzLAorCVNDQ1BfTVNHX1RZUEVfUkxTRAk9IDQsCisJU0NDUF9NU0dfVFlQRV9STEMJPSA1LAorCVNDQ1BfTVNHX1RZUEVfRFQxCT0gNiwKKwlTQ0NQX01TR19UWVBFX0RUMgk9IDcsCisJU0NDUF9NU0dfVFlQRV9BSwk9IDgsCisJU0NDUF9NU0dfVFlQRV9VRFQJPSA5LAorCVNDQ1BfTVNHX1RZUEVfVURUUwk9IDEwLAorCVNDQ1BfTVNHX1RZUEVfRUQJPSAxMSwKKwlTQ0NQX01TR19UWVBFX0VBCT0gMTIsCisJU0NDUF9NU0dfVFlQRV9SU1IJPSAxMywKKwlTQ0NQX01TR19UWVBFX1JTQwk9IDE0LAorCVNDQ1BfTVNHX1RZUEVfRVJSCT0gMTUsCisJU0NDUF9NU0dfVFlQRV9JVAk9IDE2LAorCVNDQ1BfTVNHX1RZUEVfWFVEVAk9IDE3LAorCVNDQ1BfTVNHX1RZUEVfWFVEVFMJPSAxOCwKKwlTQ0NQX01TR19UWVBFX0xVRFQJPSAxOSwKKwlTQ0NQX01TR19UWVBFX0xVRFRTCT0gMjAKK307CisKKy8qIFRhYmxlIDIvUS43MTMgLSBTQ0NQIHBhcmFtZXRlciBuYW1lIGNvZGVzICovCitlbnVtIHNjY3BfcGFyYW1ldGVyX25hbWVfY29kZXMgeworCVNDQ1BfUE5DX0VORF9PRl9PUFRJT05BTAkJPSAwLAorCVNDQ1BfUE5DX0RFU1RJTkFUSU9OX0xPQ0FMX1JFRkVSRU5DRQk9IDEsCisJU0NDUF9QTkNfU09VUkNFX0xPQ0FMX1JFRkVSRU5DRQkJPSAyLAorCVNDQ1BfUE5DX0NBTExFRF9QQVJUWV9BRERSRVNTCQk9IDMsCisJU0NDUF9QTkNfQ0FMTElOR19QQVJUWV9BRERSRVNTCQk9IDQsCisJU0NDUF9QTkNfUFJPVE9DT0xfQ0xBU1MJCQk9IDUsCisJU0NDUF9QTkNfU0VHTUVOVElORwkJCT0gNiwKKwlTQ0NQX1BOQ19SRUNFSVZFX1NFUV9OVU1CRVIJCT0gNywKKwlTQ0NQX1BOQ19TRVFVRU5DSU5HCQkJPSA4LAorCVNDQ1BfUE5DX0NSRURJVAkJCQk9IDksCisJU0NDUF9QTkNfUkVMRUFTRV9DQVVTRQkJCT0gMTAsCisJU0NDUF9QTkNfUkVUVVJOX0NBVVNFCQkJPSAxMSwKKwlTQ0NQX1BOQ19SRVNFVF9DQVVTRQkJCT0gMTIsCisJU0NDUF9QTkNfRVJST1JfQ0FVU0UJCQk9IDEzLAorCVNDQ1BfUE5DX1JFRlVTQUxfQ0FVU0UJCQk9IDE0LAorCVNDQ1BfUE5DX0RBVEEJCQkJPSAxNSwKKwlTQ0NQX1BOQ19TRUdNRU5UQVRJT04JCQk9IDE2LAorCVNDQ1BfUE5DX0hPUF9DT1VOVEVSCQkJPSAxNywKKwlTQ0NQX1BOQ19JTVBPUlRBTkNFCQkJPSAxOCwKKwlTQ0NQX1BOQ19MT05HX0RBVEEJCQk9IDE5LAorfTsKKworLyogRmlndXJlIDMvUS43MTMgQ2FsbGVkL2NhbGxpbmcgcGFydHkgYWRkcmVzcyAqLworZW51bSB7CisJU0NDUF9USVRMRV9JTkRfTk9ORQkJCT0gMCwKKwlTQ0NQX1RJVExFX0lORF9OQVRVUkVfT05MWQkJPSAxLAorCVNDQ1BfVElUTEVfSU5EX1RSQU5TTEFUSU9OX09OTFkJCT0gMiwKKwlTQ0NQX1RJVExFX0lORF9UUkFOU19OVU1fRU5DCQk9IDMsCisJU0NDUF9USVRMRV9JTkRfVFJBTlNfTlVNX0VOQ19OQVRVUkUJPSA0LAorfTsKKworZW51bSB7CisJU0NDUF9DQUxMX1JPVVRFX09OX1NTTgkJCT0gMSwKKwlTQ0NQX0NBTExfUk9VVEVfT05fR1QJCQk9IDAsCit9OworCitzdHJ1Y3Qgc2NjcF9jYWxsZWRfcGFydHlfYWRkcmVzcyB7CisjaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorCXVfaW50OF90CXBvaW50X2NvZGVfaW5kaWNhdG9yIDogMSwKKwkJCXNzbl9pbmRpY2F0b3IJICAgICA6IDEsCisJCQlnbG9iYWxfdGl0bGVfaW5kaWNhdG9yIDogNCwKKwkJCXJvdXRpbmdfaW5kaWNhdG9yICAgIDogMSwKKwkJCXJlc2VydmVkCSAgICAgOiAxOworI2VsaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorCXVfaW50OF90CXJlc2VydmVkCSAgICAgOiAxLAorCQkJcm91dGluZ19pbmRpY2F0b3IgICAgOiAxLAorCQkJZ2xvYmFsX3RpdGxlX2luZGljYXRvciA6IDQsCisJCQlzc25faW5kaWNhdG9yCSAgICAgOiAxLAorCQkJcG9pbnRfY29kZV9pbmRpY2F0b3IgOiAxOworI2VuZGlmCisJdV9pbnQ4X3QJZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIGluZGljYXRvciBpbmRpY2F0ZXMgcHJlc2VuY2UgaW4gdGhlIGFib3ZlIG9yZGVyICovCisKKy8qIEZpZ3VyZSA2L1EuNzEzICovCitzdHJ1Y3Qgc2NjcF9zaWduYWxsaW5nX3BvaW50X2NvZGUgeworCXVfaW50OF90CWxzYjsKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisJdV9pbnQ4X3QJbXNiIDogNiwKKwkJCXJlc2VydmVkIDogMjsKKyNlbGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKwl1X2ludDhfdAlyZXNlcnZlZCA6IDIsCisJCQltc2IgOiA2OworI2VuZGlmCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBTU04gPT0gc3Vic3lzdGVtIG51bWJlciAqLworZW51bSBzY2NwX3N1YnN5c3RlbV9udW1iZXIgeworCVNDQ1BfU1NOX05PVF9LTk9XTl9PUl9VU0VECSAgICA9IDAsCisJU0NDUF9TU05fTUFOQUdFTUVOVAkJICAgID0gMSwKKwlTQ0NQX1NTTl9SRVNFUlZFRF9JVFUJCSAgICA9IDIsCisJU0NDUF9TU05fSVNETl9VU0VSX1BBUlQJCSAgICA9IDMsCisJU0NDUF9TU05fT01BUAkJCSAgICA9IDQsIC8qIG9wZXJhdGlvbiwgbWFpbnQgYW5kIGFkbWluaXN0cmF0aW9uIHBhcnQgKi8KKwlTQ0NQX1NTTl9NQVAJCQkgICAgPSA1LCAvKiBtb2JpbGUgYXBwbGljYXRpb24gcGFydCAqLworCVNDQ1BfU1NOX0hMUgkJCSAgICA9IDYsCisJU0NDUF9TU05fVkxSCQkJICAgID0gNywKKwlTQ0NQX1NTTl9NU0MJCQkgICAgPSA4LAorCVNDQ1BfU1NOX0VJQwkJCSAgICA9IDksIC8qIGVxdWlwZW50IGlkZW50aWZpZXIgY2VudHJlICovCisJU0NDUF9TU05fQVVDCQkJICAgID0gMTAsIC8qIGF1dGhlbnRpY2F0aW9uIGNlbnRyZSAqLworCVNDQ1BfU1NOX0lTRE5fU1VQUExfU0VSVklDRVMJICAgID0gMTEsCisJU0NDUF9TU05fUkVTRVJWRURfSU5UTAkJICAgID0gMTIsCisJU0NDUF9TU05fSVNETl9FREdFX1RPX0VER0UJICAgID0gMTMsCisJU0NDUF9TU05fVENfVEVTVF9SRVNQT05ERVIJICAgID0gMTQsCisKKwkvKiBGcm9tIEdTTSAwMy4wMyA4LjIgKi8KKwlTQ0NQX1NTTl9CU1NBUAkJCSAgICA9IDI1NCwKKwlTQ0NQX1NTTl9CU1NPTQkJCSAgICA9IDI1MywKK307CisKKy8qIFEuNzEzLCAzLjQuMi4zICovCitlbnVtIHsKKwlTQ0NQX05BSV9VTktOT1dOCQkgICAgPSAwLAorCVNDQ1BfTkFJX1NVQlNDUklCRVJfTlVNQkVSCSAgICA9IDEsCisJU0NDUF9OQUlfUkVTRVJWRURfTkFUSU9OQUwJICAgID0gMiwKKwlTQ0NQX05BSV9OQVRJT05BTF9TSUdOSUZJQ0FOVAkgICAgPSAzLAorCVNDQ1BfTkFJX0lOVEVSTkFUSU9OQUwJCSAgICA9IDQsCit9OworCitzdHJ1Y3Qgc2NjcF9nbG9iYWxfdGl0bGUgeworI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKwl1X2ludDhfdAluYXR1cmVfb2ZfYWRkcl9pbmQgOiA3LAorCQkJb2RkX2V2ZW4gOiAxOworI2VsaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorCXVfaW50OF90CW9kZF9ldmVuIDogMSwKKwkJCW5hdHVyZV9vZl9hZGRyX2luZCA6IDc7CisjZW5kaWYKKwl1X2ludDhfdAlkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogUS43MTMsIDMuMyAqLworc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSB7CisJdV9pbnQ4X3QgICAgb2N0ZXQxOworCXVfaW50OF90ICAgIG9jdGV0MjsKKwl1X2ludDhfdCAgICBvY3RldDM7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBRLjcxNCwgMy42ICovCitlbnVtIHNjY3BfcHJvdG9jb2xfY2xhc3MgeworCVNDQ1BfUFJPVE9DT0xfQ0xBU1NfMAkJICAgID0gMCwKKwlTQ0NQX1BST1RPQ09MX0NMQVNTXzEJCSAgICA9IDEsCisJU0NDUF9QUk9UT0NPTF9DTEFTU18yCQkgICAgPSAyLAorCVNDQ1BfUFJPVE9DT0xfQ0xBU1NfMwkJICAgID0gMywKK307CisKKy8qIGJpdHMgNS04IHdoZW4gY2xhc3MwLCBjbGFzczEgaXMgdXNlZCAqLworZW51bSBzY2NwX3Byb3RvY29sX29wdGlvbnMgeworCVNDQ1BfUFJPVE9DT0xfTk9fU1BFQ0lBTAkgICAgPSAwLAorCVNDQ1BfUFJPVE9DT0xfUkVUVVJOX01FU1NBR0UJICAgID0gOCwKK307CisKK2VudW0gc2NjcF9yZWxlYXNlX2NhdXNlIHsKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfRU5EX1VTRVJfT1JJR0lOQVRFRAkgICAgPSAwLAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9FTkRfVVNFUl9DT05HRVNUSU9OCSAgICA9IDEsCisJU0NDUF9SRUxFQVNFX0NBVVNFX0VORF9VU0VSX0ZBSUxVUkUJICAgID0gMiwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfU0NDUF9VU0VSX09SSUdJTkFURUQJICAgID0gMywKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfUkVNT1RFX1BST0NFRFVSRV9FUlJPUiAgID0gNCwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfSU5DT05TSVNURU5UX0NPTk5fREFUQSAgID0gNSwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfQUNDRVNTX0ZBSUxVUkUJICAgID0gNiwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfQUNDRVNTX0NPTkdFU1RJT04JICAgID0gNywKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfU1VCU1lTVEVNX0ZBSUxVUkUJICAgID0gOCwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfU1VCU1lTVEVNX0NPTkdFU1RJT04JICAgID0gOSwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfTVRQX0ZBSUxVUkUJCSAgICA9IDEwLAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9ORVRXT1JLX0NPTkdFU1RJT04JICAgID0gMTEsCisJU0NDUF9SRUxFQVNFX0NBVVNFX0VYUElSQVRJT05fUkVTRVQJICAgID0gMTIsCisJU0NDUF9SRUxFQVNFX0NBVVNFX0VYUElSQVRJT05fSU5BQ1RJVkUJICAgID0gMTMsCisJU0NDUF9SRUxFQVNFX0NBVVNFX1JFU0VSVkVECQkgICAgPSAxNCwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfVU5RVUFMSUZJRUQJCSAgICA9IDE1LAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9TQ0NQX0ZBSUxVUkUJCSAgICA9IDE2LAorfTsKKworZW51bSBzY2NwX3JldHVybl9jYXVzZSB7CisJU0NDUF9SRVRVUk5fQ0FVU0VfTk9fVFJBTlNMQVRJT05fTkFUVVJFCSAgICA9IDAsCisJU0NDUF9SRVRVUk5fQ0FVU0VfTk9fVFJBTlNMQVRJT04JICAgID0gMSwKKwlTQ0NQX1JFVFVSTl9DQVVTRV9TVUJTWVNURU1fQ09OR0VTVElPTgkgICAgPSAyLAorCVNDQ1BfUkVUVVJOX0NBVVNFX1NVQlNZU1RFTV9GQUlMVVJFCSAgICA9IDMsCisJU0NDUF9SRVRVUk5fQ0FVU0VfVU5FUVVJUFBFRF9VU0VSCSAgICA9IDQsCisJU0NDUF9SRVRVUk5fQ0FVU0VfTVRQX0ZBSUxVUkUJCSAgICA9IDUsCisJU0NDUF9SRVRVUk5fQ0FVU0VfTkVUV09SS19DT05HRVNUSU9OCSAgICA9IDYsCisJU0NDUF9SRVRVUk5fQ0FVU0VfVU5RVUFMSUZJRUQJCSAgICA9IDcsCisJU0NDUF9SRVRVUk5fQ0FVU0VfRVJST1JfSU5fTVNHX1RSQU5TUE9SVCAgICA9IDgsCisJU0NDUF9SRVRVUk5fQ0FVU0VfRVJST1JfSU5fTE9DQUxfUFJPQ0VTU0lORyA9IDksCisJU0NDUF9SRVRVUk5fQ0FVU0VfREVTVF9DQU5OT1RfUEVSRk9STV9SRUFTU0VNQkxZID0gMTAsCisJU0NDUF9SRVRVUk5fQ0FVU0VfU0NDUF9GQUlMVVJFCQkgICAgPSAxMSwKKwlTQ0NQX1JFVFVSTl9DQVVTRV9IT1BfQ09VTlRFUl9WSU9MQVRJT04JICAgID0gMTIsCisJU0NDUF9SRVRVUk5fQ0FVU0VfU0VHTUVOVEFUSU9OX05PVF9TVVBQT1JURUQ9IDEzLAorCVNDQ1BfUkVUVVJOX0NBVVNFX1NFR01FTlRBVElPTl9GQU9MVVJFCSAgICA9IDE0Cit9OworCitlbnVtIHNjY3BfcmVzZXRfY2F1c2UgeworCVNDQ1BfUkVTRVRfQ0FVU0VfRU5EX1VTRVJfT1JJR0lOQVRFRAkgICAgPSAwLAorCVNDQ1BfUkVTRVRfQ0FVU0VfU0NDUF9VU0VSX09SSUdJTkFURUQJICAgID0gMSwKKwlTQ0NQX1JFU0VUX0NBVVNFX01TR19PVVRfT0ZfT1JERVJfUFMJICAgID0gMiwKKwlTQ0NQX1JFU0VUX0NBVVNFX01TR19PVVRfT0ZfT1JERVJfUFIJICAgID0gMywKKwlTQ0NQX1JFU0VUX0NBVVNFX1JQQ19PVVRfT0ZfV0lORE9XCSAgICA9IDQsCisJU0NDUF9SRVNFVF9DQVVTRV9SUENfSU5DT1JSRUNUX1BTCSAgICA9IDUsCisJU0NDUF9SRVNFVF9DQVVTRV9SUENfR0VORVJBTAkJICAgID0gNiwKKwlTQ0NQX1JFU0VUX0NBVVNFX1JFTU9URV9FTkRfVVNFUl9PUEVSQVRJT05BTD0gNywKKwlTQ0NQX1JFU0VUX0NBVVNFX05FVFdPUktfT1BFUkFUSU9OQUwJICAgID0gOCwKKwlTQ0NQX1JFU0VUX0NBVVNFX0FDQ0VTU19PUEVSQVRJT05BTAkgICAgPSA5LAorCVNDQ1BfUkVTRVRfQ0FVU0VfTkVUV09SS19DT05HRVNUSU9OCSAgICA9IDEwLAorCVNDQ1BfUkVTRVRfQ0FVU0VfUkVTRVJWRUQJCSAgICA9IDExLAorfTsKKworZW51bSBzY2NwX2Vycm9yX2NhdXNlIHsKKwlTQ0NQX0VSUk9SX0xSTl9NSVNNQVRDSF9VTkFTU0lHTkVECSAgICA9IDAsIC8qIGxvY2FsIHJlZmVyZW5jZSBudW1iZXIgKi8KKwlTQ0NQX0VSUk9SX0xSTl9NSVNNQVRDSF9JTkNPTlNJU1RFTlQJICAgID0gMSwKKwlTQ0NQX0VSUk9SX1BPSU5UX0NPREVfTUlTTUFUQ0gJCSAgICA9IDIsCisJU0NDUF9FUlJPUl9TRVJWSUNFX0NMQVNTX01JU01BVENICSAgICA9IDMsCisJU0NDUF9FUlJPUl9VTlFVQUxJRklFRAkJCSAgICA9IDQsCit9OworCitlbnVtIHNjY3BfcmVmdXNhbF9jYXVzZSB7CisJU0NDUF9SRUZVU0FMX0VORF9VU0VSX09SSUdJTkFURUQJICAgID0gMCwKKwlTQ0NQX1JFRlVTQUxfRU5EX1VTRVJfQ09OR0VTVElPTgkgICAgPSAxLAorCVNDQ1BfUkVGVVNBTF9FTkRfVVNFUl9GQUlMVVJFCQkgICAgPSAyLAorCVNDQ1BfUkVGVVNBTF9TQ0NQX1VTRVJfT1JJR0lOQVRFRAkgICAgPSAzLAorCVNDQ1BfUkVGVVNBTF9ERVNUSU5BVElPTl9BRERSRVNTX1VLTk9XTgkgICAgPSA0LAorCVNDQ1BfUkVGVVNBTF9ERVNUSU5BVElPTl9JTkFDQ0VTU0lCTEUJICAgID0gNSwKKwlTQ0NQX1JFRlVTQUxfTkVUX1FPU19OT05fVFJBTlNJRU5UCSAgICA9IDYsCisJU0NDUF9SRUZVU0FMX05FVF9RT1NfVFJBTlNJRU5UCQkgICAgPSA3LAorCVNDQ1BfUkVGVVNBTF9BQ0NFU1NfRkFJTFVSRQkJICAgID0gOCwKKwlTQ0NQX1JFRlVTQUxfQUNDRVNTX0NPTkdFU1RJT04JCSAgICA9IDksCisJU0NDUF9SRUZVU0FMX1NVQlNZU1RFTV9GQUlMVVJFCQkgICAgPSAxMCwKKwlTQ0NQX1JFRlVTQUxfU1VCU1lURU1fQ09OR0VTVElPTgkgICAgPSAxMSwKKwlTQ0NQX1JFRlVTQUxfRVhQSVJBVElPTgkJCSAgICA9IDEyLAorCVNDQ1BfUkVGVVNBTF9JTkNPTVBBVElCTEVfVVNFUl9EQVRBCSAgICA9IDEzLAorCVNDQ1BfUkVGVVNBTF9SRVNFUlZFRAkJCSAgICA9IDE0LAorCVNDQ1BfUkVGVVNBTF9VTlFVQUxJRklFRAkJICAgID0gMTUsCisJU0NDUF9SRUZVU0FMX0hPUF9DT1VOVEVSX1ZJT0xBVElPTgkgICAgPSAxNiwKKwlTQ0NQX1JFRlVTQUxfU0NDUF9GQUlMVVJFCQkgICAgPSAxNywKKwlTQ0NQX1JFRlVTQUxfVU5FUVVJUFBFRF9VU0VSCQkgICAgPSAxOCwKK307CisKKy8qCisgKiBtZXNzYWdlcy4uLiBhcyBvZiBRLjcxMyBDaGFwdGVyIDQKKyAqLworc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZXF1ZXN0IHsKKwkvKiBtYW5kYW50b3J5ICovCisJdV9pbnQ4X3QJCQl0eXBlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UJc291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKwl1X2ludDhfdAkJCXByb3RvX2NsYXNzOworCisKKwkvKiB2YXJpYWJsZSAqLworCXVfaW50OF90CQkJdmFyaWFibGVfY2FsbGVkOworI2lmIFZBUklBQkxFCisJY2FsbGVkX3BhcnR5X2FkZHJlc3MKKyNlbmRpZgorCisJLyogb3B0aW9uYWwgKi8KKwl1X2ludDhfdAkJCW9wdGlvbmFsX3N0YXJ0OworCisjaWYgT1BUSU9OQUwKKwljcmVkaXQgMworCWNhbGxpbmdwYXJ0eSB2YXIgNC1uCisJZGF0YSAgICAgICAgICAgIDMtMTMwCisJaG9wX2NvdW50ZXIgICAgIDMKKwlpbXBvcnRhbmNlICAgICAgMworCWVuZF9vZl9vcHRpb25hbCAxCisjZW5kaWYKKworCXVfaW50OF90CQkJZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fY29uZmlybSB7CisJLyogbWFuZGFudG9yeSAqLworCXVfaW50OF90CQkJdHlwZTsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlCWRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlCXNvdXJjZV9sb2NhbF9yZWZlcmVuY2U7CisJdV9pbnQ4X3QJCQlwcm90b19jbGFzczsKKworCS8qIG9wdGlvbmFsICovCisJdV9pbnQ4X3QJCQlvcHRpb25hbF9zdGFydDsKKworCS8qIG9wdGlvbmFsICovCisjaWYgT1BUSU9OQUwKKwljcmVkaXQgMworCWNhbGxlZCBwYXJ0eSA0CisJZGF0YSAgICAgICAgICAgIDMtMTMwCisJaW1wb3J0YW5jZSAgICAgIDMKKwllbmRfb2Zfb3B0aW9uYWwgMQorI2VuZGlmCisKKwl1X2ludDhfdAkJCWRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlZnVzZWQgeworCS8qIG1hbmRhbnRvcnkgKi8KKwl1X2ludDhfdAkJCXR5cGU7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZQlkZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisJdV9pbnQ4X3QJCQljYXVzZTsKKworCS8qIG9wdGlvbmFsICovCisJdV9pbnQ4X3QJCQlvcHRpb25hbF9zdGFydDsKKworCS8qIG9wdGlvbmFsICovCisjaWYgT1BUSU9OQUwKKwljYWxsZWQgcGFydHkgNAorCWRhdGEgICAgICAgICAgICAzLTEzMAorCWltcG9ydGFuY2UgICAgICAzCisJZW5kX29mX29wdGlvbmFsIDEKKyNlbmRpZgorCisJdV9pbnQ4X3QJCQlkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWxlYXNlZCB7CisJLyogbWFuZGFudG9yeSAqLworCXVfaW50OF90CQkJdHlwZTsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlCWRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlCXNvdXJjZV9sb2NhbF9yZWZlcmVuY2U7CisJdV9pbnQ4X3QJCQlyZWxlYXNlX2NhdXNlOworCisKKwkvKiBvcHRpb25hbCAqLworCXVfaW50OF90CQkJb3B0aW9uYWxfc3RhcnQ7CisKKyNpZiBPUFRJT05BTAorCWRhdGEgICAgICAgICAgICAzLTEzMAorCWltcG9ydGFuY2UgICAgICAzCisJZW5kX29mX29wdGlvbmFsIDEKKyNlbmRpZgorCXVfaW50OF90CQkJZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVsZWFzZV9jb21wbGV0ZSB7CisJdV9pbnQ4X3QJCQl0eXBlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UJZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UJc291cmNlX2xvY2FsX3JlZmVyZW5jZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzY2NwX2RhdGFfZm9ybTEgeworCS8qIG1hbmRhbnRvcnkgKi8KKwl1X2ludDhfdAkJCXR5cGU7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZQlkZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisJdV9pbnQ4X3QJCQlzZWdtZW50aW5nOworCisJLyogdmFyaWFibGUgKi8KKwl1X2ludDhfdAkJCXZhcmlhYmxlX3N0YXJ0OworCisjaWYgVkFSSUFCTEUKKwlkYXRhIDItMjU2OworI2VuZGlmCisKKwl1X2ludDhfdAkJCWRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKK3N0cnVjdCBzY2NwX2RhdGFfdW5pdGRhdGEgeworCS8qIG1hbmRhbnRvcnkgKi8KKwl1X2ludDhfdAkJCXR5cGU7CisJdV9pbnQ4X3QJCQlwcm90b19jbGFzczsKKworCisJLyogdmFyaWFibGUgKi8KKwl1X2ludDhfdAkJCXZhcmlhYmxlX2NhbGxlZDsKKwl1X2ludDhfdAkJCXZhcmlhYmxlX2NhbGxpbmc7CisJdV9pbnQ4X3QJCQl2YXJpYWJsZV9kYXRhOworCisjaWYgVkFSSUFCTEUKKwljYWxsZWQgcGFydHkgYWRkcmVzcworCWNhbGxpbmcgcGFydHkgYWRkcmVzcworI2VuZGlmCisKKwl1X2ludDhfdAkJCWRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc2NjcF9kYXRhX2l0IHsKKwkvKiBtYW5kYW50b3J5ICovCisJdV9pbnQ4X3QJCQl0eXBlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UJZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UJc291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKwl1X2ludDhfdAkJCXByb3RvX2NsYXNzOworCisJdV9pbnQ4X3QJCQlzZXF1ZW5jaW5nWzJdOworCXVfaW50OF90CQkJY3JlZGl0OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNjY3BfcHJvdG9fZXJyIHsKKwl1X2ludDhfdAkJCXR5cGU7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZQlkZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisJdV9pbnQ4X3QJCQllcnJvcl9jYXVzZTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL3Z0eS9NYWtlZmlsZS5hbSBiL29wZW5ic2MvaW5jbHVkZS92dHkvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY3NDc2NgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS92dHkvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSBAQAorbm9pbnN0X0hFQURFUlMgPSBidWZmZXIuaCBjb21tYW5kLmggIHZlY3Rvci5oIHZ0eS5oCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvdnR5L2J1ZmZlci5oIGIvb3BlbmJzYy9pbmNsdWRlL3Z0eS9idWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTQ2N2E5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL3Z0eS9idWZmZXIuaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIEJ1ZmZlcmluZyB0byBvdXRwdXQgYW5kIGlucHV0LgorICogQ29weXJpZ2h0IChDKSAxOTk4IEt1bmloaXJvIElzaGlndXJvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIFplYnJhLgorICoKKyAqIEdOVSBaZWJyYSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogR05VIFplYnJhIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBHTlUgWmVicmE7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfWkVCUkFfQlVGRkVSX0gKKyNkZWZpbmUgX1pFQlJBX0JVRkZFUl9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyogQ3JlYXRlIGEgbmV3IGJ1ZmZlci4gIE1lbW9yeSB3aWxsIGJlIGFsbG9jYXRlZCBpbiBjaHVua3Mgb2YgdGhlIGdpdmVuCisgICBzaXplLiAgSWYgdGhlIGFyZ3VtZW50IGlzIDAsIHRoZSBsaWJyYXJ5IHdpbGwgc3VwcGx5IGEgcmVhc29uYWJsZQorICAgZGVmYXVsdCBzaXplIHN1aXRhYmxlIGZvciBidWZmZXJpbmcgc29ja2V0IEkvTy4gKi8KK3N0cnVjdCBidWZmZXIgKmJ1ZmZlcl9uZXcodm9pZCAqY3R4LCBzaXplX3QpOworCisvKiBGcmVlIGFsbCBkYXRhIGluIHRoZSBidWZmZXIuICovCit2b2lkIGJ1ZmZlcl9yZXNldChzdHJ1Y3QgYnVmZmVyICopOworCisvKiBUaGlzIGZ1bmN0aW9uIGZpcnN0IGNhbGxzIGJ1ZmZlcl9yZXNldCB0byByZWxlYXNlIGFsbCBidWZmZXJlZCBkYXRhLgorICAgVGhlbiBpdCBmcmVlcyB0aGUgc3RydWN0IGJ1ZmZlciBpdHNlbGYuICovCit2b2lkIGJ1ZmZlcl9mcmVlKHN0cnVjdCBidWZmZXIgKik7CisKKy8qIEFkZCB0aGUgZ2l2ZW4gZGF0YSB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIuICovCitleHRlcm4gdm9pZCBidWZmZXJfcHV0KHN0cnVjdCBidWZmZXIgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOworLyogQWRkIGEgc2luZ2xlIGNoYXJhY3RlciB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIuICovCitleHRlcm4gdm9pZCBidWZmZXJfcHV0YyhzdHJ1Y3QgYnVmZmVyICosIHVfY2hhcik7CisvKiBBZGQgYSBOVUwtdGVybWluYXRlZCBzdHJpbmcgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLiAqLworZXh0ZXJuIHZvaWQgYnVmZmVyX3B1dHN0cihzdHJ1Y3QgYnVmZmVyICosIGNvbnN0IGNoYXIgKik7CisKKy8qIENvbWJpbmUgYWxsIGFjY3VtdWxhdGVkIChhbmQgdW5mbHVzaGVkKSBkYXRhIGluc2lkZSB0aGUgYnVmZmVyIGludG8gYQorICAgc2luZ2xlIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBhbGxvY2F0ZWQgdXNpbmcgWE1BTExPQyhNVFlQRV9UTVApLiAgTm90ZQorICAgdGhhdCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGFsdGVyIHRoZSBzdGF0ZSBvZiB0aGUgYnVmZmVyLCBzbyB0aGUgZGF0YQorICAgaXMgc3RpbGwgaW5zaWRlIHdhaXRpbmcgdG8gYmUgZmx1c2hlZC4gKi8KK2NoYXIgKmJ1ZmZlcl9nZXRzdHIoc3RydWN0IGJ1ZmZlciAqKTsKKworLyogUmV0dXJucyAxIGlmIHRoZXJlIGlzIG5vIHBlbmRpbmcgZGF0YSBpbiB0aGUgYnVmZmVyLiAgT3RoZXJ3aXNlIHJldHVybnMgMC4gKi8KK2ludCBidWZmZXJfZW1wdHkoc3RydWN0IGJ1ZmZlciAqKTsKKwordHlwZWRlZiBlbnVtIHsKKwkvKiBBbiBJL08gZXJyb3Igb2NjdXJyZWQuICBUaGUgYnVmZmVyIHNob3VsZCBiZSBkZXN0cm95ZWQgYW5kIHRoZQorCSAgIGZpbGUgZGVzY3JpcHRvciBzaG91bGQgYmUgY2xvc2VkLiAqLworCUJVRkZFUl9FUlJPUiA9IC0xLAorCisJLyogVGhlIGRhdGEgd2FzIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5LCBhbmQgdGhlIGJ1ZmZlciBpcyBub3cgZW1wdHkKKwkgICAodGhlcmUgaXMgbm8gcGVuZGluZyBkYXRhIHdhaXRpbmcgdG8gYmUgZmx1c2hlZCkuICovCisJQlVGRkVSX0VNUFRZID0gMCwKKworCS8qIFRoZXJlIGlzIHBlbmRpbmcgZGF0YSBpbiB0aGUgYnVmZmVyIHdhaXRpbmcgdG8gYmUgZmx1c2hlZC4gIFBsZWFzZQorCSAgIHRyeSBmbHVzaGluZyB0aGUgYnVmZmVyIHdoZW4gc2VsZWN0IGluZGljYXRlcyB0aGF0IHRoZSBmaWxlIGRlc2NyaXB0b3IKKwkgICBpcyB3cml0ZWFibGUuICovCisJQlVGRkVSX1BFTkRJTkcgPSAxCit9IGJ1ZmZlcl9zdGF0dXNfdDsKKworLyogVHJ5IHRvIHdyaXRlIHRoaXMgZGF0YSB0byB0aGUgZmlsZSBkZXNjcmlwdG9yLiAgQW55IGRhdGEgdGhhdCBjYW5ub3QKKyAgIGJlIHdyaXR0ZW4gaW1tZWRpYXRlbHkgaXMgYWRkZWQgdG8gdGhlIGJ1ZmZlciBxdWV1ZS4gKi8KK2V4dGVybiBidWZmZXJfc3RhdHVzX3QgYnVmZmVyX3dyaXRlKHN0cnVjdCBidWZmZXIgKiwgaW50IGZkLAorCQkJCSAgICBjb25zdCB2b2lkICosIHNpemVfdCk7CisKKy8qIFRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gZmx1c2ggc29tZSAoYnV0IHBlcmhhcHMgbm90IGFsbCkgb2YKKyAgIHRoZSBxdWV1ZWQgZGF0YSB0byB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yLiAqLworZXh0ZXJuIGJ1ZmZlcl9zdGF0dXNfdCBidWZmZXJfZmx1c2hfYXZhaWxhYmxlKHN0cnVjdCBidWZmZXIgKiwgaW50IGZkKTsKKworLyogVGhlIGZvbGxvd2luZyAyIGZ1bmN0aW9ucyAoYnVmZmVyX2ZsdXNoX2FsbCBhbmQgYnVmZmVyX2ZsdXNoX3dpbmRvdykKKyAgIGFyZSBmb3IgdXNlIGluIGxpYi92dHkuYyBvbmx5LiAgVGhleSBzaG91bGQgbm90IGJlIHVzZWQgZWxzZXdoZXJlLiAqLworCisvKiBDYWxsIGJ1ZmZlcl9mbHVzaF9hdmFpbGFibGUgcmVwZWF0ZWRseSB1bnRpbCBlaXRoZXIgYWxsIGRhdGEgaGFzIGJlZW4KKyAgIGZsdXNoZWQsIG9yIGFuIEkvTyBlcnJvciBoYXMgYmVlbiBlbmNvdW50ZXJlZCwgb3IgdGhlIG9wZXJhdGlvbiB3b3VsZAorICAgYmxvY2suICovCitleHRlcm4gYnVmZmVyX3N0YXR1c190IGJ1ZmZlcl9mbHVzaF9hbGwoc3RydWN0IGJ1ZmZlciAqLCBpbnQgZmQpOworCisvKiBBdHRlbXB0IHRvIHdyaXRlIGVub3VnaCBkYXRhIHRvIHRoZSBnaXZlbiBmZCB0byBmaWxsIGEgd2luZG93IG9mIHRoZQorICAgZ2l2ZW4gd2lkdGggYW5kIGhlaWdodCAoYW5kIHJlbW92ZSB0aGUgZGF0YSB3cml0dGVuIGZyb20gdGhlIGJ1ZmZlcikuCisKKyAgIElmICFub19tb3JlLCB0aGVuIGEgbWVzc2FnZSBzYXlpbmcgIiAtLU1vcmUtLSAiIGlzIGFwcGVuZGVkLgorICAgSWYgZXJhc2UgaXMgdHJ1ZSwgdGhlbiBmaXJzdCBvdmVyd3JpdGUgdGhlIHByZXZpb3VzICIgLS1Nb3JlLS0gIiBtZXNzYWdlCisgICB3aXRoIHNwYWNlcy4KKworICAgQW55IHdyaXRlIGVycm9yIChpbmNsdWRpbmcgRUFHQUlOIG9yIEVJTlRSKSB3aWxsIGNhdXNlIHRoaXMgZnVuY3Rpb24KKyAgIHRvIHJldHVybiAtMSAoYmVjYXVzZSB0aGUgbG9naWMgZm9yIGhhbmRsaW5nIHRoZSBlcmFzZSBhbmQgbW9yZSBmZWF0dXJlcworICAgaXMgdG9vIGNvbXBsaWNhdGVkIHRvIHJldHJ5IHRoZSB3cml0ZSBsYXRlcikuCisqLworZXh0ZXJuIGJ1ZmZlcl9zdGF0dXNfdCBidWZmZXJfZmx1c2hfd2luZG93KHN0cnVjdCBidWZmZXIgKiwgaW50IGZkLCBpbnQgd2lkdGgsCisJCQkJCSAgIGludCBoZWlnaHQsIGludCBlcmFzZSwgaW50IG5vX21vcmUpOworCisjZW5kaWYJCQkJLyogX1pFQlJBX0JVRkZFUl9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvdnR5L2NvbW1hbmQuaCBiL29wZW5ic2MvaW5jbHVkZS92dHkvY29tbWFuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmN2M4MTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvdnR5L2NvbW1hbmQuaApAQCAtMCwwICsxLDM4NCBAQAorLyoKKyAqIFplYnJhIGNvbmZpZ3VyYXRpb24gY29tbWFuZCBpbnRlcmZhY2Ugcm91dGluZQorICogQ29weXJpZ2h0IChDKSAxOTk3LCA5OCBLdW5paGlybyBJc2hpZ3VybworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBaZWJyYS4KKyAqCisgKiBHTlUgWmVicmEgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEdOVSBaZWJyYSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIFplYnJhOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX1pFQlJBX0NPTU1BTkRfSAorI2RlZmluZSBfWkVCUkFfQ09NTUFORF9ICisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgInZlY3Rvci5oIgorI2luY2x1ZGUgInZ0eS5oIgorCisvKiBIb3N0IGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgKi8KK3N0cnVjdCBob3N0IHsKKwkvKiBIb3N0IG5hbWUgb2YgdGhpcyByb3V0ZXIuICovCisJY2hhciAqbmFtZTsKKworCS8qIFBhc3N3b3JkIGZvciB2dHkgaW50ZXJmYWNlLiAqLworCWNoYXIgKnBhc3N3b3JkOworCWNoYXIgKnBhc3N3b3JkX2VuY3J5cHQ7CisKKwkvKiBFbmFibGUgcGFzc3dvcmQgKi8KKwljaGFyICplbmFibGU7CisJY2hhciAqZW5hYmxlX2VuY3J5cHQ7CisKKwkvKiBTeXN0ZW0gd2lkZSB0ZXJtaW5hbCBsaW5lcy4gKi8KKwlpbnQgbGluZXM7CisKKwkvKiBMb2cgZmlsZW5hbWUuICovCisJY2hhciAqbG9nZmlsZTsKKworCS8qIGNvbmZpZyBmaWxlIG5hbWUgb2YgdGhpcyBob3N0ICovCisJY2hhciAqY29uZmlnOworCisJLyogRmxhZ3MgZm9yIHNlcnZpY2VzICovCisJaW50IGFkdmFuY2VkOworCWludCBlbmNyeXB0OworCisJLyogQmFubmVyIGNvbmZpZ3VyYXRpb24uICovCisJY29uc3QgY2hhciAqbW90ZDsKKwljaGFyICptb3RkZmlsZTsKK307CisKKy8qIFRoZXJlIGFyZSBzb21lIGNvbW1hbmQgbGV2ZWxzIHdoaWNoIGNhbGxlZCBmcm9tIGNvbW1hbmQgbm9kZS4gKi8KK2VudW0gbm9kZV90eXBlIHsKKwlBVVRIX05PREUsCQkvKiBBdXRoZW50aWNhdGlvbiBtb2RlIG9mIHZ0eSBpbnRlcmZhY2UuICovCisJVklFV19OT0RFLAkJLyogVmlldyBub2RlLiBEZWZhdWx0IG1vZGUgb2YgdnR5IGludGVyZmFjZS4gKi8KKwlBVVRIX0VOQUJMRV9OT0RFLAkvKiBBdXRoZW50aWNhdGlvbiBtb2RlIGZvciBjaGFuZ2UgZW5hYmxlLiAqLworCUVOQUJMRV9OT0RFLAkJLyogRW5hYmxlIG5vZGUuICovCisJQ09ORklHX05PREUsCQkvKiBDb25maWcgbm9kZS4gRGVmYXVsdCBtb2RlIG9mIGNvbmZpZyBmaWxlLiAqLworCVNFUlZJQ0VfTk9ERSwJCS8qIFNlcnZpY2Ugbm9kZS4gKi8KKwlERUJVR19OT0RFLAkJLyogRGVidWcgbm9kZS4gKi8KKyNpZiAwCisJQUFBX05PREUsCQkvKiBBQUEgbm9kZS4gKi8KKwlLRVlDSEFJTl9OT0RFLAkJLyogS2V5LWNoYWluIG5vZGUuICovCisJS0VZQ0hBSU5fS0VZX05PREUsCS8qIEtleS1jaGFpbiBrZXkgbm9kZS4gKi8KKwlJTlRFUkZBQ0VfTk9ERSwJCS8qIEludGVyZmFjZSBtb2RlIG5vZGUuICovCisJWkVCUkFfTk9ERSwJCS8qIHplYnJhIGNvbm5lY3Rpb24gbm9kZS4gKi8KKwlUQUJMRV9OT0RFLAkJLyogcnRtX3RhYmxlIHNlbGVjdGlvbiBub2RlLiAqLworCVJJUF9OT0RFLAkJLyogUklQIHByb3RvY29sIG1vZGUgbm9kZS4gKi8KKwlSSVBOR19OT0RFLAkJLyogUklQbmcgcHJvdG9jb2wgbW9kZSBub2RlLiAqLworCUJHUF9OT0RFLAkJLyogQkdQIHByb3RvY29sIG1vZGUgd2hpY2ggaW5jbHVkZXMgQkdQNCsgKi8KKwlCR1BfVlBOVjRfTk9ERSwJCS8qIEJHUCBNUExTLVZQTiBQRSBleGNoYW5nZS4gKi8KKwlCR1BfSVBWNF9OT0RFLAkJLyogQkdQIElQdjQgdW5pY2FzdCBhZGRyZXNzIGZhbWlseS4gICovCisJQkdQX0lQVjRNX05PREUsCQkvKiBCR1AgSVB2NCBtdWx0aWNhc3QgYWRkcmVzcyBmYW1pbHkuICAqLworCUJHUF9JUFY2X05PREUsCQkvKiBCR1AgSVB2NiBhZGRyZXNzIGZhbWlseSAqLworCU9TUEZfTk9ERSwJCS8qIE9TUEYgcHJvdG9jb2wgbW9kZSAqLworCU9TUEY2X05PREUsCQkvKiBPU1BGIHByb3RvY29sIGZvciBJUHY2IG1vZGUgKi8KKwlJU0lTX05PREUsCQkvKiBJU0lTIHByb3RvY29sIG1vZGUgKi8KKwlNQVNDX05PREUsCQkvKiBNQVNDIGZvciBtdWx0aWNhc3QuICAqLworCUlSRFBfTk9ERSwJCS8qIElDTVAgUm91dGVyIERpc2NvdmVyeSBQcm90b2NvbCBtb2RlLiAqLworCUlQX05PREUsCQkvKiBTdGF0aWMgaXAgcm91dGUgbm9kZS4gKi8KKwlBQ0NFU1NfTk9ERSwJCS8qIEFjY2VzcyBsaXN0IG5vZGUuICovCisJUFJFRklYX05PREUsCQkvKiBQcmVmaXggbGlzdCBub2RlLiAqLworCUFDQ0VTU19JUFY2X05PREUsCS8qIEFjY2VzcyBsaXN0IG5vZGUuICovCisJUFJFRklYX0lQVjZfTk9ERSwJLyogUHJlZml4IGxpc3Qgbm9kZS4gKi8KKwlBU19MSVNUX05PREUsCQkvKiBBUyBsaXN0IG5vZGUuICovCisJQ09NTVVOSVRZX0xJU1RfTk9ERSwJLyogQ29tbXVuaXR5IGxpc3Qgbm9kZS4gKi8KKwlSTUFQX05PREUsCQkvKiBSb3V0ZSBtYXAgbm9kZS4gKi8KKwlTTVVYX05PREUsCQkvKiBTTk1QIGNvbmZpZ3VyYXRpb24gbm9kZS4gKi8KKwlEVU1QX05PREUsCQkvKiBQYWNrZXQgZHVtcCBub2RlLiAqLworCUZPUldBUkRJTkdfTk9ERSwJLyogSVAgZm9yd2FyZGluZyBub2RlLiAqLworI2VuZGlmCisJVlRZX05PREUsCQkvKiBWdHkgbm9kZS4gKi8KKworCUdTTU5FVF9OT0RFLAorCUJUU19OT0RFLAorCVRSWF9OT0RFLAorCVRTX05PREUsCisJU1VCU0NSX05PREUsCisJTUdDUF9OT0RFLAorCUdCUFJPWFlfTk9ERSwKKwlTR1NOX05PREUsCit9OworCisvKiBOb2RlIHdoaWNoIGhhcyBzb21lIGNvbW1hbmRzIGFuZCBwcm9tcHQgc3RyaW5nIGFuZCBjb25maWd1cmF0aW9uCisgICBmdW5jdGlvbiBwb2ludGVyIC4gKi8KK3N0cnVjdCBjbWRfbm9kZSB7CisJLyogTm9kZSBpbmRleC4gKi8KKwllbnVtIG5vZGVfdHlwZSBub2RlOworCisJLyogUHJvbXB0IGNoYXJhY3RlciBhdCB2dHkgaW50ZXJmYWNlLiAqLworCWNvbnN0IGNoYXIgKnByb21wdDsKKworCS8qIElzIHRoaXMgbm9kZSdzIGNvbmZpZ3VyYXRpb24gZ29lcyB0byB2dHlzaCA/ICovCisJaW50IHZ0eXNoOworCisJLyogTm9kZSdzIGNvbmZpZ3VyYXRpb24gd3JpdGUgZnVuY3Rpb24gKi8KKwlpbnQgKCpmdW5jKSAoc3RydWN0IHZ0eSAqKTsKKworCS8qIFZlY3RvciBvZiB0aGlzIG5vZGUncyBjb21tYW5kIGxpc3QuICovCisJdmVjdG9yIGNtZF92ZWN0b3I7Cit9OworCitlbnVtIHsKKwlDTURfQVRUUl9ERVBSRUNBVEVEID0gMSwKKwlDTURfQVRUUl9ISURERU4sCit9OworCisvKiBTdHJ1Y3R1cmUgb2YgY29tbWFuZCBlbGVtZW50LiAqLworc3RydWN0IGNtZF9lbGVtZW50IHsKKwljb25zdCBjaGFyICpzdHJpbmc7CS8qIENvbW1hbmQgc3BlY2lmaWNhdGlvbiBieSBzdHJpbmcuICovCisJaW50ICgqZnVuYykgKHN0cnVjdCBjbWRfZWxlbWVudCAqLCBzdHJ1Y3QgdnR5ICosIGludCwgY29uc3QgY2hhciAqW10pOworCWNvbnN0IGNoYXIgKmRvYzsJLyogRG9jdW1lbnRhdGlvbiBvZiB0aGlzIGNvbW1hbmQuICovCisJaW50IGRhZW1vbjsJCS8qIERhZW1vbiB0byB3aGljaCB0aGlzIGNvbW1hbmQgYmVsb25nLiAqLworCXZlY3RvciBzdHJ2ZWM7CQkvKiBQb2ludGluZyBvdXQgZWFjaCBkZXNjcmlwdGlvbiB2ZWN0b3IuICovCisJdW5zaWduZWQgaW50IGNtZHNpemU7CS8qIENvbW1hbmQgaW5kZXggY291bnQuICovCisJY2hhciAqY29uZmlnOwkJLyogQ29uZmlndXJhdGlvbiBzdHJpbmcgKi8KKwl2ZWN0b3Igc3ViY29uZmlnOwkvKiBTdWIgY29uZmlndXJhdGlvbiBzdHJpbmcgKi8KKwl1X2NoYXIgYXR0cjsJCS8qIENvbW1hbmQgYXR0cmlidXRlcyAqLworfTsKKworLyogQ29tbWFuZCBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUuICovCitzdHJ1Y3QgZGVzYyB7CisJY29uc3QgY2hhciAqY21kOwkvKiBDb21tYW5kIHN0cmluZy4gKi8KKwljb25zdCBjaGFyICpzdHI7CS8qIENvbW1hbmQncyBkZXNjcmlwdGlvbi4gKi8KK307CisKKy8qIFJldHVybiB2YWx1ZSBvZiB0aGUgY29tbWFuZHMuICovCisjZGVmaW5lIENNRF9TVUNDRVNTICAgICAgICAgICAgICAwCisjZGVmaW5lIENNRF9XQVJOSU5HICAgICAgICAgICAgICAxCisjZGVmaW5lIENNRF9FUlJfTk9fTUFUQ0ggICAgICAgICAyCisjZGVmaW5lIENNRF9FUlJfQU1CSUdVT1VTICAgICAgICAzCisjZGVmaW5lIENNRF9FUlJfSU5DT01QTEVURSAgICAgICA0CisjZGVmaW5lIENNRF9FUlJfRVhFRURfQVJHQ19NQVggICA1CisjZGVmaW5lIENNRF9FUlJfTk9USElOR19UT0RPICAgICA2CisjZGVmaW5lIENNRF9DT01QTEVURV9GVUxMX01BVENIICA3CisjZGVmaW5lIENNRF9DT01QTEVURV9NQVRDSCAgICAgICA4CisjZGVmaW5lIENNRF9DT01QTEVURV9MSVNUX01BVENIICA5CisjZGVmaW5lIENNRF9TVUNDRVNTX0RBRU1PTiAgICAgIDEwCisKKy8qIEFyZ2MgbWF4IGNvdW50cy4gKi8KKyNkZWZpbmUgQ01EX0FSR0NfTUFYICAgMjUKKworLyogVHVybiBvZmYgdGhlc2UgbWFjcm9zIHdoZW4gdWlzbmcgY3BwIHdpdGggZXh0cmFjdC5wbCAqLworI2lmbmRlZiBWVFlTSF9FWFRSQUNUX1BMCisKKy8qIGhlbHBlciBkZWZpbmVzIGZvciBlbmQtdXNlciBERUZVTiogbWFjcm9zICovCisjZGVmaW5lIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIGF0dHJzLCBkbnVtKSBcCisgIHN0YXRpYyBzdHJ1Y3QgY21kX2VsZW1lbnQgY21kbmFtZSA9IFwKKyAgeyBcCisgICAgLnN0cmluZyA9IGNtZHN0ciwgXAorICAgIC5mdW5jID0gZnVuY25hbWUsIFwKKyAgICAuZG9jID0gaGVscHN0ciwgXAorICAgIC5hdHRyID0gYXR0cnMsIFwKKyAgICAuZGFlbW9uID0gZG51bSwgXAorICB9OworCisvKiBnbG9iYWwgKG5vbiBzdGF0aWMpIGNtZF9lbGVtZW50ICovCisjZGVmaW5lIGdERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBhdHRycywgZG51bSkgXAorICBzdHJ1Y3QgY21kX2VsZW1lbnQgY21kbmFtZSA9IFwKKyAgeyBcCisgICAgLnN0cmluZyA9IGNtZHN0ciwgXAorICAgIC5mdW5jID0gZnVuY25hbWUsIFwKKyAgICAuZG9jID0gaGVscHN0ciwgXAorICAgIC5hdHRyID0gYXR0cnMsIFwKKyAgICAuZGFlbW9uID0gZG51bSwgXAorICB9OworCisjZGVmaW5lIERFRlVOX0NNRF9GVU5DX0RFQ0woZnVuY25hbWUpIFwKKyAgc3RhdGljIGludCBmdW5jbmFtZSAoc3RydWN0IGNtZF9lbGVtZW50ICosIHN0cnVjdCB2dHkgKiwgaW50LCBjb25zdCBjaGFyICpbXSk7IFwKKworI2RlZmluZSBERUZVTl9DTURfRlVOQ19URVhUKGZ1bmNuYW1lKSBcCisgIHN0YXRpYyBpbnQgZnVuY25hbWUgXAorICAgIChzdHJ1Y3QgY21kX2VsZW1lbnQgKnNlbGYsIHN0cnVjdCB2dHkgKnZ0eSwgaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkKKworLyogREVGVU4gZm9yIHZ0eSBjb21tYW5kIGludGVyYWZjZS4gTGl0dGxlIGJpdCBoYWNreSA7LSkuICovCisjZGVmaW5lIERFRlVOKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU5fQ01EX0ZVTkNfREVDTChmdW5jbmFtZSkgXAorICBERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCAwLCAwKSBcCisgIERFRlVOX0NNRF9GVU5DX1RFWFQoZnVuY25hbWUpCisKKy8qIGdsb2JhbCAobm9uIHN0YXRpYykgY21kX2VsZW1lbnQgKi8KKyNkZWZpbmUgZ0RFRlVOKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU5fQ01EX0ZVTkNfREVDTChmdW5jbmFtZSkgXAorICBnREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgMCwgMCkgXAorICBERUZVTl9DTURfRlVOQ19URVhUKGZ1bmNuYW1lKQorCisjZGVmaW5lIERFRlVOX0FUVFIoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgYXR0cikgXAorICBERUZVTl9DTURfRlVOQ19ERUNMKGZ1bmNuYW1lKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIGF0dHIsIDApIFwKKyAgREVGVU5fQ01EX0ZVTkNfVEVYVChmdW5jbmFtZSkKKworI2RlZmluZSBERUZVTl9ISURERU4oZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTl9BVFRSIChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBDTURfQVRUUl9ISURERU4pCisKKyNkZWZpbmUgREVGVU5fREVQUkVDQVRFRChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOX0FUVFIgKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIENNRF9BVFRSX0RFUFJFQ0FURUQpIFwKKworLyogREVGVU5fTk9TSCBmb3IgY29tbWFuZHMgdGhhdCB2dHlzaCBzaG91bGQgaWdub3JlICovCisjZGVmaW5lIERFRlVOX05PU0goZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTihmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKQorCisvKiBERUZTSCBmb3IgdnR5c2guICovCisjZGVmaW5lIERFRlNIKGRhZW1vbiwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKE5VTEwsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgMCwgZGFlbW9uKSBcCisKKy8qIERFRlVOICsgREVGU0ggKi8KKyNkZWZpbmUgREVGVU5TSChkYWVtb24sIGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU5fQ01EX0ZVTkNfREVDTChmdW5jbmFtZSkgXAorICBERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCAwLCBkYWVtb24pIFwKKyAgREVGVU5fQ01EX0ZVTkNfVEVYVChmdW5jbmFtZSkKKworLyogREVGVU4gKyBERUZTSCB3aXRoIGF0dHJpYnV0ZXMgKi8KKyNkZWZpbmUgREVGVU5TSF9BVFRSKGRhZW1vbiwgZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgYXR0cikgXAorICBERUZVTl9DTURfRlVOQ19ERUNMKGZ1bmNuYW1lKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIGF0dHIsIGRhZW1vbikgXAorICBERUZVTl9DTURfRlVOQ19URVhUKGZ1bmNuYW1lKQorCisjZGVmaW5lIERFRlVOU0hfSElEREVOKGRhZW1vbiwgZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTlNIX0FUVFIgKGRhZW1vbiwgZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgQ01EX0FUVFJfSElEREVOKQorCisjZGVmaW5lIERFRlVOU0hfREVQUkVDQVRFRChkYWVtb24sIGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU5TSF9BVFRSIChkYWVtb24sIGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIENNRF9BVFRSX0RFUFJFQ0FURUQpCisKKy8qIEFMSUFTIG1hY3JvIHdoaWNoIGRlZmluZSBleGlzdGluZyBjb21tYW5kJ3MgYWxpYXMuICovCisjZGVmaW5lIEFMSUFTKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgMCwgMCkKKworLyogZ2xvYmFsIChub24gc3RhdGljKSBjbWRfZWxlbWVudCAqLworI2RlZmluZSBnQUxJQVMoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBnREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgMCwgMCkKKworI2RlZmluZSBBTElBU19BVFRSKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIGF0dHIpIFwKKyAgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgYXR0ciwgMCkKKworI2RlZmluZSBBTElBU19ISURERU4oZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBDTURfQVRUUl9ISURERU4sIDApCisKKyNkZWZpbmUgQUxJQVNfREVQUkVDQVRFRChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIENNRF9BVFRSX0RFUFJFQ0FURUQsIDApCisKKyNkZWZpbmUgQUxJQVNfU0goZGFlbW9uLCBmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIDAsIGRhZW1vbikKKworI2RlZmluZSBBTElBU19TSF9ISURERU4oZGFlbW9uLCBmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIENNRF9BVFRSX0hJRERFTiwgZGFlbW9uKQorCisjZGVmaW5lIEFMSUFTX1NIX0RFUFJFQ0FURUQoZGFlbW9uLCBmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIENNRF9BVFRSX0RFUFJFQ0FURUQsIGRhZW1vbikKKworI2VuZGlmCQkJCS8qIFZUWVNIX0VYVFJBQ1RfUEwgKi8KKworLyogU29tZSBtYWNyb2VzICovCisjZGVmaW5lIENNRF9PUFRJT04oUykgICAoKFNbMF0pID09ICdbJykKKyNkZWZpbmUgQ01EX1ZBUklBQkxFKFMpICgoKFNbMF0pID49ICdBJyAmJiAoU1swXSkgPD0gJ1onKSB8fCAoKFNbMF0pID09ICc8JykpCisjZGVmaW5lIENNRF9WQVJBUkcoUykgICAoKFNbMF0pID09ICcuJykKKyNkZWZpbmUgQ01EX1JBTkdFKFMpCSgoU1swXSA9PSAnPCcpKQorCisjZGVmaW5lIENNRF9JUFY0KFMpCSAgICgoc3RyY21wICgoUyksICJBLkIuQy5EIikgPT0gMCkpCisjZGVmaW5lIENNRF9JUFY0X1BSRUZJWChTKSAoKHN0cmNtcCAoKFMpLCAiQS5CLkMuRC9NIikgPT0gMCkpCisjZGVmaW5lIENNRF9JUFY2KFMpICAgICAgICAoKHN0cmNtcCAoKFMpLCAiWDpYOjpYOlgiKSA9PSAwKSkKKyNkZWZpbmUgQ01EX0lQVjZfUFJFRklYKFMpICgoc3RyY21wICgoUyksICJYOlg6Olg6WC9NIikgPT0gMCkpCisKKy8qIENvbW1vbiBkZXNjcmlwdGlvbnMuICovCisjZGVmaW5lIFNIT1dfU1RSICJTaG93IHJ1bm5pbmcgc3lzdGVtIGluZm9ybWF0aW9uXG4iCisjZGVmaW5lIElQX1NUUiAiSVAgaW5mb3JtYXRpb25cbiIKKyNkZWZpbmUgSVBWNl9TVFIgIklQdjYgaW5mb3JtYXRpb25cbiIKKyNkZWZpbmUgTk9fU1RSICJOZWdhdGUgYSBjb21tYW5kIG9yIHNldCBpdHMgZGVmYXVsdHNcbiIKKyNkZWZpbmUgQ0xFQVJfU1RSICJSZXNldCBmdW5jdGlvbnNcbiIKKyNkZWZpbmUgUklQX1NUUiAiUklQIGluZm9ybWF0aW9uXG4iCisjZGVmaW5lIEJHUF9TVFIgIkJHUCBpbmZvcm1hdGlvblxuIgorI2RlZmluZSBPU1BGX1NUUiAiT1NQRiBpbmZvcm1hdGlvblxuIgorI2RlZmluZSBORUlHSEJPUl9TVFIgIlNwZWNpZnkgbmVpZ2hib3Igcm91dGVyXG4iCisjZGVmaW5lIERFQlVHX1NUUiAiRGVidWdnaW5nIGZ1bmN0aW9ucyAoc2VlIGFsc28gJ3VuZGVidWcnKVxuIgorI2RlZmluZSBVTkRFQlVHX1NUUiAiRGlzYWJsZSBkZWJ1Z2dpbmcgZnVuY3Rpb25zIChzZWUgYWxzbyAnZGVidWcnKVxuIgorI2RlZmluZSBST1VURVJfU1RSICJFbmFibGUgYSByb3V0aW5nIHByb2Nlc3NcbiIKKyNkZWZpbmUgQVNfU1RSICJBUyBudW1iZXJcbiIKKyNkZWZpbmUgTUJHUF9TVFIgIk1CR1AgaW5mb3JtYXRpb25cbiIKKyNkZWZpbmUgTUFUQ0hfU1RSICJNYXRjaCB2YWx1ZXMgZnJvbSByb3V0aW5nIHRhYmxlXG4iCisjZGVmaW5lIFNFVF9TVFIgIlNldCB2YWx1ZXMgaW4gZGVzdGluYXRpb24gcm91dGluZyBwcm90b2NvbFxuIgorI2RlZmluZSBPVVRfU1RSICJGaWx0ZXIgb3V0Z29pbmcgcm91dGluZyB1cGRhdGVzXG4iCisjZGVmaW5lIElOX1NUUiAgIkZpbHRlciBpbmNvbWluZyByb3V0aW5nIHVwZGF0ZXNcbiIKKyNkZWZpbmUgVjROT1RBVElPTl9TVFIgInNwZWNpZnkgYnkgSVB2NCBhZGRyZXNzIG5vdGF0aW9uKGUuZy4gMC4wLjAuMClcbiIKKyNkZWZpbmUgT1NQRjZfTlVNQkVSX1NUUiAiU3BlY2lmeSBieSBudW1iZXJcbiIKKyNkZWZpbmUgSU5URVJGQUNFX1NUUiAiSW50ZXJmYWNlIGluZm9tYXRpb25cbiIKKyNkZWZpbmUgSUZOQU1FX1NUUiAiSW50ZXJmYWNlIG5hbWUoZS5nLiBlcDApXG4iCisjZGVmaW5lIElQNl9TVFIgIklQdjYgSW5mb3JtYXRpb25cbiIKKyNkZWZpbmUgT1NQRjZfU1RSICJPcGVuIFNob3J0ZXN0IFBhdGggRmlyc3QgKE9TUEYpIGZvciBJUHY2XG4iCisjZGVmaW5lIE9TUEY2X1JPVVRFUl9TVFIgIkVuYWJsZSBhIHJvdXRpbmcgcHJvY2Vzc1xuIgorI2RlZmluZSBPU1BGNl9JTlNUQU5DRV9TVFIgIjwxLTY1NTM1PiBJbnN0YW5jZSBJRFxuIgorI2RlZmluZSBTRUNPTkRTX1NUUiAiPDEtNjU1MzU+IFNlY29uZHNcbiIKKyNkZWZpbmUgUk9VVEVfU1RSICJSb3V0aW5nIFRhYmxlXG4iCisjZGVmaW5lIFBSRUZJWF9MSVNUX1NUUiAiQnVpbGQgYSBwcmVmaXggbGlzdFxuIgorI2RlZmluZSBPU1BGNl9EVU1QX1RZUEVfTElTVCBcCisiKG5laWdoYm9yfGludGVyZmFjZXxhcmVhfGxzYXx6ZWJyYXxjb25maWd8ZGJleHxzcGZ8cm91dGV8bHNkYnxyZWRpc3RyaWJ1dGV8aG9va3xhc2JyfHByZWZpeHxhYnIpIgorI2RlZmluZSBJU0lTX1NUUiAiSVMtSVMgaW5mb3JtYXRpb25cbiIKKyNkZWZpbmUgQVJFQV9UQUdfU1RSICJbYXJlYSB0YWddXG4iCisKKyNkZWZpbmUgQ09ORl9CQUNLVVBfRVhUICIuc2F2IgorCisvKiBJUHY0IG9ubHkgbWFjaGluZSBzaG91bGQgbm90IGFjY2VwdCBJUHY2IGFkZHJlc3MgZm9yIHBlZXIncyBJUAorICAgYWRkcmVzcy4gIFNvIHdlIHJlcGxhY2UgVlRZIGNvbW1hbmQgc3RyaW5nIGxpa2UgYmVsb3cuICovCisjaWZkZWYgSEFWRV9JUFY2CisjZGVmaW5lIE5FSUdIQk9SX0NNRCAgICAgICAibmVpZ2hib3IgKEEuQi5DLkR8WDpYOjpYOlgpICIKKyNkZWZpbmUgTk9fTkVJR0hCT1JfQ01EICAgICJubyBuZWlnaGJvciAoQS5CLkMuRHxYOlg6Olg6WCkgIgorI2RlZmluZSBORUlHSEJPUl9BRERSX1NUUiAgIk5laWdoYm9yIGFkZHJlc3NcbklQdjYgYWRkcmVzc1xuIgorI2RlZmluZSBORUlHSEJPUl9DTUQyICAgICAgIm5laWdoYm9yIChBLkIuQy5EfFg6WDo6WDpYfFdPUkQpICIKKyNkZWZpbmUgTk9fTkVJR0hCT1JfQ01EMiAgICJubyBuZWlnaGJvciAoQS5CLkMuRHxYOlg6Olg6WHxXT1JEKSAiCisjZGVmaW5lIE5FSUdIQk9SX0FERFJfU1RSMiAiTmVpZ2hib3IgYWRkcmVzc1xuTmVpZ2hib3IgSVB2NiBhZGRyZXNzXG5OZWlnaGJvciB0YWdcbiIKKyNlbHNlCisjZGVmaW5lIE5FSUdIQk9SX0NNRCAgICAgICAibmVpZ2hib3IgQS5CLkMuRCAiCisjZGVmaW5lIE5PX05FSUdIQk9SX0NNRCAgICAibm8gbmVpZ2hib3IgQS5CLkMuRCAiCisjZGVmaW5lIE5FSUdIQk9SX0FERFJfU1RSICAiTmVpZ2hib3IgYWRkcmVzc1xuIgorI2RlZmluZSBORUlHSEJPUl9DTUQyICAgICAgIm5laWdoYm9yIChBLkIuQy5EfFdPUkQpICIKKyNkZWZpbmUgTk9fTkVJR0hCT1JfQ01EMiAgICJubyBuZWlnaGJvciAoQS5CLkMuRHxXT1JEKSAiCisjZGVmaW5lIE5FSUdIQk9SX0FERFJfU1RSMiAiTmVpZ2hib3IgYWRkcmVzc1xuTmVpZ2hib3IgdGFnXG4iCisjZW5kaWYJCQkJLyogSEFWRV9JUFY2ICovCisKKy8qIFByb3RvdHlwZXMuICovCit2b2lkIGluc3RhbGxfbm9kZShzdHJ1Y3QgY21kX25vZGUgKiwgaW50ICgqKShzdHJ1Y3QgdnR5ICopKTsKK3ZvaWQgaW5zdGFsbF9kZWZhdWx0KGVudW0gbm9kZV90eXBlKTsKK3ZvaWQgaW5zdGFsbF9lbGVtZW50KGVudW0gbm9kZV90eXBlLCBzdHJ1Y3QgY21kX2VsZW1lbnQgKik7Cit2b2lkIHNvcnRfbm9kZSgpOworCisvKiBDb25jYXRlbmF0ZXMgYXJndltzaGlmdF0gdGhyb3VnaCBhcmd2W2FyZ2MtMV0gaW50byBhIHNpbmdsZSBOVUwtdGVybWluYXRlZAorICAgc3RyaW5nIHdpdGggYSBzcGFjZSBiZXR3ZWVuIGVhY2ggZWxlbWVudCAoYWxsb2NhdGVkIHVzaW5nCisgICBYTUFMTE9DKE1UWVBFX1RNUCkpLiAgUmV0dXJucyBOVUxMIGlmIHNoaWZ0ID49IGFyZ2MuICovCitjaGFyICphcmd2X2NvbmNhdChjb25zdCBjaGFyICoqYXJndiwgaW50IGFyZ2MsIGludCBzaGlmdCk7CisKK3ZlY3RvciBjbWRfbWFrZV9zdHJ2ZWMoY29uc3QgY2hhciAqKTsKK3ZvaWQgY21kX2ZyZWVfc3RydmVjKHZlY3Rvcik7Cit2ZWN0b3IgY21kX2Rlc2NyaWJlX2NvbW1hbmQoKTsKK2NoYXIgKipjbWRfY29tcGxldGVfY29tbWFuZCgpOworY29uc3QgY2hhciAqY21kX3Byb21wdChlbnVtIG5vZGVfdHlwZSk7CitpbnQgY29uZmlnX2Zyb21fZmlsZShzdHJ1Y3QgdnR5ICosIEZJTEUgKik7CitlbnVtIG5vZGVfdHlwZSBub2RlX3BhcmVudChlbnVtIG5vZGVfdHlwZSk7CitpbnQgY21kX2V4ZWN1dGVfY29tbWFuZCh2ZWN0b3IsIHN0cnVjdCB2dHkgKiwgc3RydWN0IGNtZF9lbGVtZW50ICoqLCBpbnQpOworaW50IGNtZF9leGVjdXRlX2NvbW1hbmRfc3RyaWN0KHZlY3Rvciwgc3RydWN0IHZ0eSAqLCBzdHJ1Y3QgY21kX2VsZW1lbnQgKiopOwordm9pZCBjb25maWdfcmVwbGFjZV9zdHJpbmcoc3RydWN0IGNtZF9lbGVtZW50ICosIGNoYXIgKiwgLi4uKTsKK3ZvaWQgY21kX2luaXQoaW50KTsKKworLyogRXhwb3J0IHR5cGljYWwgZnVuY3Rpb25zLiAqLworZXh0ZXJuIHN0cnVjdCBjbWRfZWxlbWVudCBjb25maWdfZW5kX2NtZDsKK2V4dGVybiBzdHJ1Y3QgY21kX2VsZW1lbnQgY29uZmlnX2V4aXRfY21kOworZXh0ZXJuIHN0cnVjdCBjbWRfZWxlbWVudCBjb25maWdfcXVpdF9jbWQ7CitleHRlcm4gc3RydWN0IGNtZF9lbGVtZW50IGNvbmZpZ19oZWxwX2NtZDsKK2V4dGVybiBzdHJ1Y3QgY21kX2VsZW1lbnQgY29uZmlnX2xpc3RfY21kOworY2hhciAqaG9zdF9jb25maWdfZmlsZSgpOwordm9pZCBob3N0X2NvbmZpZ19zZXQoY29uc3QgY2hhciAqKTsKKwordm9pZCBwcmludF92ZXJzaW9uKGNvbnN0IGNoYXIgKik7CisKK2V4dGVybiB2b2lkICp0YWxsX3Z0eV9jbWRfY3R4OworCisjZW5kaWYJCQkJLyogX1pFQlJBX0NPTU1BTkRfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL3Z0eS92ZWN0b3IuaCBiL29wZW5ic2MvaW5jbHVkZS92dHkvdmVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJhMTg0ZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS92dHkvdmVjdG9yLmgKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIEdlbmVyaWMgdmVjdG9yIGludGVyZmFjZSBoZWFkZXIuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDk4IEt1bmloaXJvIElzaGlndXJvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIFplYnJhLgorICoKKyAqIEdOVSBaZWJyYSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogR05VIFplYnJhIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBHTlUgWmVicmE7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgKiAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfWkVCUkFfVkVDVE9SX0gKKyNkZWZpbmUgX1pFQlJBX1ZFQ1RPUl9ICisKKy8qIHN0cnVjdCBmb3IgdmVjdG9yICovCitzdHJ1Y3QgX3ZlY3RvciB7CisJdW5zaWduZWQgaW50IGFjdGl2ZTsJLyogbnVtYmVyIG9mIGFjdGl2ZSBzbG90cyAqLworCXVuc2lnbmVkIGludCBhbGxvY2VkOwkvKiBudW1iZXIgb2YgYWxsb2NhdGVkIHNsb3QgKi8KKwl2b2lkICoqaW5kZXg7CQkvKiBpbmRleCB0byBkYXRhICovCit9OwordHlwZWRlZiBzdHJ1Y3QgX3ZlY3RvciAqdmVjdG9yOworCisjZGVmaW5lIFZFQ1RPUl9NSU5fU0laRSAxCisKKy8qIChTb21ldGltZXMpIHVzZWZ1bGwgbWFjcm9zLiAgVGhpcyBtYWNybyBjb252ZXJ0IGluZGV4IGV4cHJlc3Npb24gdG8KKyBhcnJheSBleHByZXNzaW9uLiAqLworLyogUmVmZXJlbmNlIHNsb3QgYXQgZ2l2ZW4gaW5kZXgsIGNhbGxlciBtdXN0IGVuc3VyZSBzbG90IGlzIGFjdGl2ZSAqLworI2RlZmluZSB2ZWN0b3Jfc2xvdChWLEkpICAoKFYpLT5pbmRleFsoSSldKQorLyogTnVtYmVyIG9mIGFjdGl2ZSBzbG90cy4KKyAqIE5vdGUgdGhhdCB0aGlzIGRpZmZlcnMgZnJvbSB2ZWN0b3JfY291bnQoKSBhcyBpdCB0aGUgY291bnQgcmV0dXJuZWQKKyAqIHdpbGwgaW5jbHVkZSBhbnkgZW1wdHkgc2xvdHMKKyAqLworI2RlZmluZSB2ZWN0b3JfYWN0aXZlKFYpICgoViktPmFjdGl2ZSkKKworLyogUHJvdG90eXBlcy4gKi8KK3ZlY3RvciB2ZWN0b3JfaW5pdCh1bnNpZ25lZCBpbnQgc2l6ZSk7Cit2b2lkIHZlY3Rvcl9lbnN1cmUodmVjdG9yIHYsIHVuc2lnbmVkIGludCBudW0pOworaW50IHZlY3Rvcl9lbXB0eV9zbG90KHZlY3RvciB2KTsKK2ludCB2ZWN0b3Jfc2V0KHZlY3RvciB2LCB2b2lkICp2YWwpOworaW50IHZlY3Rvcl9zZXRfaW5kZXgodmVjdG9yIHYsIHVuc2lnbmVkIGludCBpLCB2b2lkICp2YWwpOwordm9pZCB2ZWN0b3JfdW5zZXQodmVjdG9yIHYsIHVuc2lnbmVkIGludCBpKTsKK3Vuc2lnbmVkIGludCB2ZWN0b3JfY291bnQodmVjdG9yIHYpOwordm9pZCB2ZWN0b3Jfb25seV93cmFwcGVyX2ZyZWUodmVjdG9yIHYpOwordm9pZCB2ZWN0b3Jfb25seV9pbmRleF9mcmVlKHZvaWQgKmluZGV4KTsKK3ZvaWQgdmVjdG9yX2ZyZWUodmVjdG9yIHYpOwordmVjdG9yIHZlY3Rvcl9jb3B5KHZlY3RvciB2KTsKKwordm9pZCAqdmVjdG9yX2xvb2t1cCh2ZWN0b3IsIHVuc2lnbmVkIGludCk7Cit2b2lkICp2ZWN0b3JfbG9va3VwX2Vuc3VyZSh2ZWN0b3IsIHVuc2lnbmVkIGludCk7CisKK2V4dGVybiB2b2lkICp0YWxsX3Z0eV92ZWNfY3R4OworCisjZW5kaWYJCQkJLyogX1pFQlJBX1ZFQ1RPUl9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvdnR5L3Z0eS5oIGIvb3BlbmJzYy9pbmNsdWRlL3Z0eS92dHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDQxZmM1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL3Z0eS92dHkuaApAQCAtMCwwICsxLDE1MSBAQAorI2lmbmRlZiBfVlRZX0gKKyNkZWZpbmUgX1ZUWV9ICisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisvKiBHQ0MgaGF2ZSBwcmludGYgdHlwZSBhdHRyaWJ1dGUgY2hlY2suICAqLworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIFZUWV9QUklOVEZfQVRUUklCVVRFKGEsYikgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIGEsIGIpKSkKKyNlbHNlCisjZGVmaW5lIFZUWV9QUklOVEZfQVRUUklCVVRFKGEsYikKKyNlbmRpZgkJCQkvKiBfX0dOVUNfXyAqLworCisvKiBEb2VzIHRoZSBJL08gZXJyb3IgaW5kaWNhdGUgdGhhdCB0aGUgb3BlcmF0aW9uIHNob3VsZCBiZSByZXRyaWVkIGxhdGVyPyAqLworI2RlZmluZSBFUlJOT19JT19SRVRSWShFTikgXAorCSgoKEVOKSA9PSBFQUdBSU4pIHx8ICgoRU4pID09IEVXT1VMREJMT0NLKSB8fCAoKEVOKSA9PSBFSU5UUikpCisKKy8qIFZ0eSByZWFkIGJ1ZmZlciBzaXplLiAqLworI2RlZmluZSBWVFlfUkVBRF9CVUZTSVogNTEyCisKKyNkZWZpbmUgVlRZX0JVRlNJWiA1MTIKKyNkZWZpbmUgVlRZX01BWEhJU1QgMjAKKworLyogVnR5IGV2ZW50cyAqLworZW51bSBldmVudCB7CisJVlRZX1NFUlYsCisJVlRZX1JFQUQsCisJVlRZX1dSSVRFLAorCVZUWV9DTE9TRUQsCisJVlRZX1RJTUVPVVRfUkVTRVQsCisjaWZkZWYgVlRZU0gKKwlWVFlTSF9TRVJWLAorCVZUWVNIX1JFQUQsCisJVlRZU0hfV1JJVEUKKyNlbmRpZgkJCQkvKiBWVFlTSCAqLworfTsKKworc3RydWN0IHZ0eSB7CisJRklMRSAqZmlsZTsKKworCS8qIHByaXZhdGUgZGF0YSwgc3BlY2lmaWVkIGJ5IGNyZWF0b3IgKi8KKwl2b2lkICpwcml2OworCisJLyogRmlsZSBkZXNjcmlwdGVyIG9mIHRoaXMgdnR5LiAqLworCWludCBmZDsKKworCS8qIElzIHRoaXMgdnR5IGNvbm5lY3QgdG8gZmlsZSBvciBub3QgKi8KKwllbnVtIHsgVlRZX1RFUk0sIFZUWV9GSUxFLCBWVFlfU0hFTEwsIFZUWV9TSEVMTF9TRVJWIH0gdHlwZTsKKworCS8qIE5vZGUgc3RhdHVzIG9mIHRoaXMgdnR5ICovCisJaW50IG5vZGU7CisKKwkvKiBGYWlsdXJlIGNvdW50ICovCisJaW50IGZhaWw7CisKKwkvKiBPdXRwdXQgYnVmZmVyLiAqLworCXN0cnVjdCBidWZmZXIgKm9idWY7CisKKwkvKiBDb21tYW5kIGlucHV0IGJ1ZmZlciAqLworCWNoYXIgKmJ1ZjsKKworCS8qIENvbW1hbmQgY3Vyc29yIHBvaW50ICovCisJaW50IGNwOworCisJLyogQ29tbWFuZCBsZW5ndGggKi8KKwlpbnQgbGVuZ3RoOworCisJLyogQ29tbWFuZCBtYXggbGVuZ3RoLiAqLworCWludCBtYXg7CisKKwkvKiBIaXN0cnkgb2YgY29tbWFuZCAqLworCWNoYXIgKmhpc3RbVlRZX01BWEhJU1RdOworCisJLyogSGlzdG9yeSBsb29rdXAgY3VycmVudCBwb2ludCAqLworCWludCBocDsKKworCS8qIEhpc3RvcnkgaW5zZXJ0IGVuZCBwb2ludCAqLworCWludCBoaW5kZXg7CisKKwkvKiBGb3IgY3VycmVudCByZWZlcmVuY2luZyBwb2ludCBvZiBpbnRlcmZhY2UsIHJvdXRlLW1hcCwKKwkgICBhY2Nlc3MtbGlzdCBldGMuLi4gKi8KKwl2b2lkICppbmRleDsKKworCS8qIEZvciBtdWx0aXBsZSBsZXZlbCBpbmRleCB0cmVhdG1lbnQgc3VjaCBhcyBrZXkgY2hhaW4gYW5kIGtleS4gKi8KKwl2b2lkICppbmRleF9zdWI7CisKKwkvKiBGb3IgZXNjYXBlIGNoYXJhY3Rlci4gKi8KKwl1bnNpZ25lZCBjaGFyIGVzY2FwZTsKKworCS8qIEN1cnJlbnQgdnR5IHN0YXR1cy4gKi8KKwllbnVtIHsgVlRZX05PUk1BTCwgVlRZX0NMT1NFLCBWVFlfTU9SRSwgVlRZX01PUkVMSU5FIH0gc3RhdHVzOworCisJLyogSUFDIGhhbmRsaW5nOiB3YXMgdGhlIGxhc3QgY2hhcmFjdGVyIHJlY2VpdmVkIHRoZSBJQUMKKwkgKiAoaW50ZXJwcmV0LWFzLWNvbW1hbmQpIGVzY2FwZSBjaGFyYWN0ZXIgKGFuZCB0aGVyZWZvcmUgdGhlIG5leHQKKwkgKiBjaGFyYWN0ZXIgd2lsbCBiZSB0aGUgY29tbWFuZCBjb2RlKT8gIFJlZmVyIHRvIFRlbG5ldCBSRkMgODU0LiAqLworCXVuc2lnbmVkIGNoYXIgaWFjOworCisJLyogSUFDIFNCIChvcHRpb24gc3VibmVnb3RpYXRpb24pIGhhbmRsaW5nICovCisJdW5zaWduZWQgY2hhciBpYWNfc2JfaW5fcHJvZ3Jlc3M7CisJLyogQXQgdGhlIG1vbWVudCwgd2UgY2FyZSBvbmx5IGFib3V0IHRoZSBOQVdTICh3aW5kb3cgc2l6ZSkgbmVnb3RpYXRpb24sCisJICogYW5kIHRoYXQgcmVxdWlyZXMganVzdCBhIDUtY2hhcmFjdGVyIGJ1ZmZlciAoUkZDIDEwNzMpOgorCSAqIDxOQVdTIGNoYXI+IDwxNi1iaXQgd2lkdGg+IDwxNi1iaXQgaGVpZ2h0PiAqLworI2RlZmluZSBURUxORVRfTkFXU19TQl9MRU4gNQorCXVuc2lnbmVkIGNoYXIgc2JfYnVmW1RFTE5FVF9OQVdTX1NCX0xFTl07CisJLyogSG93IG1hbnkgc3VibmVnb3RpYXRpb24gY2hhcmFjdGVycyBoYXZlIHdlIHJlY2VpdmVkPyAgV2UganVzdCBkcm9wCisJICogdGhvc2UgdGhhdCBkbyBub3QgZml0IGluIHRoZSBidWZmZXIuICovCisJc2l6ZV90IHNiX2xlbjsKKworCS8qIFdpbmRvdyB3aWR0aC9oZWlnaHQuICovCisJaW50IHdpZHRoOworCWludCBoZWlnaHQ7CisKKwkvKiBDb25maWd1cmUgbGluZXMuICovCisJaW50IGxpbmVzOworCisJaW50IG1vbml0b3I7CisKKwkvKiBJbiBjb25maWd1cmUgbW9kZS4gKi8KKwlpbnQgY29uZmlnOworfTsKKworLyogU21hbGwgbWFjcm8gdG8gZGV0ZXJtaW5lIG5ld2xpbmUgaXMgbmV3bGluZSBvbmx5IG9yIGxpbmVmZWVkIG5lZWRlZC4gKi8KKyNkZWZpbmUgVlRZX05FV0xJTkUgICgodnR5LT50eXBlID09IFZUWV9URVJNKSA/ICJcclxuIiA6ICJcbiIpCisKK3N0YXRpYyBpbmxpbmUgY2hhciAqdnR5X25ld2xpbmUoc3RydWN0IHZ0eSAqdnR5KQoreworCXJldHVybiBWVFlfTkVXTElORTsKK30KKworLyogUHJvdG90eXBlcy4gKi8KK3ZvaWQgdnR5X2luaXQgKHZvaWQpOworaW50IHZ0eV9yZWFkX2NvbmZpZ19maWxlKGNvbnN0IGNoYXIgKmZpbGVfbmFtZSk7Cit2b2lkIHZ0eV9pbml0X3Z0eXNoICh2b2lkKTsKK3ZvaWQgdnR5X3Jlc2V0ICh2b2lkKTsKK3N0cnVjdCB2dHkgKnZ0eV9uZXcgKHZvaWQpOworc3RydWN0IHZ0eSAqdnR5X2NyZWF0ZSAoaW50IHZ0eV9zb2NrLCB2b2lkICpwcml2KTsKK2ludCB2dHlfb3V0IChzdHJ1Y3QgdnR5ICosIGNvbnN0IGNoYXIgKiwgLi4uKSBWVFlfUFJJTlRGX0FUVFJJQlVURSgyLCAzKTsKK2ludCB2dHlfb3V0X25ld2xpbmUoc3RydWN0IHZ0eSAqKTsKK2ludCB2dHlfcmVhZChzdHJ1Y3QgdnR5ICp2dHkpOworLy92b2lkIHZ0eV90aW1lX3ByaW50IChzdHJ1Y3QgdnR5ICosIGludCk7Cit2b2lkIHZ0eV9jbG9zZSAoc3RydWN0IHZ0eSAqKTsKK2NoYXIgKnZ0eV9nZXRfY3dkICh2b2lkKTsKK3ZvaWQgdnR5X2xvZyAoY29uc3QgY2hhciAqbGV2ZWwsIGNvbnN0IGNoYXIgKnByb3RvLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QpOworaW50IHZ0eV9jb25maWdfbG9jayAoc3RydWN0IHZ0eSAqKTsKK2ludCB2dHlfY29uZmlnX3VubG9jayAoc3RydWN0IHZ0eSAqKTsKK2ludCB2dHlfc2hlbGwgKHN0cnVjdCB2dHkgKik7CitpbnQgdnR5X3NoZWxsX3NlcnYgKHN0cnVjdCB2dHkgKik7Cit2b2lkIHZ0eV9oZWxsbyAoc3RydWN0IHZ0eSAqKTsKKwordm9pZCAqdGFsbF92dHlfY3R4OworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2xpYnNjY3AucGMuaW4gYi9vcGVuYnNjL2xpYnNjY3AucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRhOGQ0OQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvbGlic2NjcC5wYy5pbgpAQCAtMCwwICsxLDEwIEBACitwcmVmaXg9QHByZWZpeEAKK2V4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKK2xpYmRpcj1AbGliZGlyQAoraW5jbHVkZWRpcj1AaW5jbHVkZWRpckAKKworTmFtZTogT3BlbkJTQyBTQ0NQIExpYgorRGVzY3JpcHRpb246IE9wZW5CU0MgU0NDUCBMaWIKK1ZlcnNpb246IEBWRVJTSU9OQAorTGliczogLUwke2xpYmRpcn0gLWxzY2NwCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfS8KZGlmZiAtLWdpdCBhL29wZW5ic2Mvb3BlbmJzYy5wYy5pbiBiL29wZW5ic2Mvb3BlbmJzYy5wYy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmEwN2UyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9vcGVuYnNjLnBjLmluCkBAIC0wLDAgKzEsMTEgQEAKK3ByZWZpeD1AcHJlZml4QAorZXhlY19wcmVmaXg9QGV4ZWNfcHJlZml4QAorbGliZGlyPUBsaWJkaXJACitpbmNsdWRlZGlyPUBpbmNsdWRlZGlyQC8KKworTmFtZTogT3BlbkJTQworRGVzY3JpcHRpb246IE9wZW5CU0MgYmFzZSBzdGF0aW9uIGNvbnRyb2xsZXIKK1JlcXVpcmVzOgorVmVyc2lvbjogQFZFUlNJT05ACitMaWJzOiAtTCR7bGliZGlyfSAtbG9wZW5ic2MKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9NYWtlZmlsZS5hbSBiL29wZW5ic2Mvc3JjL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYzAyNTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQ0IEBACitJTkNMVURFUyA9ICQoYWxsX2luY2x1ZGVzKSAtSSQodG9wX3NyY2RpcikvaW5jbHVkZSAtSSQodG9wX2J1aWxkZGlyKQorQU1fQ0ZMQUdTPS1XYWxsICQoTElCT1NNT0NPUkVfQ0ZMQUdTKQorQU1fTERGTEFHUyA9ICQoTElCT1NNT0NPUkVfTElCUykKKworIyBidWlsZCBjdXJyZW50IGRpcmVjdG9yeSBiZWZvcmUgYnVpbGRpbmcgZ3BycworU1VCRElSUyA9IC4gaXBhY2Nlc3MgZ3BycworCitzYmluX1BST0dSQU1TID0gYnNjX2hhY2sgYnMxMV9jb25maWcgaXNkbnN5bmMgYnNjX21nY3AKK25vaW5zdF9MSUJSQVJJRVMgPSBsaWJic2MuYSBsaWJtc2MuYSBsaWJ2dHkuYSBsaWJzY2NwLmEKK25vaW5zdF9IRUFERVJTID0gdnR5L2NhcmRzaGVsbC5oCisKK2JzY2RpciA9ICQobGliZGlyKQorYnNjX0xJQlJBUklFUyA9IGxpYnNjY3AuYQorCitsaWJic2NfYV9TT1VSQ0VTID0gYWJpc19yc2wuYyBhYmlzX25tLmMgZ3NtX2RhdGEuYyBnc21fMDRfMDhfdXRpbHMuYyBcCisJCWNoYW5fYWxsb2MuYyBkZWJ1Zy5jIHNvY2tldC5jIFwKKwkJZ3NtX3N1YnNjcmliZXJfYmFzZS5jIHN1YmNoYW5fZGVtdXguYyBic2NfcmxsLmMgdHJhbnNhY3Rpb24uYyBcCisJCXRyYXVfZnJhbWUuYyB0cmF1X211eC5jIHBhZ2luZy5jIGUxX2NvbmZpZy5jIGUxX2lucHV0LmMgXAorCQlpbnB1dC9taXNkbi5jIGlucHV0L2lwYWNjZXNzLmMgXAorCQl0YWxsb2NfY3R4LmMgc3lzdGVtX2luZm9ybWF0aW9uLmMgcmVzdF9vY3RldHMuYyBcCisJCXJ0cF9wcm94eS5jIGJ0c19zaWVtZW5zX2JzMTEuYyBidHNfaXBhY2Nlc3NfbmFub2J0cy5jIFwKKwkJYnRzX3Vua25vd24uYyBic2NfdmVyc2lvbi5jIGJzY19hcGkuYworCitsaWJtc2NfYV9TT1VSQ0VTID0gZ3NtX3N1YnNjcmliZXIuYyBkYi5jIFwKKwkJbW5jYy5jIGdzbV8wNF8wOC5jIGdzbV8wNF8xMS5jIHRyYW5zYWN0aW9uLmMgXAorCQl0b2tlbl9hdXRoLmMgcnJscC5jIGdzbV8wNF84MC5jIHVzc2QuYyBzaWxlbnRfY2FsbC5jIFwKKwkJaGFuZG92ZXJfbG9naWMuYyBoYW5kb3Zlcl9kZWNpc2lvbi5jIG1lYXNfcmVwLmMKKworbGlidnR5X2FfU09VUkNFUyA9IHZ0eS9idWZmZXIuYyB2dHkvY29tbWFuZC5jIHZ0eS92ZWN0b3IuYyB2dHkvdnR5LmMgXAorCQl0ZWxuZXRfaW50ZXJmYWNlLmMgdnR5X2ludGVyZmFjZV9jbWRzLmMKKworbGlic2NjcF9hX1NPVVJDRVMgPSBzY2NwL3NjY3AuYworCitic2NfaGFja19TT1VSQ0VTID0gYnNjX2hhY2suYyBic2NfaW5pdC5jIHZ0eV9pbnRlcmZhY2UuYyB2dHlfaW50ZXJmYWNlX2xheWVyMy5jCitic2NfaGFja19MREFERCA9IGxpYm1zYy5hIGxpYmJzYy5hIGxpYm1zYy5hIGxpYnZ0eS5hIC1sZGwgLWxkYmkgJChMSUJDUllQVCkKKworYnMxMV9jb25maWdfU09VUkNFUyA9IGJzMTFfY29uZmlnLmMgYWJpc19ubS5jIGdzbV9kYXRhLmMgZGVidWcuYyBcCisJCSAgICAgIHJzMjMyLmMgYnRzX3NpZW1lbnNfYnMxMS5jCisKK2lzZG5zeW5jX1NPVVJDRVMgPSBpc2Ruc3luYy5jCisKK2JzY19tZ2NwX1NPVVJDRVMgPSBtZ2NwL21nY3BfbWFpbi5jIG1nY3AvbWdjcF9wcm90b2NvbC5jIG1nY3AvbWdjcF9uZXR3b3JrLmMgbWdjcC9tZ2NwX3Z0eS5jIFwKKwkJICAgZGVidWcuYworYnNjX21nY3BfTERBREQgPSBsaWJ2dHkuYQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvYWJpc19ubS5jIGIvb3BlbmJzYy9zcmMvYWJpc19ubS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3OGVlNTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9hYmlzX25tLmMKQEAgLTAsMCArMSwzMDA2IEBACisvKiBHU00gTmV0d29yayBNYW5hZ2VtZW50IChPTUwpIG1lc3NhZ2VzIG9uIHRoZSBBLWJpcyBpbnRlcmZhY2UKKyAqIDNHUFAgVFMgMTIuMjEgdmVyc2lvbiA4LjAuMCBSZWxlYXNlIDE5OTkgLyBFVFNJIFRTIDEwMCA2MjMgVjguMC4wICovCisKKy8qIChDKSAyMDA4LTIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bGliZ2VuLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfbm0uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21pc2RuLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKworI2RlZmluZSBPTV9BTExPQ19TSVpFCQkxMDI0CisjZGVmaW5lIE9NX0hFQURST09NX1NJWkUJMTI4CisjZGVmaW5lIElQQUNDX1NFR01FTlRfU0laRQkyNDUKKworLyogdW5pZGlyZWN0aW9uYWwgbWVzc2FnZXMgZnJvbSBCVFMgdG8gQlNDICovCitzdGF0aWMgY29uc3QgZW51bSBhYmlzX25tX21zZ3R5cGUgcmVwb3J0c1tdID0geworCU5NX01UX1NXX0FDVElWQVRFRF9SRVAsCisJTk1fTVRfVEVTVF9SRVAsCisJTk1fTVRfU1RBVEVDSEdfRVZFTlRfUkVQLAorCU5NX01UX0ZBSUxVUkVfRVZFTlRfUkVQLAorfTsKKworLyogbWVzc2FnZXMgd2l0aG91dCBBQ0svTkFDSyAqLworc3RhdGljIGNvbnN0IGVudW0gYWJpc19ubV9tc2d0eXBlIG5vX2Fja19uYWNrW10gPSB7CisJTk1fTVRfTUVBU19SRVNfUkVRLAorCU5NX01UX1NUT1BfTUVBUywKKwlOTV9NVF9TVEFSVF9NRUFTLAorfTsKKworLyogTWVzc2FnZXMgcmVsYXRlZCB0byBzb2Z0d2FyZSBsb2FkICovCitzdGF0aWMgY29uc3QgZW51bSBhYmlzX25tX21zZ3R5cGUgc3dfbG9hZF9tc2dzW10gPSB7CisJTk1fTVRfTE9BRF9JTklUX0FDSywKKwlOTV9NVF9MT0FEX0lOSVRfTkFDSywKKwlOTV9NVF9MT0FEX1NFR19BQ0ssCisJTk1fTVRfTE9BRF9BQk9SVCwKKwlOTV9NVF9MT0FEX0VORF9BQ0ssCisJTk1fTVRfTE9BRF9FTkRfTkFDSywKKwkvL05NX01UX1NXX0FDVF9SRVEsCisJTk1fTVRfQUNUSVZBVEVfU1dfQUNLLAorCU5NX01UX0FDVElWQVRFX1NXX05BQ0ssCisJTk1fTVRfU1dfQUNUSVZBVEVEX1JFUCwKK307CisKK3N0YXRpYyBjb25zdCBlbnVtIGFiaXNfbm1fbXNndHlwZSBuYWNrc1tdID0geworCU5NX01UX0xPQURfSU5JVF9OQUNLLAorCU5NX01UX0xPQURfRU5EX05BQ0ssCisJTk1fTVRfU1dfQUNUX1JFUV9OQUNLLAorCU5NX01UX0FDVElWQVRFX1NXX05BQ0ssCisJTk1fTVRfRVNUQUJMSVNIX1RFSV9OQUNLLAorCU5NX01UX0NPTk5fVEVSUl9TSUdOX05BQ0ssCisJTk1fTVRfRElTQ19URVJSX1NJR05fTkFDSywKKwlOTV9NVF9DT05OX1RFUlJfVFJBRl9OQUNLLAorCU5NX01UX0RJU0NfVEVSUl9UUkFGX05BQ0ssCisJTk1fTVRfQ09OTl9NRFJPUF9MSU5LX05BQ0ssCisJTk1fTVRfRElTQ19NRFJPUF9MSU5LX05BQ0ssCisJTk1fTVRfU0VUX0JUU19BVFRSX05BQ0ssCisJTk1fTVRfU0VUX1JBRElPX0FUVFJfTkFDSywKKwlOTV9NVF9TRVRfQ0hBTl9BVFRSX05BQ0ssCisJTk1fTVRfUEVSRl9URVNUX05BQ0ssCisJTk1fTVRfU0VORF9URVNUX1JFUF9OQUNLLAorCU5NX01UX1NUT1BfVEVTVF9OQUNLLAorCU5NX01UX1NUT1BfRVZFTlRfUkVQX05BQ0ssCisJTk1fTVRfUkVTVF9FVkVOVF9SRVBfTkFDSywKKwlOTV9NVF9DSEdfQURNX1NUQVRFX05BQ0ssCisJTk1fTVRfQ0hHX0FETV9TVEFURV9SRVFfTkFDSywKKwlOTV9NVF9SRVBfT1VUU1RfQUxBUk1TX05BQ0ssCisJTk1fTVRfQ0hBTkdFT1ZFUl9OQUNLLAorCU5NX01UX09QU1RBUlRfTkFDSywKKwlOTV9NVF9SRUlOSVRfTkFDSywKKwlOTV9NVF9TRVRfU0lURV9PVVRfTkFDSywKKwlOTV9NVF9DSEdfSFdfQ09ORl9OQUNLLAorCU5NX01UX0dFVF9BVFRSX05BQ0ssCisJTk1fTVRfU0VUX0FMQVJNX1RIUkVTX05BQ0ssCisJTk1fTVRfQlMxMV9CRUdJTl9EQl9UWF9OQUNLLAorCU5NX01UX0JTMTFfRU5EX0RCX1RYX05BQ0ssCisJTk1fTVRfQlMxMV9DUkVBVEVfT0JKX05BQ0ssCisJTk1fTVRfQlMxMV9ERUxFVEVfT0JKX05BQ0ssCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBuYWNrX25hbWVzW10gPSB7CisJeyBOTV9NVF9MT0FEX0lOSVRfTkFDSywJCSJTT0ZUV0FSRSBMT0FEIElOSVQiIH0sCisJeyBOTV9NVF9MT0FEX0VORF9OQUNLLAkJIlNPRlRXQVJFIExPQUQgRU5EIiB9LAorCXsgTk1fTVRfU1dfQUNUX1JFUV9OQUNLLAkiU09GVFdBUkUgQUNUSVZBVEUgUkVRVUVTVCIgfSwKKwl7IE5NX01UX0FDVElWQVRFX1NXX05BQ0ssCSJBQ1RJVkFURSBTT0ZUV0FSRSIgfSwKKwl7IE5NX01UX0VTVEFCTElTSF9URUlfTkFDSywJIkVTVEFCTElTSCBURUkiIH0sCisJeyBOTV9NVF9DT05OX1RFUlJfU0lHTl9OQUNLLAkiQ09OTkVDVCBURVJSRVNUUklBTCBTSUdOQUxMSU5HIiB9LAorCXsgTk1fTVRfRElTQ19URVJSX1NJR05fTkFDSywJIkRJU0NPTk5FQ1QgVEVSUkVTVFJJQUwgU0lHTkFMTElORyIgfSwKKwl7IE5NX01UX0NPTk5fVEVSUl9UUkFGX05BQ0ssCSJDT05ORUNUIFRFUlJFU1RSSUFMIFRSQUZGSUMiIH0sCisJeyBOTV9NVF9ESVNDX1RFUlJfVFJBRl9OQUNLLAkiRElTQ09OTkVDVCBURVJSRVNUUklBTCBUUkFGRklDIiB9LAorCXsgTk1fTVRfQ09OTl9NRFJPUF9MSU5LX05BQ0ssCSJDT05ORUNUIE1VTFRJLURST1AgTElOSyIgfSwKKwl7IE5NX01UX0RJU0NfTURST1BfTElOS19OQUNLLAkiRElTQ09OTkVDVCBNVUxUSS1EUk9QIExJTksiIH0sCisJeyBOTV9NVF9TRVRfQlRTX0FUVFJfTkFDSywJIlNFVCBCVFMgQVRUUklCVVRFIiB9LAorCXsgTk1fTVRfU0VUX1JBRElPX0FUVFJfTkFDSywJIlNFVCBSQURJTyBBVFRSSUJVVEUiIH0sCisJeyBOTV9NVF9TRVRfQ0hBTl9BVFRSX05BQ0ssCSJTRVQgQ0hBTk5FTCBBVFRSSUJVVEUiIH0sCisJeyBOTV9NVF9QRVJGX1RFU1RfTkFDSywJCSJQRVJGT1JNIFRFU1QiIH0sCisJeyBOTV9NVF9TRU5EX1RFU1RfUkVQX05BQ0ssCSJTRU5EIFRFU1QgUkVQT1JUIiB9LAorCXsgTk1fTVRfU1RPUF9URVNUX05BQ0ssCQkiU1RPUCBURVNUIiB9LAorCXsgTk1fTVRfU1RPUF9FVkVOVF9SRVBfTkFDSywJIlNUT1AgRVZFTlQgUkVQT1JUIiB9LAorCXsgTk1fTVRfUkVTVF9FVkVOVF9SRVBfTkFDSywJIlJFU0VUIEVWRU5UIFJFUE9SVCIgfSwKKwl7IE5NX01UX0NIR19BRE1fU1RBVEVfTkFDSywJIkNIQU5HRSBBRE1JTklTVFJBVElWRSBTVEFURSIgfSwKKwl7IE5NX01UX0NIR19BRE1fU1RBVEVfUkVRX05BQ0ssCisJCQkJIkNIQU5HRSBBRE1JTklTVFJBVElWRSBTVEFURSBSRVFVRVNUIiB9LAorCXsgTk1fTVRfUkVQX09VVFNUX0FMQVJNU19OQUNLLAkiUkVQT1JUIE9VVFNUQU5ESU5HIEFMQVJNUyIgfSwKKwl7IE5NX01UX0NIQU5HRU9WRVJfTkFDSywJIkNIQU5HRU9WRVIiIH0sCisJeyBOTV9NVF9PUFNUQVJUX05BQ0ssCQkiT1BTVEFSVCIgfSwKKwl7IE5NX01UX1JFSU5JVF9OQUNLLAkJIlJFSU5JVCIgfSwKKwl7IE5NX01UX1NFVF9TSVRFX09VVF9OQUNLLAkiU0VUIFNJVEUgT1VUUFVUIiB9LAorCXsgTk1fTVRfQ0hHX0hXX0NPTkZfTkFDSywJIkNIQU5HRSBIQVJEV0FSRSBDT05GSUdVUkFUSU9OIiB9LAorCXsgTk1fTVRfR0VUX0FUVFJfTkFDSywJCSJHRVQgQVRUUklCVVRFIiB9LAorCXsgTk1fTVRfU0VUX0FMQVJNX1RIUkVTX05BQ0ssCSJTRVQgQUxBUk0gVEhSRVNIT0xEIiB9LAorCXsgTk1fTVRfQlMxMV9CRUdJTl9EQl9UWF9OQUNLLAkiQlMxMSBCRUdJTiBEQVRBQkFTRSBUUkFOU01JU1NJT04iIH0sCisJeyBOTV9NVF9CUzExX0VORF9EQl9UWF9OQUNLLAkiQlMxMSBFTkQgREFUQUJBU0UgVFJBTlNNSVNTSU9OIiB9LAorCXsgTk1fTVRfQlMxMV9DUkVBVEVfT0JKX05BQ0ssCSJCUzExIENSRUFURSBPQkpFQ1QiIH0sCisJeyBOTV9NVF9CUzExX0RFTEVURV9PQkpfTkFDSywJIkJTMTEgREVMRVRFIE9CSkVDVCIgfSwKKwl7IDAsCQkJCU5VTEwgfQorfTsKKworLyogQ2hhcHRlciA5LjQuMzYgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIG5hY2tfY2F1c2VfbmFtZXNbXSA9IHsKKwkvKiBHZW5lcmFsIE5hY2sgQ2F1c2VzICovCisJeyBOTV9OQUNLX0lOQ09SUl9TVFJVQ1QsCSJJbmNvcnJlY3QgbWVzc2FnZSBzdHJ1Y3R1cmUiIH0sCisJeyBOTV9OQUNLX01TR1RZUEVfSU5WQUwsCSJJbnZhbGlkIG1lc3NhZ2UgdHlwZSB2YWx1ZSIgfSwKKwl7IE5NX05BQ0tfT0JKQ0xBU1NfSU5WQUwsCSJJbnZhbGlkIE9iamVjdCBjbGFzcyB2YWx1ZSIgfSwKKwl7IE5NX05BQ0tfT0JKQ0xBU1NfTk9UU1VQUCwJIk9iamVjdCBjbGFzcyBub3Qgc3VwcG9ydGVkIiB9LAorCXsgTk1fTkFDS19CVFNOUl9VTktOLAkJIkJUUyBuby4gdW5rbm93biIgfSwKKwl7IE5NX05BQ0tfVFJYTlJfVU5LTiwJCSJCYXNlYmFuZCBUcmFuc2NlaXZlciBuby4gdW5rbm93biIgfSwKKwl7IE5NX05BQ0tfT0JKSU5TVF9VTktOLAkJIk9iamVjdCBJbnN0YW5jZSB1bmtub3duIiB9LAorCXsgTk1fTkFDS19BVFRSSURfSU5WQUwsCQkiSW52YWxpZCBhdHRyaWJ1dGUgaWRlbnRpZmllciB2YWx1ZSIgfSwKKwl7IE5NX05BQ0tfQVRUUklEX05PVFNVUFAsCSJBdHRyaWJ1dGUgaWRlbnRpZmllciBub3Qgc3VwcG9ydGVkIiB9LAorCXsgTk1fTkFDS19QQVJBTV9SQU5HRSwJCSJQYXJhbWV0ZXIgdmFsdWUgb3V0c2lkZSBwZXJtaXR0ZWQgcmFuZ2UiIH0sCisJeyBOTV9OQUNLX0FUVFJMSVNUX0lOQ09OU0lTVEVOVCwiSW5jb25zaXN0ZW5jeSBpbiBhdHRyaWJ1dGUgbGlzdCIgfSwKKwl7IE5NX05BQ0tfU1BFQ19JTVBMX05PVFNVUFAsCSJTcGVjaWZpZWQgaW1wbGVtZW50YXRpb24gbm90IHN1cHBvcnRlZCIgfSwKKwl7IE5NX05BQ0tfQ0FOVF9QRVJGT1JNLAkJIk1lc3NhZ2UgY2Fubm90IGJlIHBlcmZvcm1lZCIgfSwKKwkvKiBTcGVjaWZpYyBOYWNrIENhdXNlcyAqLworCXsgTk1fTkFDS19SRVNfTk9USU1QTCwJCSJSZXNvdXJjZSBub3QgaW1wbGVtZW50ZWQiIH0sCisJeyBOTV9OQUNLX1JFU19OT1RBVkFJTCwJCSJSZXNvdXJjZSBub3QgYXZhaWxhYmxlIiB9LAorCXsgTk1fTkFDS19GUkVRX05PVEFWQUlMLAkiRnJlcXVlbmN5IG5vdCBhdmFpbGFibGUiIH0sCisJeyBOTV9OQUNLX1RFU1RfTk9UU1VQUCwJCSJUZXN0IG5vdCBzdXBwb3J0ZWQiIH0sCisJeyBOTV9OQUNLX0NBUEFDSVRZX1JFU1RSLAkiQ2FwYWNpdHkgcmVzdHJpY3Rpb25zIiB9LAorCXsgTk1fTkFDS19QSFlTQ0ZHX05PVFBFUkZPUk0sCSJQaHlzaWNhbCBjb25maWd1cmF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQiIH0sCisJeyBOTV9OQUNLX1RFU1RfTk9USU5JVCwJCSJUZXN0IG5vdCBpbml0aWF0ZWQiIH0sCisJeyBOTV9OQUNLX1BIWVNDRkdfTk9UUkVTVE9SRSwJIlBoeXNpY2FsIGNvbmZpZ3VyYXRpb24gY2Fubm90IGJlIHJlc3RvcmVkIiB9LAorCXsgTk1fTkFDS19URVNUX05PU1VDSCwJCSJObyBzdWNoIHRlc3QiIH0sCisJeyBOTV9OQUNLX1RFU1RfTk9TVE9QLAkJIlRlc3QgY2Fubm90IGJlIHN0b3BwZWQiIH0sCisJeyBOTV9OQUNLX01TR0lOQ09OU0lTVF9QSFlTQ0ZHLAkiTWVzc2FnZSBpbmNvbnNpc3RlbnQgd2l0aCBwaHlzaWNhbCBjb25maWd1cmF0aW9uIiB9LAorCXsgTk1fTkFDS19GSUxFX0lOQ09NUExFVEUsCSJDb21wbGV0ZSBmaWxlIG5vdHJlY2VpdmVkIiB9LAorCXsgTk1fTkFDS19GSUxFX05PVEFWQUlMLAkiRmlsZSBub3QgYXZhaWxhYmxlIGF0IGRlc3RpbmF0aW9uIiB9LAorCXsgTk1fTkFDS19GSUxFX05PVEFDVElWQVRFLAkiRmlsZSBjYW5ub3QgYmUgYWN0aXZhdGUiIH0sCisJeyBOTV9OQUNLX1JFUV9OT1RfR1JBTlQsCSJSZXF1ZXN0IG5vdCBncmFudGVkIiB9LAorCXsgTk1fTkFDS19XQUlULAkJCSJXYWl0IiB9LAorCXsgTk1fTkFDS19OT1RIX1JFUE9SVF9FWElTVCwJIk5vdGhpbmcgcmVwb3J0YWJsZSBleGlzdGluZyIgfSwKKwl7IE5NX05BQ0tfTUVBU19OT1RTVVBQLAkJIk1lYXN1cmVtZW50IG5vdCBzdXBwb3J0ZWQiIH0sCisJeyBOTV9OQUNLX01FQVNfTk9UU1RBUlQsCSJNZWFzdXJlbWVudCBub3Qgc3RhcnRlZCIgfSwKKwl7IDAsCQkJCU5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKm5hY2tfY2F1c2VfbmFtZSh1X2ludDhfdCBjYXVzZSkKK3sKKwlyZXR1cm4gZ2V0X3ZhbHVlX3N0cmluZyhuYWNrX2NhdXNlX25hbWVzLCBjYXVzZSk7Cit9CisKKy8qIENoYXB0ZXIgOS40LjE2OiBFdmVudCBUeXBlICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBldmVudF90eXBlX25hbWVzW10gPSB7CisJeyBOTV9FVlRfQ09NTV9GQUlMLAkJImNvbW11bmljYXRpb24gZmFpbHVyZSIgfSwKKwl7IE5NX0VWVF9RT1NfRkFJTCwJCSJxdWFsaXR5IG9mIHNlcnZpY2UgZmFpbHVyZSIgfSwKKwl7IE5NX0VWVF9QUk9DX0ZBSUwsCQkicHJvY2Vzc2luZyBmYWlsdXJlIiB9LAorCXsgTk1fRVZUX0VRVUlQX0ZBSUwsCQkiZXF1aXBtZW50IGZhaWx1cmUiIH0sCisJeyBOTV9FVlRfRU5WX0ZBSUwsCQkiZW52aXJvbm1lbnQgZmFpbHVyZSIgfSwKKwl7IDAsCQkJCU5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmV2ZW50X3R5cGVfbmFtZSh1X2ludDhfdCBjYXVzZSkKK3sKKwlyZXR1cm4gZ2V0X3ZhbHVlX3N0cmluZyhldmVudF90eXBlX25hbWVzLCBjYXVzZSk7Cit9CisKKy8qIENoYXB0ZXIgOS40LjYzOiBQZXJjZWl2ZWQgU2V2ZXJpdHkgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIHNldmVyaXR5X25hbWVzW10gPSB7CisJeyBOTV9TRVZFUl9DRUFTRUQsCQkiZmFpbHVyZSBjZWFzZWQiIH0sCisJeyBOTV9TRVZFUl9DUklUSUNBTCwJCSJjcml0aWNhbCBmYWlsdXJlIiB9LAorCXsgTk1fU0VWRVJfTUFKT1IsCQkibWFqb3IgZmFpbHVyZSIgfSwKKwl7IE5NX1NFVkVSX01JTk9SLAkJIm1pbm9yIGZhaWx1cmUiIH0sCisJeyBOTV9TRVZFUl9XQVJOSU5HLAkJIndhcm5pbmcgbGV2ZWwgZmFpbHVyZSIgfSwKKwl7IE5NX1NFVkVSX0lOREVURVJNSU5BVEUsCSJpbmRldGVybWluYXRlIGZhaWx1cmUiIH0sCisJeyAwLAkJCQlOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpzZXZlcml0eV9uYW1lKHVfaW50OF90IGNhdXNlKQoreworCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKHNldmVyaXR5X25hbWVzLCBjYXVzZSk7Cit9CisKKy8qIEF0dHJpYnV0ZXMgdGhhdCB0aGUgQlNDIGNhbiBzZXQsIG5vdCBvbmx5IGdldCwgYWNjb3JkaW5nIHRvIFNlY3Rpb24gOS40ICovCitzdGF0aWMgY29uc3QgZW51bSBhYmlzX25tX2F0dHIgbm1fYXR0X3NldHRhYmxlW10gPSB7CisJTk1fQVRUX0FERF9JTkZPLAorCU5NX0FUVF9BRERfVEVYVCwKKwlOTV9BVFRfREVTVCwKKwlOTV9BVFRfRVZFTlRfVFlQRSwKKwlOTV9BVFRfRklMRV9EQVRBLAorCU5NX0FUVF9HRVRfQVJJLAorCU5NX0FUVF9IV19DT05GX0NIRywKKwlOTV9BVFRfTElTVF9SRVFfQVRUUiwKKwlOTV9BVFRfTURST1BfTElOSywKKwlOTV9BVFRfTURST1BfTkVYVCwKKwlOTV9BVFRfTkFDS19DQVVTRVMsCisJTk1fQVRUX09VVFNUX0FMQVJNLAorCU5NX0FUVF9QSFlTX0NPTkYsCisJTk1fQVRUX1BST0JfQ0FVU0UsCisJTk1fQVRUX1JBRF9TVUJDLAorCU5NX0FUVF9TT1VSQ0UsCisJTk1fQVRUX1NQRUNfUFJPQiwKKwlOTV9BVFRfU1RBUlRfVElNRSwKKwlOTV9BVFRfVEVTVF9EVVIsCisJTk1fQVRUX1RFU1RfTk8sCisJTk1fQVRUX1RFU1RfUkVQT1JULAorCU5NX0FUVF9XSU5ET1dfU0laRSwKKwlOTV9BVFRfU0VWRVJJVFksCisJTk1fQVRUX01FQVNfUkVTLAorCU5NX0FUVF9NRUFTX1RZUEUsCit9OworCitjb25zdCBzdHJ1Y3QgdGx2X2RlZmluaXRpb24gbm1fYXR0X3RsdmRlZiA9IHsKKwkuZGVmID0geworCQlbTk1fQVRUX0FCSVNfQ0hBTk5FTF0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMyB9LAorCQlbTk1fQVRUX0FERF9JTkZPXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfQUREX1RFWFRdID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9BRE1fU1RBVEVdID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9BUkZDTl9MSVNUXT0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9BVVRPTl9SRVBPUlRdID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9BVkFJTF9TVEFUVVNdID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9CQ0NIX0FSRkNOXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCVtOTV9BVFRfQlNJQ10gPQkJCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9CVFNfQUlSX1RJTUVSXSA9CXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9DQ0NIX0xfSV9QXSA9CQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfQ0NDSF9MX1RdID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9DSEFOX0NPTUJdID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9DT05OX0ZBSUxfQ1JJVF0gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfREVTVF0gPQkJCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9FVkVOVF9UWVBFXSA9CQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfRklMRV9EQVRBXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfRklMRV9JRF0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX0ZJTEVfVkVSU0lPTl0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX0dTTV9USU1FXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCVtOTV9BVFRfSFNOXSA9CQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0hXX0NPTkZJR10gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX0hXX0RFU0NdID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9JTlRBVkVfUEFSQU1dID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9JTlRFUkZfQk9VTkRdID0JCXsgVExWX1RZUEVfRklYRUQsIDYgfSwKKwkJW05NX0FUVF9MSVNUX1JFUV9BVFRSXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9NQUlPXSA9CQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX01BTlVGX1NUQVRFXSA9CQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfTUFOVUZfVEhSRVNIXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfTUFOVUZfSURdID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9NQVhfVEFdID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9NRFJPUF9MSU5LXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCVtOTV9BVFRfTURST1BfTkVYVF0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQlbTk1fQVRUX05BQ0tfQ0FVU0VTXSA9CQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfTlkxXSA9CQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX09QRVJfU1RBVEVdID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9PVkVSTF9QRVJJT0RdID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9QSFlTX0NPTkZdID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9QT1dFUl9DTEFTU10gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX1BPV0VSX1RIUkVTSF0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMyB9LAorCQlbTk1fQVRUX1BST0JfQ0FVU0VdID0JCXsgVExWX1RZUEVfRklYRUQsIDMgfSwKKwkJW05NX0FUVF9SQUNIX0JfVEhSRVNIXSA9CXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9MREFWR19TTE9UU10gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQlbTk1fQVRUX1JBRF9TVUJDXSA9CQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfUkZfTUFYUE9XUl9SXSA9CQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfU0lURV9JTlBVVFNdID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9TSVRFX09VVFBVVFNdID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9TT1VSQ0VdID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9TUEVDX1BST0JdID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9TVEFSVF9USU1FXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCVtOTV9BVFRfVDIwMF0gPQkJCXsgVExWX1RZUEVfRklYRUQsIDcgfSwKKwkJW05NX0FUVF9URUldID0JCQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfVEVTVF9EVVJdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKwkJW05NX0FUVF9URVNUX05PXSA9CQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfVEVTVF9SRVBPUlRdID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9WU1dSX1RIUkVTSF0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQlbTk1fQVRUX1dJTkRPV19TSVpFXSA9IAkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX1RTQ10gPQkJCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9TV19DT05GSUddID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9TRVZFUklUWV0gPSAJCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9HRVRfQVJJXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfSFdfQ09ORl9DSEddID0gCQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfT1VUU1RfQUxBUk1dID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9NRUFTX1JFU10gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCX0sCit9OworCitzdGF0aWMgY29uc3QgZW51bSBhYmlzX25tX2NoYW5fY29tYiBjaGNvbWI0cGNoYW5bXSA9IHsKKwlbR1NNX1BDSEFOX0NDQ0hdCT0gTk1fQ0hBTkNfbWFpbkJDQ0gsCisJW0dTTV9QQ0hBTl9DQ0NIX1NEQ0NINF0JPSBOTV9DSEFOQ19CQ0NIQ29tYiwKKwlbR1NNX1BDSEFOX1RDSF9GXQk9IE5NX0NIQU5DX1RDSEZ1bGwsCisJW0dTTV9QQ0hBTl9UQ0hfSF0JPSBOTV9DSEFOQ19UQ0hIYWxmLAorCVtHU01fUENIQU5fU0RDQ0g4X1NBQ0NIOENdID0gTk1fQ0hBTkNfU0RDQ0gsCisJW0dTTV9QQ0hBTl9QRENIXQk9IE5NX0NIQU5DX0lQQUNfUERDSCwKKwlbR1NNX1BDSEFOX1RDSF9GX1BEQ0hdCT0gTk1fQ0hBTkNfSVBBQ19UQ0hGdWxsX1BEQ0gsCisJLyogRklYTUU6IGJvdW5kcyBjaGVjayAqLworfTsKKworaW50IGFiaXNfbm1fY2hjb21iNHBjaGFuKGVudW0gZ3NtX3BoeXNfY2hhbl9jb25maWcgcGNoYW4pCit7CisJaWYgKHBjaGFuIDwgQVJSQVlfU0laRShjaGNvbWI0cGNoYW4pKQorCQlyZXR1cm4gY2hjb21iNHBjaGFuW3BjaGFuXTsKKworCXJldHVybiAtRUlOVkFMOworfQorCitpbnQgYWJpc19ubV90bHZfcGFyc2Uoc3RydWN0IHRsdl9wYXJzZWQgKnRwLCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBjb25zdCB1X2ludDhfdCAqYnVmLCBpbnQgbGVuKQoreworCWlmICghYnRzLT5tb2RlbCkKKwkJcmV0dXJuIC1FSU87CisJcmV0dXJuIHRsdl9wYXJzZSh0cCwgJmJ0cy0+bW9kZWwtPm5tX2F0dF90bHZkZWYsIGJ1ZiwgbGVuLCAwLCAwKTsKK30KKworc3RhdGljIGludCBpc19pbl9hcnIoZW51bSBhYmlzX25tX21zZ3R5cGUgbXQsIGNvbnN0IGVudW0gYWJpc19ubV9tc2d0eXBlICphcnIsIGludCBzaXplKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQlpZiAoYXJyW2ldID09IG10KQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNpZiAwCisvKiBpcyB0aGlzIG1zZ3R5cGUgdGhlIHVzdWFsIEFDSy9OQUNLIHR5cGUgPyAqLworc3RhdGljIGludCBpc19hY2tfbmFjayhlbnVtIGFiaXNfbm1fbXNndHlwZSBtdCkKK3sKKwlyZXR1cm4gIWlzX2luX2FycihtdCwgbm9fYWNrX25hY2ssIEFSUkFZX1NJWkUobm9fYWNrX25hY2spKTsKK30KKyNlbmRpZgorCisvKiBpcyB0aGlzIG1zZ3R5cGUgYSByZXBvcnQgPyAqLworc3RhdGljIGludCBpc19yZXBvcnQoZW51bSBhYmlzX25tX21zZ3R5cGUgbXQpCit7CisJcmV0dXJuIGlzX2luX2FycihtdCwgcmVwb3J0cywgQVJSQVlfU0laRShyZXBvcnRzKSk7Cit9CisKKyNkZWZpbmUgTVRfQUNLKHgpCSh4KzEpCisjZGVmaW5lIE1UX05BQ0soeCkJKHgrMikKKworc3RhdGljIHZvaWQgZmlsbF9vbV9oZHIoc3RydWN0IGFiaXNfb21faGRyICpvaCwgdV9pbnQ4X3QgbGVuKQoreworCW9oLT5tZGlzYyA9IEFCSVNfT01fTURJU0NfRk9NOworCW9oLT5wbGFjZW1lbnQgPSBBQklTX09NX1BMQUNFTUVOVF9PTkxZOworCW9oLT5zZXF1ZW5jZSA9IDA7CisJb2gtPmxlbmd0aCA9IGxlbjsKK30KKworc3RhdGljIHZvaWQgZmlsbF9vbV9mb21faGRyKHN0cnVjdCBhYmlzX29tX2hkciAqb2gsIHVfaW50OF90IGxlbiwKKwkJCSAgICB1X2ludDhfdCBtc2dfdHlwZSwgdV9pbnQ4X3Qgb2JqX2NsYXNzLAorCQkJICAgIHVfaW50OF90IGJ0c19uciwgdV9pbnQ4X3QgdHJ4X25yLCB1X2ludDhfdCB0c19ucikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2ggPQorCQkJKHN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKikgb2gtPmRhdGE7CisKKwlmaWxsX29tX2hkcihvaCwgbGVuK3NpemVvZigqZm9oKSk7CisJZm9oLT5tc2dfdHlwZSA9IG1zZ190eXBlOworCWZvaC0+b2JqX2NsYXNzID0gb2JqX2NsYXNzOworCWZvaC0+b2JqX2luc3QuYnRzX25yID0gYnRzX25yOworCWZvaC0+b2JqX2luc3QudHJ4X25yID0gdHJ4X25yOworCWZvaC0+b2JqX2luc3QudHNfbnIgPSB0c19ucjsKK30KKworc3RhdGljIHN0cnVjdCBtc2diICpubV9tc2diX2FsbG9jKHZvaWQpCit7CisJcmV0dXJuIG1zZ2JfYWxsb2NfaGVhZHJvb20oT01fQUxMT0NfU0laRSwgT01fSEVBRFJPT01fU0laRSwKKwkJCQkgICAiT01MIik7Cit9CisKKy8qIFNlbmQgYSBPTUwgTk0gTWVzc2FnZSBmcm9tIEJTQyB0byBCVFMgKi8KK2ludCBhYmlzX25tX3NlbmRtc2coc3RydWN0IGdzbV9idHMgKmJ0cywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwltc2ctPnRyeCA9IGJ0cy0+YzA7CisKKwlyZXR1cm4gX2FiaXNfbm1fc2VuZG1zZyhtc2cpOworfQorCitzdGF0aWMgaW50IGFiaXNfbm1fcmN2bXNnX3N3KHN0cnVjdCBtc2diICptYik7CisKK3N0YXRpYyBzdHJ1Y3QgdmFsdWVfc3RyaW5nIG9ial9jbGFzc19uYW1lc1tdID0geworCXsgTk1fT0NfU0lURV9NQU5BR0VSLAkiU0lURSBNQU5BR0VSIiB9LAorCXsgTk1fT0NfQlRTLAkJIkJUUyIgfSwKKwl7IE5NX09DX1JBRElPX0NBUlJJRVIsCSJSQURJTyBDQVJSSUVSIiB9LAorCXsgTk1fT0NfQkFTRUJfVFJBTlNDLAkiQkFTRUJBTkQgVFJBTlNDRUlWRVIiIH0sCisJeyBOTV9PQ19DSEFOTkVMLAkiQ0hBTk5FTCIgfSwKKwl7IE5NX09DX0JTMTFfQURKQywJIkFESkMiIH0sCisJeyBOTV9PQ19CUzExX0hBTkRPVkVSLAkiSEFORE9WRVIiIH0sCisJeyBOTV9PQ19CUzExX1BXUl9DVFJMLAkiUE9XRVIgQ09OVFJPTCIgfSwKKwl7IE5NX09DX0JTMTFfQlRTRSwJIkJUU0UiIH0sCisJeyBOTV9PQ19CUzExX1JBQ0ssCSJSQUNLIiB9LAorCXsgTk1fT0NfQlMxMV9URVNULAkiVEVTVCIgfSwKKwl7IE5NX09DX0JTMTFfRU5WQUJUU0UsCSJFTlZBQlRTRSIgfSwKKwl7IE5NX09DX0JTMTFfQlBPUlQsCSJCUE9SVCIgfSwKKwl7IE5NX09DX0dQUlNfTlNFLAkiR1BSUyBOU0UiIH0sCisJeyBOTV9PQ19HUFJTX0NFTEwsCSJHUFJTIENFTEwiIH0sCisJeyBOTV9PQ19HUFJTX05TVkMsCSJHUFJTIE5TVkMiIH0sCisJeyBOTV9PQ19CUzExLAkJIlNJRU1FTlNIVyIgfSwKKwl7IDAsCQkJTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgY2hhciAqb2JqX2NsYXNzX25hbWUodV9pbnQ4X3Qgb2MpCit7CisJcmV0dXJuIGdldF92YWx1ZV9zdHJpbmcob2JqX2NsYXNzX25hbWVzLCBvYyk7Cit9CisKK2NvbnN0IGNoYXIgKm5tX29wc3RhdGVfbmFtZSh1X2ludDhfdCBvcykKK3sKKwlzd2l0Y2ggKG9zKSB7CisJY2FzZSBOTV9PUFNUQVRFX0RJU0FCTEVEOgorCQlyZXR1cm4gIkRpc2FibGVkIjsKKwljYXNlIE5NX09QU1RBVEVfRU5BQkxFRDoKKwkJcmV0dXJuICJFbmFibGVkIjsKKwljYXNlIE5NX09QU1RBVEVfTlVMTDoKKwkJcmV0dXJuICJOVUxMIjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gIlJGVSI7CisJfQorfQorCisvKiBDaGFwdGVyIDkuNC43ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBhdmFpbF9uYW1lc1tdID0geworCXsgMCwgCSJJbiB0ZXN0IiB9LAorCXsgMSwJIkZhaWxlZCIgfSwKKwl7IDIsCSJQb3dlciBvZmYiIH0sCisJeyAzLAkiT2ZmIGxpbmUiIH0sCisJLyogTm90IHVzZWQgKi8KKwl7IDUsCSJEZXBlbmRlbmN5IiB9LAorCXsgNiwJIkRlZ3JhZGVkIiB9LAorCXsgNywJIk5vdCBpbnN0YWxsZWQiIH0sCisJeyAweGZmLCAiT0siIH0sCisJeyAwLAlOVUxMIH0KK307CisKK2NvbnN0IGNoYXIgKm5tX2F2YWlsX25hbWUodV9pbnQ4X3QgYXZhaWwpCit7CisJcmV0dXJuIGdldF92YWx1ZV9zdHJpbmcoYXZhaWxfbmFtZXMsIGF2YWlsKTsKK30KKworc3RhdGljIHN0cnVjdCB2YWx1ZV9zdHJpbmcgdGVzdF9uYW1lc1tdID0geworCS8qIEZJWE1FOiBzdGFuZGFyZCB0ZXN0IG5hbWVzICovCisJeyBOTV9JUEFDQ19URVNUTk9fQ0hBTl9VU0FHRSwgIkNoYW5uZWwgVXNhZ2UiIH0sCisJeyBOTV9JUEFDQ19URVNUTk9fQkNDSF9DSEFOX1VTQUdFLCAiQkNDSCBDaGFubmVsIFVzYWdlIiB9LAorCXsgTk1fSVBBQ0NfVEVTVE5PX0ZSRVFfU1lOQywgIkZyZXF1ZW5jeSBTeW5jaHJvbml6YXRpb24iIH0sCisJeyBOTV9JUEFDQ19URVNUTk9fQkNDSF9JTkZPLCAiQkNDSCBJbmZvIiB9LAorCXsgTk1fSVBBQ0NfVEVTVE5PX1RYX0JFQUNPTiwgIlRyYW5zbWl0IEJlYWNvbiIgfSwKKwl7IE5NX0lQQUNDX1RFU1ROT19TWVNJTkZPX01PTklUT1IsICJTeXN0ZW0gSW5mbyBNb25pdG9yIiB9LAorCXsgTk1fSVBBQ0NfVEVTVE5PX0JDQ0NIX01PTklUT1IsICJCQ0NIIE1vbml0b3IiIH0sCisJeyAwLCBOVUxMIH0KK307CisKK2NvbnN0IGNoYXIgKm5tX2FkbV9uYW1lKHVfaW50OF90IGFkbSkKK3sKKwlzd2l0Y2ggKGFkbSkgeworCWNhc2UgMToKKwkJcmV0dXJuICJMb2NrZWQiOworCWNhc2UgMjoKKwkJcmV0dXJuICJVbmxvY2tlZCI7CisJY2FzZSAzOgorCQlyZXR1cm4gIlNodXRkb3duIjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gIjxub3QgdXNlZD4iOworCX0KK30KKworaW50IG5tX2lzX3J1bm5pbmcoc3RydWN0IGdzbV9ubV9zdGF0ZSAqcykgeworCXJldHVybiAocy0+b3BlcmF0aW9uYWwgPT0gTk1fT1BTVEFURV9FTkFCTEVEKSAmJiAoCisJCShzLT5hdmFpbGFiaWxpdHkgPT0gTk1fQVZTVEFURV9PSykgfHwKKwkJKHMtPmF2YWlsYWJpbGl0eSA9PSAweGZmKQorCSk7Cit9CisKK3N0YXRpYyB2b2lkIGRlYnVncF9mb2goc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oKQoreworCURFQlVHUChETk0sICJPQz0lcyglMDJ4KSBJTlNUPSglMDJ4LCUwMngsJTAyeCkgIiwKKwkJb2JqX2NsYXNzX25hbWUoZm9oLT5vYmpfY2xhc3MpLCBmb2gtPm9ial9jbGFzcywKKwkJZm9oLT5vYmpfaW5zdC5idHNfbnIsIGZvaC0+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+YnRzLCBmb2gtPmRhdGEsIG9oLT5sZW5ndGgtc2l6ZW9mKCpmb2gpKTsKKworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfRVZFTlRfVFlQRSkpCisJCURFQlVHUEMoRE5NLCAiVHlwZT0lcyAiLCBldmVudF90eXBlX25hbWUoKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX0VWRU5UX1RZUEUpKSk7CisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9TRVZFUklUWSkpCisJCURFQlVHUEMoRE5NLCAiU2V2ZXJpdHk9JXMgIiwgc2V2ZXJpdHlfbmFtZSgqVExWUF9WQUwoJnRwLCBOTV9BVFRfU0VWRVJJVFkpKSk7CisKKwlERUJVR1BDKEROTSwgIlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhYmlzX25tX3Jjdm1zZ19yZXBvcnQoc3RydWN0IG1zZ2IgKm1iKQoreworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaCA9IG1zZ2JfbDMobWIpOworCXVfaW50OF90IG10ID0gZm9oLT5tc2dfdHlwZTsKKworCWRlYnVncF9mb2goZm9oKTsKKworCS8vbm1oLT5jZmctPnJlcG9ydF9jYihtYiwgZm9oKTsKKworCXN3aXRjaCAobXQpIHsKKwljYXNlIE5NX01UX1NUQVRFQ0hHX0VWRU5UX1JFUDoKKwkJcmV0dXJuIGFiaXNfbm1fcnhfc3RhdGVjaGdfcmVwKG1iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9TV19BQ1RJVkFURURfUkVQOgorCQlERUJVR1BDKEROTSwgIlNvZnR3YXJlIEFjdGl2YXRlZCBSZXBvcnRcbiIpOworCQlkaXNwYXRjaF9zaWduYWwoU1NfTk0sIFNfTk1fU1dfQUNUSVZfUkVQLCBtYik7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfRkFJTFVSRV9FVkVOVF9SRVA6CisJCXJ4X2ZhaWxfZXZ0X3JlcChtYik7CisJCWRpc3BhdGNoX3NpZ25hbChTU19OTSwgU19OTV9GQUlMX1JFUCwgbWIpOworCQlicmVhazsKKwljYXNlIE5NX01UX1RFU1RfUkVQOgorCQlERUJVR1BDKEROTSwgIlRlc3QgUmVwb3J0XG4iKTsKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX05NLCBTX05NX1RFU1RfUkVQLCBtYik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUEMoRE5NLCAicmVwb3J0aW5nIE5NIE1UIDB4JTAyeFxuIiwgbXQpOworCQlicmVhazsKKwkJCisJfTsKKworCXJldHVybiAwOworfQorCisvKiBBY3RpdmF0ZSB0aGUgc3BlY2lmaWVkIHNvZnR3YXJlIGludG8gdGhlIEJUUyAqLworc3RhdGljIGludCBpcGFjY19zd19hY3RpdmF0ZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsIHVfaW50OF90IGkwLCB1X2ludDhfdCBpMSwKKwkJCSAgICAgdV9pbnQ4X3QgaTIsIGNvbnN0IHVfaW50OF90ICpzd19kZXNjLCB1X2ludDhfdCBzd2Rlc2NfbGVuKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwl1X2ludDhfdCBsZW4gPSBzd2Rlc2NfbGVuOworCXVfaW50OF90ICp0cmFpbGVyOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgbGVuLCBOTV9NVF9BQ1RJVkFURV9TVywgb2JqX2NsYXNzLCBpMCwgaTEsIGkyKTsKKworCXRyYWlsZXIgPSBtc2diX3B1dChtc2csIHN3ZGVzY19sZW4pOworCW1lbWNweSh0cmFpbGVyLCBzd19kZXNjLCBzd2Rlc2NfbGVuKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitzdGF0aWMgaW50IGFiaXNfbm1fcGFyc2Vfc3dfZGVzY3IoY29uc3QgdV9pbnQ4X3QgKnN3X2Rlc2NyLCBpbnQgc3dfZGVzY3JfbGVuKQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgdGx2X2RlZmluaXRpb24gc3dfZGVzY3JfZGVmID0geworCQkuZGVmID0geworCQkJW05NX0FUVF9GSUxFX0lEXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCB9LAorCQkJW05NX0FUVF9GSUxFX1ZFUlNJT05dID0JCXsgVExWX1RZUEVfVEwxNlYsIH0sCisJCX0sCisJfTsKKworCXVfaW50OF90IHRhZzsKKwl1X2ludDE2X3QgdGFnX2xlbjsKKwljb25zdCB1X2ludDhfdCAqdmFsOworCWludCBvZnMgPSAwLCBsZW47CisKKwkvKiBDbGFzc2ljIFRMViBwYXJzaW5nIGRvZXNuJ3Qgd29yayB3ZWxsIHdpdGggU1dfREVTQ1IgYmVjYXVzZSBvZiBpdCdzCisJICogbmVzdGVkIG5hdHVyZSBhbmQgdGhlIGZhY3QgeW91IGhhdmUgdG8gYXNzdW1lIGl0IGNvbnRhaW5zIG9ubHkgdHdvIHN1YgorCSAqIHRhZ3MgTk1fQVRUX0ZJTEVfVkVSU0lPTiAmIE5NX0FUVF9GSUxFX0lEIHRvIHBhcnNlIGl0ICovCisKKwlpZiAoc3dfZGVzY3JbMF0gIT0gTk1fQVRUX1NXX0RFU0NSKSB7CisJCURFQlVHUChETk0sICJTV19ERVNDUiBhdHRyaWJ1dGUgaWRlbnRpZmllciBub3QgZm91bmQhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlvZnMgKz0gMTsKKworCWxlbiA9IHRsdl9wYXJzZV9vbmUoJnRhZywgJnRhZ19sZW4sICZ2YWwsCisJCSZzd19kZXNjcl9kZWYsICZzd19kZXNjcltvZnNdLCBzd19kZXNjcl9sZW4tb2ZzKTsKKwlpZiAobGVuIDwgMCB8fCAodGFnICE9IE5NX0FUVF9GSUxFX0lEKSkgeworCQlERUJVR1AoRE5NLCAiRklMRV9JRCBhdHRyaWJ1dGUgaWRlbnRpZmllciBub3QgZm91bmQhXG4iKTsKKwkJcmV0dXJuIC0yOworCX0KKwlvZnMgKz0gbGVuOworCisJbGVuID0gdGx2X3BhcnNlX29uZSgmdGFnLCAmdGFnX2xlbiwgJnZhbCwKKwkJJnN3X2Rlc2NyX2RlZiwgJnN3X2Rlc2NyW29mc10sIHN3X2Rlc2NyX2xlbi1vZnMpOworCWlmIChsZW4gPCAwIHx8ICh0YWcgIT0gTk1fQVRUX0ZJTEVfVkVSU0lPTikpIHsKKwkJREVCVUdQKEROTSwgIkZJTEVfVkVSU0lPTiBhdHRyaWJ1dGUgaWRlbnRpZmllciBub3QgZm91bmQhXG4iKTsKKwkJcmV0dXJuIC0zOworCX0KKwlvZnMgKz0gbGVuOworCisJcmV0dXJuIG9mczsKK30KKworc3RhdGljIGludCBhYmlzX25tX3J4X3N3X2FjdF9yZXEoc3RydWN0IG1zZ2IgKm1iKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2ggPSBtc2diX2wyKG1iKTsKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2ggPSBtc2diX2wzKG1iKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwljb25zdCB1X2ludDhfdCAqc3dfY29uZmlnOworCWludCByZXQsIHN3X2NvbmZpZ19sZW4sIHN3X2Rlc2NyX2xlbjsKKworCWRlYnVncF9mb2goZm9oKTsKKworCURFQlVHUEMoRE5NLCAiU1cgQWN0aXZhdGUgUmVxdWVzdDogIik7CisKKwlERUJVR1AoRE5NLCAiU29mdHdhcmUgQWN0aXZhdGUgUmVxdWVzdCwgQUNLaW5nIGFuZCBBY3RpdmF0aW5nXG4iKTsKKworCXJldCA9IGFiaXNfbm1fc3dfYWN0X3JlcV9hY2sobWItPnRyeC0+YnRzLCBmb2gtPm9ial9jbGFzcywKKwkJCQkgICAgICBmb2gtPm9ial9pbnN0LmJ0c19uciwKKwkJCQkgICAgICBmb2gtPm9ial9pbnN0LnRyeF9uciwKKwkJCQkgICAgICBmb2gtPm9ial9pbnN0LnRzX25yLCAwLAorCQkJCSAgICAgIGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCisJYWJpc19ubV90bHZfcGFyc2UoJnRwLCBtYi0+dHJ4LT5idHMsIGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCXN3X2NvbmZpZyA9IFRMVlBfVkFMKCZ0cCwgTk1fQVRUX1NXX0NPTkZJRyk7CisJc3dfY29uZmlnX2xlbiA9IFRMVlBfTEVOKCZ0cCwgTk1fQVRUX1NXX0NPTkZJRyk7CisJaWYgKCFUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfU1dfQ09ORklHKSkgeworCQlERUJVR1AoRE5NLCAiU1cgY29uZmlnIG5vdCBmb3VuZCEgQ2FuJ3QgY29udGludWUuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJREVCVUdQKEROTSwgIkZvdW5kIFNXIGNvbmZpZzogJXNcbiIsIGhleGR1bXAoc3dfY29uZmlnLCBzd19jb25maWdfbGVuKSk7CisJfQorCisJCS8qIFVzZSB0aGUgZmlyc3QgU1dfREVTQ1IgcHJlc2VudCBpbiBTVyBjb25maWcgKi8KKwlzd19kZXNjcl9sZW4gPSBhYmlzX25tX3BhcnNlX3N3X2Rlc2NyKHN3X2NvbmZpZywgc3dfY29uZmlnX2xlbik7CisJaWYgKHN3X2Rlc2NyX2xlbiA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGlwYWNjX3N3X2FjdGl2YXRlKG1iLT50cngtPmJ0cywgZm9oLT5vYmpfY2xhc3MsCisJCQkJIGZvaC0+b2JqX2luc3QuYnRzX25yLAorCQkJCSBmb2gtPm9ial9pbnN0LnRyeF9uciwKKwkJCQkgZm9oLT5vYmpfaW5zdC50c19uciwKKwkJCQkgc3dfY29uZmlnLCBzd19kZXNjcl9sZW4pOworfQorCisvKiBSZWNlaXZlIGEgQ0hBTkdFX0FETV9TVEFURV9BQ0ssIHBhcnNlIHRoZSBUTFYgYW5kIHVwZGF0ZSBsb2NhbCBzdGF0ZSAqLworc3RhdGljIGludCBhYmlzX25tX3J4X2NoZ19hZG1fc3RhdGVfYWNrKHN0cnVjdCBtc2diICptYikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oID0gbXNnYl9sMihtYik7CisJc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oID0gbXNnYl9sMyhtYik7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJdV9pbnQ4X3QgYWRtX3N0YXRlOworCisJYWJpc19ubV90bHZfcGFyc2UoJnRwLCBtYi0+dHJ4LT5idHMsIGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCWlmICghVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX0FETV9TVEFURSkpCisJCXJldHVybiAtRUlOVkFMOworCisJYWRtX3N0YXRlID0gKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX0FETV9TVEFURSk7CisKKwlyZXR1cm4gdXBkYXRlX2FkbXN0YXRlKG1iLT50cngtPmJ0cywgZm9oLT5vYmpfY2xhc3MsICZmb2gtPm9ial9pbnN0LCBhZG1fc3RhdGUpOworfQorCitzdGF0aWMgaW50IGFiaXNfbm1fcnhfbG10X2V2ZW50KHN0cnVjdCBtc2diICptYikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oID0gbXNnYl9sMihtYik7CisJc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oID0gbXNnYl9sMyhtYik7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisKKwlERUJVR1AoRE5NLCAiTE1UIEV2ZW50ICIpOworCWFiaXNfbm1fdGx2X3BhcnNlKCZ0cCwgbWItPnRyeC0+YnRzLCBmb2gtPmRhdGEsIG9oLT5sZW5ndGgtc2l6ZW9mKCpmb2gpKTsKKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX0JTMTFfTE1UX0xPR09OX1NFU1NJT04pICYmCisJICAgIFRMVlBfTEVOKCZ0cCwgTk1fQVRUX0JTMTFfTE1UX0xPR09OX1NFU1NJT04pID49IDEpIHsKKwkJdV9pbnQ4X3Qgb25vZmYgPSAqVExWUF9WQUwoJnRwLCBOTV9BVFRfQlMxMV9MTVRfTE9HT05fU0VTU0lPTik7CisJCURFQlVHUEMoRE5NLCAiTE9HJXMgIiwgb25vZmYgPyAiT04iIDogIk9GRiIpOworCX0KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX0JTMTFfTE1UX1VTRVJfQUNDX0xFVikgJiYKKwkgICAgVExWUF9MRU4oJnRwLCBOTV9BVFRfQlMxMV9MTVRfVVNFUl9BQ0NfTEVWKSA+PSAxKSB7CisJCXVfaW50OF90IGxldmVsID0gKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX0JTMTFfTE1UX1VTRVJfQUNDX0xFVik7CisJCURFQlVHUEMoRE5NLCAiTGV2ZWw9JXUgIiwgbGV2ZWwpOworCX0KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX0JTMTFfTE1UX1VTRVJfTkFNRSkgJiYKKwkgICAgVExWUF9MRU4oJnRwLCBOTV9BVFRfQlMxMV9MTVRfVVNFUl9OQU1FKSA+PSAxKSB7CisJCWNoYXIgKm5hbWUgPSAoY2hhciAqKSBUTFZQX1ZBTCgmdHAsIE5NX0FUVF9CUzExX0xNVF9VU0VSX05BTUUpOworCQlERUJVR1BDKEROTSwgIlVzZXJuYW1lPSVzICIsIG5hbWUpOworCX0KKwlERUJVR1BDKEROTSwgIlxuIik7CisJLyogRklYTUU6IHBhcnNlIExNVCBMT0dPTiBUSU1FICovCisJcmV0dXJuIDA7Cit9CisKKy8qIFJlY2VpdmUgYSBPTUwgTk0gTWVzc2FnZSBmcm9tIEJUUyAqLworc3RhdGljIGludCBhYmlzX25tX3Jjdm1zZ19mb20oc3RydWN0IG1zZ2IgKm1iKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2ggPSBtc2diX2wyKG1iKTsKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2ggPSBtc2diX2wzKG1iKTsKKwl1X2ludDhfdCBtdCA9IGZvaC0+bXNnX3R5cGU7CisKKwkvKiBjaGVjayBmb3IgdW5zb2xpY2l0ZWQgbWVzc2FnZSAqLworCWlmIChpc19yZXBvcnQobXQpKQorCQlyZXR1cm4gYWJpc19ubV9yY3Ztc2dfcmVwb3J0KG1iKTsKKworCWlmIChpc19pbl9hcnIobXQsIHN3X2xvYWRfbXNncywgQVJSQVlfU0laRShzd19sb2FkX21zZ3MpKSkKKwkJcmV0dXJuIGFiaXNfbm1fcmN2bXNnX3N3KG1iKTsKKworCWlmIChpc19pbl9hcnIobXQsIG5hY2tzLCBBUlJBWV9TSVpFKG5hY2tzKSkpIHsKKwkJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisKKwkJZGVidWdwX2ZvaChmb2gpOworCisJCURFQlVHUEMoRE5NLCAiJXMgTkFDSyAiLCBnZXRfdmFsdWVfc3RyaW5nKG5hY2tfbmFtZXMsIG10KSk7CisKKwkJYWJpc19ubV90bHZfcGFyc2UoJnRwLCBtYi0+dHJ4LT5idHMsIGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCQlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX05BQ0tfQ0FVU0VTKSkKKwkJCURFQlVHUEMoRE5NLCAiQ0FVU0U9JXNcbiIsCisJCQkJbmFja19jYXVzZV9uYW1lKCpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9OQUNLX0NBVVNFUykpKTsKKwkJZWxzZQorCQkJREVCVUdQQyhETk0sICJcbiIpOworCisJCWRpc3BhdGNoX3NpZ25hbChTU19OTSwgU19OTV9OQUNLLCAodm9pZCopICZtdCk7CisJCXJldHVybiAwOworCX0KKyNpZiAwCisJLyogY2hlY2sgaWYgbGFzdCBtZXNzYWdlIGlzIHRvIGJlIGFja2VkICovCisJaWYgKGlzX2Fja19uYWNrKG5taC0+bGFzdF9tc2d0eXBlKSkgeworCQlpZiAobXQgPT0gTVRfQUNLKG5taC0+bGFzdF9tc2d0eXBlKSkgeworCQkJREVCVUdQKEROTSwgInJlY2VpdmVkIEFDSyAoMHgleClcbiIsIGZvaC0+bXNnX3R5cGUpOworCQkJLyogd2UgZ290IG91ciBBQ0ssIGNvbnRpbnVlIHNlbmRpbmcgdGhlIG5leHQgbXNnICovCisJCX0gZWxzZSBpZiAobXQgPT0gTVRfTkFDSyhubWgtPmxhc3RfbXNndHlwZSkpIHsKKwkJCS8qIHdlIGdvdCBhIE5BQ0ssIHNpZ25hbCB0aGlzIHRvIHRoZSBjYWxsZXIgKi8KKwkJCURFQlVHUChETk0sICJyZWNlaXZlZCBOQUNLICgweCV4KVxuIiwgZm9oLT5tc2dfdHlwZSk7CisJCQkvKiBGSVhNRTogc29tZWhvdyBzaWduYWwgdGhpcyB0byB0aGUgY2FsbGVyICovCisJCX0gZWxzZSB7CisJCQkvKiByZWFsbHkgc3RyYW5nZSB0aGluZ3MgaGFwcGVuICovCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKyNlbmRpZgorCisJc3dpdGNoIChtdCkgeworCWNhc2UgTk1fTVRfQ0hHX0FETV9TVEFURV9BQ0s6CisJCXJldHVybiBhYmlzX25tX3J4X2NoZ19hZG1fc3RhdGVfYWNrKG1iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9TV19BQ1RfUkVROgorCQlyZXR1cm4gYWJpc19ubV9yeF9zd19hY3RfcmVxKG1iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9CUzExX0xNVF9TRVNTSU9OOgorCQlyZXR1cm4gYWJpc19ubV9yeF9sbXRfZXZlbnQobWIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0NPTk5fTURST1BfTElOS19BQ0s6CisJCURFQlVHUChETk0sICJDT05OIE1EUk9QIExJTksgQUNLXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9JUEFDQ19SRVNUQVJUX0FDSzoKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX05NLCBTX05NX0lQQUNDX1JFU1RBUlRfQUNLLCBOVUxMKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9JUEFDQ19SRVNUQVJUX05BQ0s6CisJCWRpc3BhdGNoX3NpZ25hbChTU19OTSwgU19OTV9JUEFDQ19SRVNUQVJUX05BQ0ssIE5VTEwpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhYmlzX25tX3J4X2lwYWNjKHN0cnVjdCBtc2diICptYik7CisKK3N0YXRpYyBpbnQgYWJpc19ubV9yY3Ztc2dfbWFudWYoc3RydWN0IG1zZ2IgKm1iKQoreworCWludCByYzsKKwlpbnQgYnRzX3R5cGUgPSBtYi0+dHJ4LT5idHMtPnR5cGU7CisKKwlzd2l0Y2ggKGJ0c190eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfTkFOT0JUUzoKKwkJcmMgPSBhYmlzX25tX3J4X2lwYWNjKG1iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJkb24ndCBrbm93IGhvdyB0byBwYXJzZSBPTUwgZm9yIHRoaXMgIgorCQkgICAgICJCVFMgdHlwZSAoJXUpXG4iLCBidHNfdHlwZSk7CisJCXJjID0gMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKiBIaWdoLUxldmVsIEFQSSAqLworLyogRW50cnktcG9pbnQgd2hlcmUgTDIgT01MIGZyb20gQlRTIGVudGVycyB0aGUgTk0gY29kZSAqLworaW50IGFiaXNfbm1fcmN2bXNnKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaCA9IG1zZ2JfbDIobXNnKTsKKwlpbnQgcmMgPSAwOworCisJLyogVmFyaW91cyBjb25zaXN0ZW5jeSBjaGVja3MgKi8KKwlpZiAob2gtPnBsYWNlbWVudCAhPSBBQklTX09NX1BMQUNFTUVOVF9PTkxZKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiQUJJUyBPTUwgcGxhY2VtZW50IDB4JXggbm90IHN1cHBvcnRlZFxuIiwKKwkJCW9oLT5wbGFjZW1lbnQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKG9oLT5zZXF1ZW5jZSAhPSAwKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiQUJJUyBPTUwgc2VxdWVuY2UgMHgleCAhPSAweDAwXG4iLAorCQkJb2gtPnNlcXVlbmNlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorI2lmIDAKKwl1bnNpZ25lZCBpbnQgbDJfbGVuID0gbXNnLT50YWlsIC0gKHVfaW50OF90ICopbXNnYl9sMihtc2cpOworCXVuc2lnbmVkIGludCBobGVuID0gc2l6ZW9mKCpvaCkgKyBzaXplb2Yoc3RydWN0IGFiaXNfb21fZm9tX2hkcik7CisJaWYgKG9oLT5sZW5ndGggKyBobGVuID4gbDJfbGVuKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiQUJJUyBPTUwgdHJ1bmNhdGVkIG1lc3NhZ2UgKCV1ID4gJXUpXG4iLAorCQkJb2gtPmxlbmd0aCArIHNpemVvZigqb2gpLCBsMl9sZW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKG9oLT5sZW5ndGggKyBobGVuIDwgbDJfbGVuKQorCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIkFCSVMgT01MIG1lc3NhZ2Ugd2l0aCBleHRyYSB0cmFpbGVyPyE/IChvaC0+bGVuPSVkLCBzaXplb2Zfb2g9JWQgbDJfbGVuPSVkXG4iLCBvaC0+bGVuZ3RoLCBzaXplb2YoKm9oKSwgbDJfbGVuKTsKKyNlbmRpZgorCW1zZy0+bDNoID0gKHVuc2lnbmVkIGNoYXIgKilvaCArIHNpemVvZigqb2gpOworCisJc3dpdGNoIChvaC0+bWRpc2MpIHsKKwljYXNlIEFCSVNfT01fTURJU0NfRk9NOgorCQlyYyA9IGFiaXNfbm1fcmN2bXNnX2ZvbShtc2cpOworCQlicmVhazsKKwljYXNlIEFCSVNfT01fTURJU0NfTUFOVUY6CisJCXJjID0gYWJpc19ubV9yY3Ztc2dfbWFudWYobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBBQklTX09NX01ESVNDX01NSToKKwljYXNlIEFCSVNfT01fTURJU0NfVFJBVToKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJ1bmltcGxlbWVudGVkIEFCSVMgT01MIG1lc3NhZ2UgZGlzY3JpbWluYXRvciAweCV4XG4iLAorCQkJb2gtPm1kaXNjKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJ1bmtub3duIEFCSVMgT01MIG1lc3NhZ2UgZGlzY3JpbWluYXRvciAweCV4XG4iLAorCQkJb2gtPm1kaXNjKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXNnYl9mcmVlKG1zZyk7CisJcmV0dXJuIHJjOworfQorCisjaWYgMAorLyogaW5pdGlhbGl6ZWQgYWxsIHJlc291cmNlcyAqLworc3RydWN0IGFiaXNfbm1faCAqYWJpc19ubV9pbml0KHN0cnVjdCBhYmlzX25tX2NmZyAqY2ZnKQoreworCXN0cnVjdCBhYmlzX25tX2ggKm5taDsKKworCW5taCA9IG1hbGxvYyhzaXplb2YoKm5taCkpOworCWlmICghbm1oKQorCQlyZXR1cm4gTlVMTDsKKworCW5taC0+Y2ZnID0gY2ZnOworCisJcmV0dXJuIG5taDsKK30KKworLyogZnJlZSBhbGwgcmVzb3VyY2VzICovCit2b2lkIGFiaXNfbm1fZmluaShzdHJ1Y3QgYWJpc19ubV9oICpubWgpCit7CisJZnJlZShubWgpOworfQorI2VuZGlmCisKKy8qIEhlcmUgd2UgYXJlIHRyeWluZyB0byBkZWZpbmUgYSBoaWdoLWxldmVsIEFQSSB0aGF0IGNhbiBiZSB1c2VkIGJ5CisgKiB0aGUgYWN0dWFsIEJTQyBpbXBsZW1lbnRhdGlvbi4gIEhvd2V2ZXIsIHRoZSBhcmNoaXRlY3R1cmUgaXMgY3VycmVudGx5CisgKiBzdGlsbCB1bmRlciBkZXNpZ24uICBJZGVhbGx5IHRoZSBjYWxscyB0byB0aGlzIEFQSSB3b3VsZCBiZSBzeW5jaHJvbm91cywKKyAqIHdoaWxlIHRoZSB1bmRlcmx5aW5nIHN0YWNrIGJlaGluZCB0aGUgQVBpIHJ1bnMgaW4gYSB0cmFkaXRpb25hbCBzZWxlY3QKKyAqIGJhc2VkIHN0YXRlIG1hY2hpbmUuCisgKi8KKworLyogNi4yIFNvZnR3YXJlIExvYWQ6ICovCitlbnVtIHN3X3N0YXRlIHsKKwlTV19TVEFURV9OT05FLAorCVNXX1NUQVRFX1dBSVRfSU5JVEFDSywKKwlTV19TVEFURV9XQUlUX1NFR0FDSywKKwlTV19TVEFURV9XQUlUX0VOREFDSywKKwlTV19TVEFURV9XQUlUX0FDVEFDSywKKwlTV19TVEFURV9FUlJPUiwKK307CisKK3N0cnVjdCBhYmlzX25tX3N3IHsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCWdzbV9jYmZuICpjYmZuOworCXZvaWQgKmNiX2RhdGE7CisJaW50IGZvcmNlZDsKKworCS8qIHRoaXMgd2lsbCBiZWNvbWUgcGFydCBvZiB0aGUgU1cgTE9BRCBJTklUSUFURSAqLworCXVfaW50OF90IG9ial9jbGFzczsKKwl1X2ludDhfdCBvYmpfaW5zdGFuY2VbM107CisKKwl1X2ludDhfdCBmaWxlX2lkWzI1NV07CisJdV9pbnQ4X3QgZmlsZV9pZF9sZW47CisKKwl1X2ludDhfdCBmaWxlX3ZlcnNpb25bMjU1XTsKKwl1X2ludDhfdCBmaWxlX3ZlcnNpb25fbGVuOworCisJdV9pbnQ4X3Qgd2luZG93X3NpemU7CisJdV9pbnQ4X3Qgc2VnX2luX3dpbmRvdzsKKworCWludCBmZDsKKwlGSUxFICpzdHJlYW07CisJZW51bSBzd19zdGF0ZSBzdGF0ZTsKKwlpbnQgbGFzdF9zZWc7Cit9OworCitzdGF0aWMgc3RydWN0IGFiaXNfbm1fc3cgZ19zdzsKKworc3RhdGljIHZvaWQgc3dfYWRkX2ZpbGVfaWRfYW5kX3ZlcihzdHJ1Y3QgYWJpc19ubV9zdyAqc3csIHN0cnVjdCBtc2diICptc2cpCit7CisJaWYgKHN3LT5idHMtPnR5cGUgPT0gR1NNX0JUU19UWVBFX05BTk9CVFMpIHsKKwkJbXNnYl92X3B1dChtc2csIE5NX0FUVF9TV19ERVNDUik7CisJCW1zZ2JfdGwxNnZfcHV0KG1zZywgTk1fQVRUX0ZJTEVfSUQsIHN3LT5maWxlX2lkX2xlbiwgc3ctPmZpbGVfaWQpOworCQltc2diX3RsMTZ2X3B1dChtc2csIE5NX0FUVF9GSUxFX1ZFUlNJT04sIHN3LT5maWxlX3ZlcnNpb25fbGVuLAorCQkJICAgICAgIHN3LT5maWxlX3ZlcnNpb24pOworCX0gZWxzZSBpZiAoc3ctPmJ0cy0+dHlwZSA9PSBHU01fQlRTX1RZUEVfQlMxMSkgeworCQltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfRklMRV9JRCwgc3ctPmZpbGVfaWRfbGVuLCBzdy0+ZmlsZV9pZCk7CisJCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9GSUxFX1ZFUlNJT04sIHN3LT5maWxlX3ZlcnNpb25fbGVuLAorCQkJICAgICBzdy0+ZmlsZV92ZXJzaW9uKTsKKwl9IGVsc2UgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlBsZWFzZSBpbXBsZW1lbnQgdGhpcyBmb3IgdGhlIEJUUy5cbiIpOworCX0KK30KKworLyogNi4yLjEgLyA4LjMuMTogTG9hZCBEYXRhIEluaXRpYXRlICovCitzdGF0aWMgaW50IHN3X2xvYWRfaW5pdChzdHJ1Y3QgYWJpc19ubV9zdyAqc3cpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90IGxlbiA9IDMqMiArIHN3LT5maWxlX2lkX2xlbiArIHN3LT5maWxlX3ZlcnNpb25fbGVuOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgbGVuLCBOTV9NVF9MT0FEX0lOSVQsIHN3LT5vYmpfY2xhc3MsCisJCQlzdy0+b2JqX2luc3RhbmNlWzBdLCBzdy0+b2JqX2luc3RhbmNlWzFdLAorCQkJc3ctPm9ial9pbnN0YW5jZVsyXSk7CisKKwlzd19hZGRfZmlsZV9pZF9hbmRfdmVyKHN3LCBtc2cpOworCW1zZ2JfdHZfcHV0KG1zZywgTk1fQVRUX1dJTkRPV19TSVpFLCBzdy0+d2luZG93X3NpemUpOworCQorCXJldHVybiBhYmlzX25tX3NlbmRtc2coc3ctPmJ0cywgbXNnKTsKK30KKworc3RhdGljIGludCBpc19sYXN0X2xpbmUoRklMRSAqc3RyZWFtKQoreworCWNoYXIgbmV4dF9zZWdfYnVmWzI1Nl07CisJbG9uZyBwb3M7CisKKwkvKiBjaGVjayBpZiB3ZSdyZSBzZW5kaW5nIHRoZSBsYXN0IGxpbmUgKi8KKwlwb3MgPSBmdGVsbChzdHJlYW0pOworCWlmICghZmdldHMobmV4dF9zZWdfYnVmLCBzaXplb2YobmV4dF9zZWdfYnVmKS0yLCBzdHJlYW0pKSB7CisJCWZzZWVrKHN0cmVhbSwgcG9zLCBTRUVLX1NFVCk7CisJCXJldHVybiAxOworCX0KKworCWZzZWVrKHN0cmVhbSwgcG9zLCBTRUVLX1NFVCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIDYuMi4yIC8gOC4zLjIgTG9hZCBEYXRhIFNlZ21lbnQgKi8KK3N0YXRpYyBpbnQgc3dfbG9hZF9zZWdtZW50KHN0cnVjdCBhYmlzX25tX3N3ICpzdykKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJY2hhciBzZWdfYnVmWzI1Nl07CisJY2hhciAqbGluZV9idWYgPSBzZWdfYnVmKzI7CisJdW5zaWduZWQgY2hhciAqdGx2OworCXVfaW50OF90IGxlbjsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKworCXN3aXRjaCAoc3ctPmJ0cy0+dHlwZSkgeworCWNhc2UgR1NNX0JUU19UWVBFX0JTMTE6CisJCWlmIChmZ2V0cyhsaW5lX2J1Ziwgc2l6ZW9mKHNlZ19idWYpLTIsIHN3LT5zdHJlYW0pID09IE5VTEwpIHsKKwkJCXBlcnJvcigiZmdldHMgcmVhZGluZyBzZWdtZW50Iik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlzZWdfYnVmWzBdID0gMHgwMDsKKworCQkvKiBjaGVjayBpZiB3ZSdyZSBzZW5kaW5nIHRoZSBsYXN0IGxpbmUgKi8KKwkJc3ctPmxhc3Rfc2VnID0gaXNfbGFzdF9saW5lKHN3LT5zdHJlYW0pOworCQlpZiAoc3ctPmxhc3Rfc2VnKQorCQkJc2VnX2J1ZlsxXSA9IDA7CisJCWVsc2UKKwkJCXNlZ19idWZbMV0gPSAxICsgc3ctPnNlZ19pbl93aW5kb3crKzsKKworCQlsZW4gPSBzdHJsZW4obGluZV9idWYpICsgMjsKKwkJdGx2ID0gbXNnYl9wdXQobXNnLCBUTFZfR1JPU1NfTEVOKGxlbikpOworCQl0bHZfcHV0KHRsdiwgTk1fQVRUX0JTMTFfRklMRV9EQVRBLCBsZW4sICh1X2ludDhfdCAqKXNlZ19idWYpOworCQkvKiBCUzExIHdhbnRzIENSICsgTEYgaW4gZXhjZXNzIG9mIHRoZSBUTFYgbGVuZ3RoICE/ISAqLworCQl0bHZbMV0gLT0gMjsKKworCQkvKiB3ZSBvbmx5IG5vdyBrbm93IHRoZSBleGFjdCBsZW5ndGggZm9yIHRoZSBPTSBoZHIgKi8KKwkJbGVuID0gc3RybGVuKGxpbmVfYnVmKSsyOworCQlicmVhazsKKwljYXNlIEdTTV9CVFNfVFlQRV9OQU5PQlRTOiB7CisJCXN0YXRpY19hc3NlcnQoc2l6ZW9mKHNlZ19idWYpID49IElQQUNDX1NFR01FTlRfU0laRSwgYnVmZmVyX2JpZ19lbm91Z2gpOworCQlsZW4gPSByZWFkKHN3LT5mZCwgJnNlZ19idWYsIElQQUNDX1NFR01FTlRfU0laRSk7CisJCWlmIChsZW4gPCAwKSB7CisJCQlwZXJyb3IoInJlYWQgZmFpbGVkIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChsZW4gIT0gSVBBQ0NfU0VHTUVOVF9TSVpFKQorCQkJc3ctPmxhc3Rfc2VnID0gMTsKKworCQkrK3N3LT5zZWdfaW5fd2luZG93OworCQltc2diX3RsMTZ2X3B1dChtc2csIE5NX0FUVF9JUEFDQ19GSUxFX0RBVEEsIGxlbiwgKGNvbnN0IHVfaW50OF90ICopIHNlZ19idWYpOworCQlsZW4gKz0gMzsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAic3dfbG9hZF9zZWdtZW50IG5lZWRzIGltcGxlbWVudGF0aW9uIGZvciB0aGUgQlRTLlxuIik7CisJCS8qIEZJWE1FOiBPdGhlciBCVFMgdHlwZXMgKi8KKwkJcmV0dXJuIC0xOworCX0KKworCWZpbGxfb21fZm9tX2hkcihvaCwgbGVuLCBOTV9NVF9MT0FEX1NFRywgc3ctPm9ial9jbGFzcywKKwkJCXN3LT5vYmpfaW5zdGFuY2VbMF0sIHN3LT5vYmpfaW5zdGFuY2VbMV0sCisJCQlzdy0+b2JqX2luc3RhbmNlWzJdKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coc3ctPmJ0cywgbXNnKTsKK30KKworLyogNi4yLjQgLyA4LjMuNCBMb2FkIERhdGEgRW5kICovCitzdGF0aWMgaW50IHN3X2xvYWRfZW5kKHN0cnVjdCBhYmlzX25tX3N3ICpzdykKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgbGVuID0gMioyICsgc3ctPmZpbGVfaWRfbGVuICsgc3ctPmZpbGVfdmVyc2lvbl9sZW47CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBsZW4sIE5NX01UX0xPQURfRU5ELCBzdy0+b2JqX2NsYXNzLAorCQkJc3ctPm9ial9pbnN0YW5jZVswXSwgc3ctPm9ial9pbnN0YW5jZVsxXSwKKwkJCXN3LT5vYmpfaW5zdGFuY2VbMl0pOworCisJc3dfYWRkX2ZpbGVfaWRfYW5kX3ZlcihzdywgbXNnKTsKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKHN3LT5idHMsIG1zZyk7Cit9CisKKy8qIEFjdGl2YXRlIHRoZSBzcGVjaWZpZWQgc29mdHdhcmUgaW50byB0aGUgQlRTICovCitzdGF0aWMgaW50IHN3X2FjdGl2YXRlKHN0cnVjdCBhYmlzX25tX3N3ICpzdykKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgbGVuID0gMioyICsgc3ctPmZpbGVfaWRfbGVuICsgc3ctPmZpbGVfdmVyc2lvbl9sZW47CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBsZW4sIE5NX01UX0FDVElWQVRFX1NXLCBzdy0+b2JqX2NsYXNzLAorCQkJc3ctPm9ial9pbnN0YW5jZVswXSwgc3ctPm9ial9pbnN0YW5jZVsxXSwKKwkJCXN3LT5vYmpfaW5zdGFuY2VbMl0pOworCisJLyogRklYTUU6IHRoaXMgaXMgQlMxMSBzcGVjaWZpYyBmb3JtYXQgKi8KKwltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfRklMRV9JRCwgc3ctPmZpbGVfaWRfbGVuLCBzdy0+ZmlsZV9pZCk7CisJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0ZJTEVfVkVSU0lPTiwgc3ctPmZpbGVfdmVyc2lvbl9sZW4sCisJCSAgICAgc3ctPmZpbGVfdmVyc2lvbik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKHN3LT5idHMsIG1zZyk7Cit9CisKK3N0cnVjdCBzZHBfZmlybXdhcmUgeworCWNoYXIgbWFnaWNbNF07CisJY2hhciBtb3JlX21hZ2ljWzRdOworCXVuc2lnbmVkIGludCBoZWFkZXJfbGVuZ3RoOworCXVuc2lnbmVkIGludCBmaWxlX2xlbmd0aDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdGF0aWMgaW50IHBhcnNlX3NkcF9oZWFkZXIoc3RydWN0IGFiaXNfbm1fc3cgKnN3KQoreworCXN0cnVjdCBzZHBfZmlybXdhcmUgZmlybXdhcmVfaGVhZGVyOworCWludCByYzsKKwlzdHJ1Y3Qgc3RhdCBzdGF0OworCisJcmMgPSByZWFkKHN3LT5mZCwgJmZpcm13YXJlX2hlYWRlciwgc2l6ZW9mKGZpcm13YXJlX2hlYWRlcikpOworCWlmIChyYyAhPSBzaXplb2YoZmlybXdhcmVfaGVhZGVyKSkgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIkNvdWxkIG5vdCByZWFkIFNEUCBmaWxlIGhlYWRlci5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHN0cm5jbXAoZmlybXdhcmVfaGVhZGVyLm1hZ2ljLCAiIFNEUCIsIDQpICE9IDApIHsKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJUaGUgbWFnaWMgbnVtYmVyMSBpcyB3cm9uZy5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGZpcm13YXJlX2hlYWRlci5tb3JlX21hZ2ljWzBdICE9IDB4MTAgfHwKKwkgICAgZmlybXdhcmVfaGVhZGVyLm1vcmVfbWFnaWNbMV0gIT0gMHgwMiB8fAorCSAgICBmaXJtd2FyZV9oZWFkZXIubW9yZV9tYWdpY1syXSAhPSAweDAwIHx8CisJICAgIGZpcm13YXJlX2hlYWRlci5tb3JlX21hZ2ljWzNdICE9IDB4MDApIHsKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJUaGUgbW9yZSBtYWdpYyBudW1iZXIgaXMgd3JvbmcuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCisJaWYgKGZzdGF0KHN3LT5mZCwgJnN0YXQpID09IC0xKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiQ291bGQgbm90IHN0YXQgdGhlIGZpbGUuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChudG9obChmaXJtd2FyZV9oZWFkZXIuZmlsZV9sZW5ndGgpICE9IHN0YXQuc3Rfc2l6ZSkgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlRoZSBmaWxlc2l6ZXMgZG8gbm90IG1hdGNoLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBnbyBiYWNrIHRvIHRoZSBzdGFydCBhcyB3ZSBjaGVja2VkIHRoZSB3aG9sZSBmaWxlc2l6ZS4uICovCisJbHNlZWsoc3ctPmZkLCAwbCwgU0VFS19TRVQpOworCUxPR1AoRE5NLCBMT0dMX05PVElDRSwgIlRoZSBpcGFjY2VzcyBTRFAgaGVhZGVyIGlzIG5vdCBmdWxseSB1bmRlcnN0b29kLlxuIgorCQkJICAgICAgICJUaGVyZSBtaWdodCBiZSBjaGVja3N1bXMgaW4gdGhlIGZpbGUgdGhhdCBhcmUgbm90XG4iCisJCQkgICAgICAgInZlcmlmaWVkIGFuZCBpbmNvbXBsZXRlIGZpcm13YXJlIG1pZ2h0IGJlIGZsYXNoZWQuXG4iCisJCQkgICAgICAgIlRoZXJlIGlzIGFic29sdXRlbHkgbm8gV0FSUkFOVFkgdGhhdCBmbGFzaGluZyB3aWxsXG4iCisJCQkgICAgICAgIndvcmsuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzd19vcGVuX2ZpbGUoc3RydWN0IGFiaXNfbm1fc3cgKnN3LCBjb25zdCBjaGFyICpmbmFtZSkKK3sKKwljaGFyIGZpbGVfaWRbMTIrMV07CisJY2hhciBmaWxlX3ZlcnNpb25bODArMV07CisJaW50IHJjOworCisJc3ctPmZkID0gb3BlbihmbmFtZSwgT19SRE9OTFkpOworCWlmIChzdy0+ZmQgPCAwKQorCQlyZXR1cm4gc3ctPmZkOworCisJc3dpdGNoIChzdy0+YnRzLT50eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfQlMxMToKKwkJc3ctPnN0cmVhbSA9IGZkb3Blbihzdy0+ZmQsICJyIik7CisJCWlmICghc3ctPnN0cmVhbSkgeworCQkJcGVycm9yKCJmZG9wZW4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQkvKiByZWFkIGZpcnN0IGxpbmUgYW5kIHBhcnNlIGZpbGUgSUQgYW5kIFZFUlNJT04gKi8KKwkJcmMgPSBmc2NhbmYoc3ctPnN0cmVhbSwgIkAoIyklMTJzOiU4MHNcclxuIiwKKwkJCSAgICBmaWxlX2lkLCBmaWxlX3ZlcnNpb24pOworCQlpZiAocmMgIT0gMikgeworCQkJcGVycm9yKCJwYXJzaW5nIGhlYWRlciBsaW5lIG9mIHNvZnR3YXJlIGZpbGUiKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlzdHJjcHkoKGNoYXIgKilzdy0+ZmlsZV9pZCwgZmlsZV9pZCk7CisJCXN3LT5maWxlX2lkX2xlbiA9IHN0cmxlbihmaWxlX2lkKTsKKwkJc3RyY3B5KChjaGFyICopc3ctPmZpbGVfdmVyc2lvbiwgZmlsZV92ZXJzaW9uKTsKKwkJc3ctPmZpbGVfdmVyc2lvbl9sZW4gPSBzdHJsZW4oZmlsZV92ZXJzaW9uKTsKKwkJLyogcmV3aW5kIHRvIHN0YXJ0IG9mIGZpbGUgKi8KKwkJcmV3aW5kKHN3LT5zdHJlYW0pOworCQlicmVhazsJCisJY2FzZSBHU01fQlRTX1RZUEVfTkFOT0JUUzoKKwkJLyogVE9ETzogZXh0cmFjdCB0aGF0IGZyb20gdGhlIGZpbGVuYW1lIG9yIGNvbnRlbnQgKi8KKwkJcmMgPSBwYXJzZV9zZHBfaGVhZGVyKHN3KTsKKwkJaWYgKHJjIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgcGFyc2UgdGhlIGlwYWNjZXNzIFNEUCBoZWFkZXJcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJc3RyY3B5KChjaGFyICopc3ctPmZpbGVfaWQsICJpZCIpOworCQlzdy0+ZmlsZV9pZF9sZW4gPSAzOworCQlzdHJjcHkoKGNoYXIgKilzdy0+ZmlsZV92ZXJzaW9uLCAidmVyc2lvbiIpOworCQlzdy0+ZmlsZV92ZXJzaW9uX2xlbiA9IDg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIFdlIGRvbid0IGtub3cgaG93IHRvIHRyZWF0IHRoZW0geWV0ICovCisJCWNsb3NlKHN3LT5mZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCQorc3RhdGljIHZvaWQgc3dfY2xvc2VfZmlsZShzdHJ1Y3QgYWJpc19ubV9zdyAqc3cpCit7CisJc3dpdGNoIChzdy0+YnRzLT50eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfQlMxMToKKwkJZmNsb3NlKHN3LT5zdHJlYW0pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQljbG9zZShzdy0+ZmQpOworCQlicmVhazsKKwl9Cit9CisKKy8qIEZpbGwgdGhlIHdpbmRvdyAqLworc3RhdGljIGludCBzd19maWxsX3dpbmRvdyhzdHJ1Y3QgYWJpc19ubV9zdyAqc3cpCit7CisJaW50IHJjOworCisJd2hpbGUgKHN3LT5zZWdfaW5fd2luZG93IDwgc3ctPndpbmRvd19zaXplKSB7CisJCXJjID0gc3dfbG9hZF9zZWdtZW50KHN3KTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKwkJaWYgKHN3LT5sYXN0X3NlZykKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogY2FsbGJhY2sgZnVuY3Rpb24gZnJvbSBhYmlzX25tX3Jjdm1zZygpIGhhbmRsZXIgKi8KK3N0YXRpYyBpbnQgYWJpc19ubV9yY3Ztc2dfc3coc3RydWN0IG1zZ2IgKm1iKQoreworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaCA9IG1zZ2JfbDMobWIpOworCWludCByYyA9IC0xOworCXN0cnVjdCBhYmlzX25tX3N3ICpzdyA9ICZnX3N3OworCWVudW0gc3dfc3RhdGUgb2xkX3N0YXRlID0gc3ctPnN0YXRlOworCQorCS8vREVCVUdQKEROTSwgInN0YXRlICV1LCBOTSBNVCAweCUwMnhcbiIsIHN3LT5zdGF0ZSwgZm9oLT5tc2dfdHlwZSk7CisKKwlzd2l0Y2ggKHN3LT5zdGF0ZSkgeworCWNhc2UgU1dfU1RBVEVfV0FJVF9JTklUQUNLOgorCQlzd2l0Y2ggKGZvaC0+bXNnX3R5cGUpIHsKKwkJY2FzZSBOTV9NVF9MT0FEX0lOSVRfQUNLOgorCQkJLyogZmlsbCB3aW5kb3cgd2l0aCBzZWdtZW50cyAqLworCQkJaWYgKHN3LT5jYmZuKQorCQkJCXN3LT5jYmZuKEdTTV9IT09LX05NX1NXTE9BRCwKKwkJCQkJIE5NX01UX0xPQURfSU5JVF9BQ0ssIG1iLAorCQkJCQkgc3ctPmNiX2RhdGEsIE5VTEwpOworCQkJcmMgPSBzd19maWxsX3dpbmRvdyhzdyk7CisJCQlzdy0+c3RhdGUgPSBTV19TVEFURV9XQUlUX1NFR0FDSzsKKwkJCWJyZWFrOworCQljYXNlIE5NX01UX0xPQURfSU5JVF9OQUNLOgorCQkJaWYgKHN3LT5mb3JjZWQpIHsKKwkJCQlERUJVR1AoRE5NLCAiRk9SQ0VEOiBJZ25vcmluZyBTb2Z0d2FyZSBMb2FkICIKKwkJCQkJIkluaXQgTkFDS1xuIik7CisJCQkJaWYgKHN3LT5jYmZuKQorCQkJCQlzdy0+Y2JmbihHU01fSE9PS19OTV9TV0xPQUQsCisJCQkJCQkgTk1fTVRfTE9BRF9JTklUX0FDSywgbWIsCisJCQkJCQkgc3ctPmNiX2RhdGEsIE5VTEwpOworCQkJCXJjID0gc3dfZmlsbF93aW5kb3coc3cpOworCQkJCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX1dBSVRfU0VHQUNLOworCQkJfSBlbHNlIHsKKwkJCQlERUJVR1AoRE5NLCAiU29mdHdhcmUgTG9hZCBJbml0IE5BQ0tcbiIpOworCQkJCS8qIEZJWE1FOiBjYXVzZSAqLworCQkJCWlmIChzdy0+Y2JmbikKKwkJCQkJc3ctPmNiZm4oR1NNX0hPT0tfTk1fU1dMT0FELAorCQkJCQkJIE5NX01UX0xPQURfSU5JVF9OQUNLLCBtYiwKKwkJCQkJCSBzdy0+Y2JfZGF0YSwgTlVMTCk7CisJCQkJc3ctPnN0YXRlID0gU1dfU1RBVEVfRVJST1I7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIFNXX1NUQVRFX1dBSVRfU0VHQUNLOgorCQlzd2l0Y2ggKGZvaC0+bXNnX3R5cGUpIHsKKwkJY2FzZSBOTV9NVF9MT0FEX1NFR19BQ0s6CisJCQlpZiAoc3ctPmNiZm4pCisJCQkJc3ctPmNiZm4oR1NNX0hPT0tfTk1fU1dMT0FELAorCQkJCQkgTk1fTVRfTE9BRF9TRUdfQUNLLCBtYiwKKwkJCQkJIHN3LT5jYl9kYXRhLCBOVUxMKTsKKwkJCXN3LT5zZWdfaW5fd2luZG93ID0gMDsKKwkJCWlmICghc3ctPmxhc3Rfc2VnKSB7CisJCQkJLyogZmlsbCB3aW5kb3cgd2l0aCBtb3JlIHNlZ21lbnRzICovCisJCQkJcmMgPSBzd19maWxsX3dpbmRvdyhzdyk7CisJCQkJc3ctPnN0YXRlID0gU1dfU1RBVEVfV0FJVF9TRUdBQ0s7CisJCQl9IGVsc2UgeworCQkJCS8qIGVuZCB0aGUgdHJhbnNmZXIgKi8KKwkJCQlzdy0+c3RhdGUgPSBTV19TVEFURV9XQUlUX0VOREFDSzsKKwkJCQlyYyA9IHN3X2xvYWRfZW5kKHN3KTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE5NX01UX0xPQURfQUJPUlQ6CisJCQlpZiAoc3ctPmNiZm4pCisJCQkJc3ctPmNiZm4oR1NNX0hPT0tfTk1fU1dMT0FELAorCQkJCQkgTk1fTVRfTE9BRF9BQk9SVCwgbWIsCisJCQkJCSBzdy0+Y2JfZGF0YSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIFNXX1NUQVRFX1dBSVRfRU5EQUNLOgorCQlzd2l0Y2ggKGZvaC0+bXNnX3R5cGUpIHsKKwkJY2FzZSBOTV9NVF9MT0FEX0VORF9BQ0s6CisJCQlzd19jbG9zZV9maWxlKHN3KTsKKwkJCURFQlVHUChETk0sICJTb2Z0d2FyZSBMb2FkIEVuZCAoQlRTICV1KVxuIiwKKwkJCQlzdy0+YnRzLT5ucik7CisJCQlzdy0+c3RhdGUgPSBTV19TVEFURV9OT05FOworCQkJaWYgKHN3LT5jYmZuKQorCQkJCXN3LT5jYmZuKEdTTV9IT09LX05NX1NXTE9BRCwKKwkJCQkJIE5NX01UX0xPQURfRU5EX0FDSywgbWIsCisJCQkJCSBzdy0+Y2JfZGF0YSwgTlVMTCk7CisJCQlyYyA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBOTV9NVF9MT0FEX0VORF9OQUNLOgorCQkJaWYgKHN3LT5mb3JjZWQpIHsKKwkJCQlERUJVR1AoRE5NLCAiRk9SQ0VEOiBJZ25vcmluZyBTb2Z0d2FyZSBMb2FkIgorCQkJCQkiRW5kIE5BQ0tcbiIpOworCQkJCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX05PTkU7CisJCQkJaWYgKHN3LT5jYmZuKQorCQkJCQlzdy0+Y2JmbihHU01fSE9PS19OTV9TV0xPQUQsCisJCQkJCQkgTk1fTVRfTE9BRF9FTkRfQUNLLCBtYiwKKwkJCQkJCSBzdy0+Y2JfZGF0YSwgTlVMTCk7CisJCQl9IGVsc2UgeworCQkJCURFQlVHUChETk0sICJTb2Z0d2FyZSBMb2FkIEVuZCBOQUNLXG4iKTsKKwkJCQkvKiBGSVhNRTogY2F1c2UgKi8KKwkJCQlzdy0+c3RhdGUgPSBTV19TVEFURV9FUlJPUjsKKwkJCQlpZiAoc3ctPmNiZm4pCisJCQkJCXN3LT5jYmZuKEdTTV9IT09LX05NX1NXTE9BRCwKKwkJCQkJCSBOTV9NVF9MT0FEX0VORF9OQUNLLCBtYiwKKwkJCQkJCSBzdy0+Y2JfZGF0YSwgTlVMTCk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCWNhc2UgU1dfU1RBVEVfV0FJVF9BQ1RBQ0s6CisJCXN3aXRjaCAoZm9oLT5tc2dfdHlwZSkgeworCQljYXNlIE5NX01UX0FDVElWQVRFX1NXX0FDSzoKKwkJCS8qIHdlJ3JlIGRvbmUgKi8KKwkJCURFQlVHUChETk0sICJBY3RpdmF0ZSBTb2Z0d2FyZSBET05FIVxuIik7CisJCQlzdy0+c3RhdGUgPSBTV19TVEFURV9OT05FOworCQkJcmMgPSAwOworCQkJaWYgKHN3LT5jYmZuKQorCQkJCXN3LT5jYmZuKEdTTV9IT09LX05NX1NXTE9BRCwKKwkJCQkJIE5NX01UX0FDVElWQVRFX1NXX0FDSywgbWIsCisJCQkJCSBzdy0+Y2JfZGF0YSwgTlVMTCk7CisJCQlicmVhazsKKwkJY2FzZSBOTV9NVF9BQ1RJVkFURV9TV19OQUNLOgorCQkJREVCVUdQKEROTSwgIkFjdGl2YXRlIFNvZnR3YXJlIE5BQ0tcbiIpOworCQkJLyogRklYTUU6IGNhdXNlICovCisJCQlzdy0+c3RhdGUgPSBTV19TVEFURV9FUlJPUjsKKwkJCWlmIChzdy0+Y2JmbikKKwkJCQlzdy0+Y2JmbihHU01fSE9PS19OTV9TV0xPQUQsCisJCQkJCSBOTV9NVF9BQ1RJVkFURV9TV19OQUNLLCBtYiwKKwkJCQkJIHN3LT5jYl9kYXRhLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBTV19TVEFURV9OT05FOgorCQlzd2l0Y2ggKGZvaC0+bXNnX3R5cGUpIHsKKwkJY2FzZSBOTV9NVF9BQ1RJVkFURV9TV19BQ0s6CisJCQlyYyA9IDA7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIFNXX1NUQVRFX0VSUk9SOgorCQlicmVhazsKKwl9CisKKwlpZiAocmMpCisJCURFQlVHUChETk0sICJ1bmV4cGVjdGVkIE5NIE1UIDB4JTAyeCBpbiBzdGF0ZSAldSAtPiAldVxuIiwKKwkJCWZvaC0+bXNnX3R5cGUsIG9sZF9zdGF0ZSwgc3ctPnN0YXRlKTsKKworCXJldHVybiByYzsKK30KKworLyogTG9hZCB0aGUgc3BlY2lmaWVkIHNvZnR3YXJlIGludG8gdGhlIEJUUyAqLworaW50IGFiaXNfbm1fc29mdHdhcmVfbG9hZChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBjb25zdCBjaGFyICpmbmFtZSwKKwkJCSAgdV9pbnQ4X3Qgd2luX3NpemUsIGludCBmb3JjZWQsCisJCQkgIGdzbV9jYmZuICpjYmZuLCB2b2lkICpjYl9kYXRhKQoreworCXN0cnVjdCBhYmlzX25tX3N3ICpzdyA9ICZnX3N3OworCWludCByYzsKKworCURFQlVHUChETk0sICJTb2Z0d2FyZSBMb2FkIChCVFMgJXUsIEZpbGUgXCIlc1wiKVxuIiwKKwkJYnRzLT5uciwgZm5hbWUpOworCisJaWYgKHN3LT5zdGF0ZSAhPSBTV19TVEFURV9OT05FKQorCQlyZXR1cm4gLUVCVVNZOworCisJc3ctPmJ0cyA9IGJ0czsKKworCXN3aXRjaCAoYnRzLT50eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfQlMxMToKKwkJc3ctPm9ial9jbGFzcyA9IE5NX09DX1NJVEVfTUFOQUdFUjsKKwkJc3ctPm9ial9pbnN0YW5jZVswXSA9IDB4ZmY7CisJCXN3LT5vYmpfaW5zdGFuY2VbMV0gPSAweGZmOworCQlzdy0+b2JqX2luc3RhbmNlWzJdID0gMHhmZjsKKwkJYnJlYWs7CisJY2FzZSBHU01fQlRTX1RZUEVfTkFOT0JUUzoKKwkJc3ctPm9ial9jbGFzcyA9IE5NX09DX0JBU0VCX1RSQU5TQzsKKwkJc3ctPm9ial9pbnN0YW5jZVswXSA9IDB4MDA7CisJCXN3LT5vYmpfaW5zdGFuY2VbMV0gPSAweDAwOworCQlzdy0+b2JqX2luc3RhbmNlWzJdID0gMHhmZjsKKwkJYnJlYWs7CisJY2FzZSBHU01fQlRTX1RZUEVfVU5LTk9XTjoKKwlkZWZhdWx0OgorCQlMT0dQQyhETk0sIExPR0xfRVJST1IsICJTb2Z0d2FyZSBMb2FkIG5vdCBwcm9wZXJseSBpbXBsZW1lbnRlZC5cbiIpOworCQlyZXR1cm4gLTE7CisJCWJyZWFrOworCX0KKwlzdy0+d2luZG93X3NpemUgPSB3aW5fc2l6ZTsKKwlzdy0+c3RhdGUgPSBTV19TVEFURV9XQUlUX0lOSVRBQ0s7CisJc3ctPmNiZm4gPSBjYmZuOworCXN3LT5jYl9kYXRhID0gY2JfZGF0YTsKKwlzdy0+Zm9yY2VkID0gZm9yY2VkOworCisJcmMgPSBzd19vcGVuX2ZpbGUoc3csIGZuYW1lKTsKKwlpZiAocmMgPCAwKSB7CisJCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX05PTkU7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gc3dfbG9hZF9pbml0KHN3KTsKK30KKworaW50IGFiaXNfbm1fc29mdHdhcmVfbG9hZF9zdGF0dXMoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgYWJpc19ubV9zdyAqc3cgPSAmZ19zdzsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlpbnQgcmMsIHBlcmNlbnQ7CisKKwlyYyA9IGZzdGF0KHN3LT5mZCwgJnN0KTsKKwlpZiAocmMgPCAwKSB7CisJCXBlcnJvcigiRVJST1IgZHVyaW5nIHN0YXQiKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWlmIChzdy0+c3RyZWFtKQorCQlwZXJjZW50ID0gKGZ0ZWxsKHN3LT5zdHJlYW0pICogMTAwKSAvIHN0LnN0X3NpemU7CisJZWxzZQorCQlwZXJjZW50ID0gKGxzZWVrKHN3LT5mZCwgMCwgU0VFS19DVVIpICogMTAwKSAvIHN0LnN0X3NpemU7CisJcmV0dXJuIHBlcmNlbnQ7Cit9CisKKy8qIEFjdGl2YXRlIHRoZSBzcGVjaWZpZWQgc29mdHdhcmUgaW50byB0aGUgQlRTICovCitpbnQgYWJpc19ubV9zb2Z0d2FyZV9hY3RpdmF0ZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBjb25zdCBjaGFyICpmbmFtZSwKKwkJCSAgICAgIGdzbV9jYmZuICpjYmZuLCB2b2lkICpjYl9kYXRhKQoreworCXN0cnVjdCBhYmlzX25tX3N3ICpzdyA9ICZnX3N3OworCWludCByYzsKKworCURFQlVHUChETk0sICJBY3RpdmF0aW5nIFNvZnR3YXJlIChCVFMgJXUsIEZpbGUgXCIlc1wiKVxuIiwKKwkJYnRzLT5uciwgZm5hbWUpOworCisJaWYgKHN3LT5zdGF0ZSAhPSBTV19TVEFURV9OT05FKQorCQlyZXR1cm4gLUVCVVNZOworCisJc3ctPmJ0cyA9IGJ0czsKKwlzdy0+b2JqX2NsYXNzID0gTk1fT0NfU0lURV9NQU5BR0VSOworCXN3LT5vYmpfaW5zdGFuY2VbMF0gPSAweGZmOworCXN3LT5vYmpfaW5zdGFuY2VbMV0gPSAweGZmOworCXN3LT5vYmpfaW5zdGFuY2VbMl0gPSAweGZmOworCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX1dBSVRfQUNUQUNLOworCXN3LT5jYmZuID0gY2JmbjsKKwlzdy0+Y2JfZGF0YSA9IGNiX2RhdGE7CisKKwkvKiBPcGVuIHRoZSBmaWxlIGluIG9yZGVyIHRvIGZpbGwgc29tZSBzdyBzdHJ1Y3QgbWVtYmVycyAqLworCXJjID0gc3dfb3Blbl9maWxlKHN3LCBmbmFtZSk7CisJaWYgKHJjIDwgMCkgeworCQlzdy0+c3RhdGUgPSBTV19TVEFURV9OT05FOworCQlyZXR1cm4gcmM7CisJfQorCXN3X2Nsb3NlX2ZpbGUoc3cpOworCisJcmV0dXJuIHN3X2FjdGl2YXRlKHN3KTsKK30KKworc3RhdGljIHZvaWQgZmlsbF9ubV9jaGFubmVsKHN0cnVjdCBhYmlzX25tX2NoYW5uZWwgKmNoLCB1X2ludDhfdCBidHNfcG9ydCwKKwkJICAgICAgIHVfaW50OF90IHRzX25yLCB1X2ludDhfdCBzdWJzbG90X25yKQoreworCWNoLT5hdHRyaWIgPSBOTV9BVFRfQUJJU19DSEFOTkVMOworCWNoLT5idHNfcG9ydCA9IGJ0c19wb3J0OworCWNoLT50aW1lc2xvdCA9IHRzX25yOworCWNoLT5zdWJzbG90ID0gc3Vic2xvdF9ucjsJCit9CisKK2ludCBhYmlzX25tX2VzdGFibGlzaF90ZWkoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgdHJ4X25yLAorCQkJICB1X2ludDhfdCBlMV9wb3J0LCB1X2ludDhfdCBlMV90aW1lc2xvdCwgdV9pbnQ4X3QgZTFfc3Vic2xvdCwKKwkJCSAgdV9pbnQ4X3QgdGVpKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IGFiaXNfbm1fY2hhbm5lbCAqY2g7CisJdV9pbnQ4X3QgbGVuID0gc2l6ZW9mKCpjaCkgKyAyOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBsZW4sIE5NX01UX0VTVEFCTElTSF9URUksIE5NX09DX1JBRElPX0NBUlJJRVIsCisJCQlidHMtPmJ0c19uciwgdHJ4X25yLCAweGZmKTsKKwkKKwltc2diX3R2X3B1dChtc2csIE5NX0FUVF9URUksIHRlaSk7CisKKwljaCA9IChzdHJ1Y3QgYWJpc19ubV9jaGFubmVsICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpjaCkpOworCWZpbGxfbm1fY2hhbm5lbChjaCwgZTFfcG9ydCwgZTFfdGltZXNsb3QsIGUxX3N1YnNsb3QpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKKy8qIGNvbm5lY3Qgc2lnbmFsbGluZyBvZiBvbmUgKEJUUyxUUlgpIHRvIGEgcGFydGljdWxhciB0aW1lc2xvdCBvbiB0aGUgRTEgKi8KK2ludCBhYmlzX25tX2Nvbm5fdGVycl9zaWduKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LAorCQkJICAgdV9pbnQ4X3QgZTFfcG9ydCwgdV9pbnQ4X3QgZTFfdGltZXNsb3QsIHVfaW50OF90IGUxX3N1YnNsb3QpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHRyeC0+YnRzOworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IGFiaXNfbm1fY2hhbm5lbCAqY2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIHNpemVvZigqY2gpLCBOTV9NVF9DT05OX1RFUlJfU0lHTiwKKwkJCU5NX09DX1JBRElPX0NBUlJJRVIsIGJ0cy0+YnRzX25yLCB0cngtPm5yLCAweGZmKTsKKwkKKwljaCA9IChzdHJ1Y3QgYWJpc19ubV9jaGFubmVsICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpjaCkpOworCWZpbGxfbm1fY2hhbm5lbChjaCwgZTFfcG9ydCwgZTFfdGltZXNsb3QsIGUxX3N1YnNsb3QpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKKyNpZiAwCitpbnQgYWJpc19ubV9kaXNjX3RlcnJfc2lnbihzdHJ1Y3QgYWJpc19ubV9oICpoLCBzdHJ1Y3QgYWJpc19vbV9vYmpfaW5zdCAqaW5zdCwKKwkJCSAgIHN0cnVjdCBhYmlzX25tX2FiaXNfY2hhbm5lbCAqY2hhbikKK3sKK30KKyNlbmRpZgorCitpbnQgYWJpc19ubV9jb25uX3RlcnJfdHJhZihzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzLAorCQkJICAgdV9pbnQ4X3QgZTFfcG9ydCwgdV9pbnQ4X3QgZTFfdGltZXNsb3QsCisJCQkgICB1X2ludDhfdCBlMV9zdWJzbG90KQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB0cy0+dHJ4LT5idHM7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgYWJpc19ubV9jaGFubmVsICpjaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgc2l6ZW9mKCpjaCksIE5NX01UX0NPTk5fVEVSUl9UUkFGLAorCQkJTk1fT0NfQ0hBTk5FTCwgYnRzLT5idHNfbnIsIHRzLT50cngtPm5yLCB0cy0+bnIpOworCisJY2ggPSAoc3RydWN0IGFiaXNfbm1fY2hhbm5lbCAqKSBtc2diX3B1dChtc2csIHNpemVvZigqY2gpKTsKKwlmaWxsX25tX2NoYW5uZWwoY2gsIGUxX3BvcnQsIGUxX3RpbWVzbG90LCBlMV9zdWJzbG90KTsKKworCURFQlVHUChETk0sICJDT05ORUNUIFRFUlIgVFJBRiBVbT0lcyBFMT0oJXUsJXUsJXUpXG4iLAorCQlnc21fdHNfbmFtZSh0cyksCisJCWUxX3BvcnQsIGUxX3RpbWVzbG90LCBlMV9zdWJzbG90KTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCisjaWYgMAoraW50IGFiaXNfbm1fZGlzY190ZXJyX3RyYWYoc3RydWN0IGFiaXNfbm1faCAqaCwgc3RydWN0IGFiaXNfb21fb2JqX2luc3QgKmluc3QsCisJCQkgICBzdHJ1Y3QgYWJpc19ubV9hYmlzX2NoYW5uZWwgKmNoYW4sCisJCQkgICB1X2ludDhfdCBzdWJjaGFuKQoreworfQorI2VuZGlmCisKKy8qIENoYXB0ZXIgOC42LjEgKi8KK2ludCBhYmlzX25tX3NldF9idHNfYXR0cihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCAqYXR0ciwgaW50IGF0dHJfbGVuKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwl1X2ludDhfdCAqY3VyOworCisJREVCVUdQKEROTSwgIlNldCBCVFMgQXR0ciAoYnRzPSVkKVxuIiwgYnRzLT5ucik7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBhdHRyX2xlbiwgTk1fTVRfU0VUX0JUU19BVFRSLCBOTV9PQ19CVFMsIGJ0cy0+YnRzX25yLCAweGZmLCAweGZmKTsKKwljdXIgPSBtc2diX3B1dChtc2csIGF0dHJfbGVuKTsKKwltZW1jcHkoY3VyLCBhdHRyLCBhdHRyX2xlbik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworLyogQ2hhcHRlciA4LjYuMiAqLworaW50IGFiaXNfbm1fc2V0X3JhZGlvX2F0dHIoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90ICphdHRyLCBpbnQgYXR0cl9sZW4pCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90ICpjdXI7CisKKwlERUJVR1AoRE5NLCAiU2V0IFRSWCBBdHRyIChidHM9JWQsdHJ4PSVkKVxuIiwgdHJ4LT5idHMtPm5yLCB0cngtPm5yKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIGF0dHJfbGVuLCBOTV9NVF9TRVRfUkFESU9fQVRUUiwgTk1fT0NfUkFESU9fQ0FSUklFUiwKKwkJCXRyeC0+YnRzLT5idHNfbnIsIHRyeC0+bnIsIDB4ZmYpOworCWN1ciA9IG1zZ2JfcHV0KG1zZywgYXR0cl9sZW4pOworCW1lbWNweShjdXIsIGF0dHIsIGF0dHJfbGVuKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2codHJ4LT5idHMsIG1zZyk7Cit9CisKK3N0YXRpYyBpbnQgdmVyaWZ5X2NoYW5fY29tYihzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzLCB1X2ludDhfdCBjaGFuX2NvbWIpCit7CisJaW50IGk7CisKKwkvKiBBcyBpdCB0dXJucyBvdXQsIHRoZSBCUy0xMSBoYXMgc29tZSB2ZXJ5IHBlY3VsaWFyIHJlc3RyaWN0aW9ucworCSAqIG9uIHRoZSBjaGFubmVsIGNvbWJpbmF0aW9ucyBpdCBhbGxvd3MgKi8KKwlzd2l0Y2ggKHRzLT50cngtPmJ0cy0+dHlwZSkgeworCWNhc2UgR1NNX0JUU19UWVBFX0JTMTE6CisJCXN3aXRjaCAoY2hhbl9jb21iKSB7CisJCWNhc2UgTk1fQ0hBTkNfVENISGFsZjoKKwkJY2FzZSBOTV9DSEFOQ19UQ0hIYWxmMjoKKwkJCS8qIG5vdCBzdXBwb3J0ZWQgKi8KKwkJCXJldHVybiAtRUlOVkFMOworCQljYXNlIE5NX0NIQU5DX1NEQ0NIOgorCQkJLyogb25seSBvbmUgU0RDQ0gvOCBwZXIgVFJYICovCisJCQlmb3IgKGkgPSAwOyBpIDwgVFJYX05SX1RTOyBpKyspIHsKKwkJCQlpZiAoaSA9PSB0cy0+bnIpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICh0cy0+dHJ4LT50c1tpXS5ubV9jaGFuX2NvbWIgPT0KKwkJCQkgICAgTk1fQ0hBTkNfU0RDQ0gpCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJLyogbm90IGFsbG93ZWQgZm9yIFRTMCBvZiBCQ0NILVRSWCAqLworCQkJaWYgKHRzLT50cnggPT0gdHMtPnRyeC0+YnRzLT5jMCAmJgorCQkJICAgIHRzLT5uciA9PSAwKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCS8qIG5vdCBvbiB0aGUgc2FtZSBUUlggdGhhdCBoYXMgYSBCQ0NIK1NEQ0NINAorCQkJICogY29tYmluYXRpb24gKi8KKwkJCWlmICh0cy0+dHJ4ID09IHRzLT50cngtPmJ0cy0+YzAgJiYKKwkJCSAgICAodHMtPnRyeC0+dHNbMF0ubm1fY2hhbl9jb21iID09IDUgfHwKKwkJCSAgICAgdHMtPnRyeC0+dHNbMF0ubm1fY2hhbl9jb21iID09IDgpKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOworCQljYXNlIE5NX0NIQU5DX21haW5CQ0NIOgorCQljYXNlIE5NX0NIQU5DX0JDQ0hDb21iOgorCQkJLyogYWxsb3dlZCBvbmx5IGZvciBUUzAgb2YgQzAgKi8KKwkJCWlmICh0cy0+dHJ4ICE9IHRzLT50cngtPmJ0cy0+YzAgfHwKKwkJCSAgICB0cy0+bnIgIT0gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOworCQljYXNlIE5NX0NIQU5DX0JDQ0g6CisJCQkvKiBhbGxvd2VkIG9ubHkgZm9yIFRTIDIvNC82IG9mIEMwICovCisJCQlpZiAodHMtPnRyeCAhPSB0cy0+dHJ4LT5idHMtPmMwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKHRzLT5uciAhPSAyICYmIHRzLT5uciAhPSA0ICYmCisJCQkgICAgdHMtPm5yICE9IDYpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwkJY2FzZSA4OiAvKiB0aGlzIGlzIG5vdCBsaWtlIDA4LjU4LCBidXQgaW4gZmFjdAorCQkJICogRkNDSCtTQ0grQkNDSCtDQ0NIK1NEQ0NILzQrU0FDQ0gvQzQrQ0JDSCAqLworCQkJLyogRklYTUU6IG9ubHkgb25lIENCQ0ggYWxsb3dlZCBwZXIgY2VsbCAqLworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBHU01fQlRTX1RZUEVfTkFOT0JUUzoKKwkJc3dpdGNoICh0cy0+bnIpIHsKKwkJY2FzZSAwOgorCQkJaWYgKHRzLT50cngtPm5yID09IDApIHsKKwkJCQkvKiBvbmx5IG9uIFRSWDAgKi8KKwkJCQlzd2l0Y2ggKGNoYW5fY29tYikgeworCQkJCWNhc2UgTk1fQ0hBTkNfQkNDSDoKKwkJCQljYXNlIE5NX0NIQU5DX21haW5CQ0NIOgorCQkJCWNhc2UgTk1fQ0hBTkNfQkNDSENvbWI6CisJCQkJCXJldHVybiAwOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXN3aXRjaCAoY2hhbl9jb21iKSB7CisJCQkJY2FzZSBOTV9DSEFOQ19UQ0hGdWxsOgorCQkJCWNhc2UgTk1fQ0hBTkNfVENISGFsZjoKKwkJCQljYXNlIE5NX0NIQU5DX0lQQUNfVENIRnVsbF9UQ0hIYWxmOgorCQkJCQlyZXR1cm4gMDsKKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJaWYgKHRzLT50cngtPm5yID09IDApIHsKKwkJCQlzd2l0Y2ggKGNoYW5fY29tYikgeworCQkJCWNhc2UgTk1fQ0hBTkNfU0RDQ0hfQ0JDSDoKKwkJCQkJaWYgKHRzLT50cngtPnRzWzBdLm5tX2NoYW5fY29tYiA9PQorCQkJCQkgICAgTk1fQ0hBTkNfbWFpbkJDQ0gpCisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJY2FzZSBOTV9DSEFOQ19TRENDSDoKKwkJCQljYXNlIE5NX0NIQU5DX1RDSEZ1bGw6CisJCQkJY2FzZSBOTV9DSEFOQ19UQ0hIYWxmOgorCQkJCWNhc2UgTk1fQ0hBTkNfSVBBQ19UQ0hGdWxsX1RDSEhhbGY6CisJCQkJY2FzZSBOTV9DSEFOQ19JUEFDX1RDSEZ1bGxfUERDSDoKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlzd2l0Y2ggKGNoYW5fY29tYikgeworCQkJCWNhc2UgTk1fQ0hBTkNfU0RDQ0g6CisJCQkJY2FzZSBOTV9DSEFOQ19UQ0hGdWxsOgorCQkJCWNhc2UgTk1fQ0hBTkNfVENISGFsZjoKKwkJCQljYXNlIE5NX0NIQU5DX0lQQUNfVENIRnVsbF9UQ0hIYWxmOgorCQkJCQlyZXR1cm4gMDsKKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQljYXNlIDM6CisJCWNhc2UgNDoKKwkJY2FzZSA1OgorCQljYXNlIDY6CisJCWNhc2UgNzoKKwkJCXN3aXRjaCAoY2hhbl9jb21iKSB7CisJCQljYXNlIE5NX0NIQU5DX1RDSEZ1bGw6CisJCQljYXNlIE5NX0NIQU5DX1RDSEhhbGY6CisJCQljYXNlIE5NX0NIQU5DX0lQQUNfVENIRnVsbF9UQ0hIYWxmOgorCQkJCXJldHVybiAwOworCQkJY2FzZSBOTV9DSEFOQ19JUEFDX1BEQ0g6CisJCQljYXNlIE5NX0NIQU5DX0lQQUNfVENIRnVsbF9QRENIOgorCQkJCWlmICh0cy0+dHJ4LT5uciA9PSAwKQorCQkJCQlyZXR1cm4gMDsKKwkJCQllbHNlCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIC1FSU5WQUw7CisJZGVmYXVsdDoKKwkJLyogdW5rbm93biBCVFMgdHlwZSAqLworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIENoYXB0ZXIgOC42LjMgKi8KK2ludCBhYmlzX25tX3NldF9jaGFubmVsX2F0dHIoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cywgdV9pbnQ4X3QgY2hhbl9jb21iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB0cy0+dHJ4LT5idHM7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwl1X2ludDE2X3QgYXJmY24gPSBodG9ucyh0cy0+dHJ4LT5hcmZjbik7CisJdV9pbnQ4X3QgemVybyA9IDB4MDA7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwl1X2ludDhfdCBsZW4gPSAyICsgMjsKKworCWlmIChidHMtPnR5cGUgPT0gR1NNX0JUU19UWVBFX0JTMTEpCisJCWxlbiArPSA0ICsgMiArIDIgKyAzOworCisJREVCVUdQKEROTSwgIlNldCBDaGFuIEF0dHIgJXNcbiIsIGdzbV90c19uYW1lKHRzKSk7CisJaWYgKHZlcmlmeV9jaGFuX2NvbWIodHMsIGNoYW5fY29tYikgPCAwKSB7CisJCW1zZ2JfZnJlZShtc2cpOworCQlERUJVR1AoRE5NLCAiSW52YWxpZCBDaGFubmVsIENvbWJpbmF0aW9uISEhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXRzLT5ubV9jaGFuX2NvbWIgPSBjaGFuX2NvbWI7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBsZW4sIE5NX01UX1NFVF9DSEFOX0FUVFIsCisJCQlOTV9PQ19DSEFOTkVMLCBidHMtPmJ0c19uciwKKwkJCXRzLT50cngtPm5yLCB0cy0+bnIpOworCS8qIEZJWE1FOiBkb24ndCBzZW5kIEFSRkNOIGxpc3QsIGhvcHBpbmcgc2VxdWVuY2UsIG1BSU8sIC4uLiovCisJaWYgKGJ0cy0+dHlwZSA9PSBHU01fQlRTX1RZUEVfQlMxMSkKKwkJbXNnYl90bHYxNl9wdXQobXNnLCBOTV9BVFRfQVJGQ05fTElTVCwgMSwgJmFyZmNuKTsKKwltc2diX3R2X3B1dChtc2csIE5NX0FUVF9DSEFOX0NPTUIsIGNoYW5fY29tYik7CisJaWYgKGJ0cy0+dHlwZSA9PSBHU01fQlRTX1RZUEVfQlMxMSkgeworCQltc2diX3R2X3B1dChtc2csIE5NX0FUVF9IU04sIDB4MDApOworCQltc2diX3R2X3B1dChtc2csIE5NX0FUVF9NQUlPLCAweDAwKTsKKwl9CisJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfVFNDLCBidHMtPnRzYyk7CS8qIHRyYWluaW5nIHNlcXVlbmNlICovCisJaWYgKGJ0cy0+dHlwZSA9PSBHU01fQlRTX1RZUEVfQlMxMSkKKwkJbXNnYl90bHZfcHV0KG1zZywgMHg1OSwgMSwgJnplcm8pOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX3N3X2FjdF9yZXFfYWNrKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG9ial9jbGFzcywgdV9pbnQ4X3QgaTEsCisJCQl1X2ludDhfdCBpMiwgdV9pbnQ4X3QgaTMsIGludCBuYWNrLCB1X2ludDhfdCAqYXR0ciwgaW50IGF0dF9sZW4pCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90IG1zZ3R5cGUgPSBOTV9NVF9TV19BQ1RfUkVRX0FDSzsKKwl1X2ludDhfdCBsZW4gPSBhdHRfbGVuOworCisJaWYgKG5hY2spIHsKKwkJbGVuICs9IDI7CisJCW1zZ3R5cGUgPSBOTV9NVF9TV19BQ1RfUkVRX05BQ0s7CisJfQorCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgYXR0X2xlbiwgbXNndHlwZSwgb2JqX2NsYXNzLCBpMSwgaTIsIGkzKTsKKworCWlmIChhdHRyKSB7CisJCXVfaW50OF90ICpwdHIgPSBtc2diX3B1dChtc2csIGF0dF9sZW4pOworCQltZW1jcHkocHRyLCBhdHRyLCBhdHRfbGVuKTsKKwl9CisJaWYgKG5hY2spCisJCW1zZ2JfdHZfcHV0KG1zZywgTk1fQVRUX05BQ0tfQ0FVU0VTLCBOTV9OQUNLX09CSkNMQVNTX05PVFNVUFApOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX3Jhd19tc2coc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IGxlbiwgdV9pbnQ4X3QgKnJhd21zZykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJdV9pbnQ4X3QgKmRhdGE7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKm9oKSk7CisJZmlsbF9vbV9oZHIob2gsIGxlbik7CisJZGF0YSA9IG1zZ2JfcHV0KG1zZywgbGVuKTsKKwltZW1jcHkoZGF0YSwgcmF3bXNnLCBsZW4pOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKKy8qIFNpZW1lbnMgc3BlY2lmaWMgY29tbWFuZHMgKi8KK3N0YXRpYyBpbnQgX19zaW1wbGVfY21kKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG1zZ190eXBlKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDAsIG1zZ190eXBlLCBOTV9PQ19TSVRFX01BTkFHRVIsCisJCQkweGZmLCAweGZmLCAweGZmKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCisvKiBDaGFwdGVyIDguOS4yICovCitpbnQgYWJpc19ubV9vcHN0YXJ0KHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG9ial9jbGFzcywgdV9pbnQ4X3QgaTAsIHVfaW50OF90IGkxLCB1X2ludDhfdCBpMikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCAwLCBOTV9NVF9PUFNUQVJULCBvYmpfY2xhc3MsIGkwLCBpMSwgaTIpOworCisJZGVidWdwX2ZvaCgoc3RydWN0IGFiaXNfb21fZm9tX2hkciAqKSBvaC0+ZGF0YSk7CisJREVCVUdQQyhETk0sICJTZW5kaW5nIE9QU1RBUlRcbiIpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKKy8qIENoYXB0ZXIgOC44LjUgKi8KK2ludCBhYmlzX25tX2NoZ19hZG1fc3RhdGUoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLCB1X2ludDhfdCBpMCwKKwkJCSAgdV9pbnQ4X3QgaTEsIHVfaW50OF90IGkyLCBlbnVtIGFiaXNfbm1fYWRtX3N0YXRlIGFkbV9zdGF0ZSkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCAyLCBOTV9NVF9DSEdfQURNX1NUQVRFLCBvYmpfY2xhc3MsIGkwLCBpMSwgaTIpOworCW1zZ2JfdHZfcHV0KG1zZywgTk1fQVRUX0FETV9TVEFURSwgYWRtX3N0YXRlKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9jb25uX21kcm9wX2xpbmsoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgZTFfcG9ydDAsIHVfaW50OF90IHRzMCwKKwkJCSAgICB1X2ludDhfdCBlMV9wb3J0MSwgdV9pbnQ4X3QgdHMxKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwl1X2ludDhfdCAqYXR0cjsKKworCURFQlVHUChETk0sICJDT05ORUNUIE1EUk9QIExJTksgRTE9KCV1LCV1KSAtPiBFMT0oJXUsICV1KVxuIiwKKwkJZTFfcG9ydDAsIHRzMCwgZTFfcG9ydDEsIHRzMSk7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCA2LCBOTV9NVF9DT05OX01EUk9QX0xJTkssCisJCQlOTV9PQ19TSVRFX01BTkFHRVIsIDB4MDAsIDB4MDAsIDB4MDApOworCisJYXR0ciA9IG1zZ2JfcHV0KG1zZywgMyk7CisJYXR0clswXSA9IE5NX0FUVF9NRFJPUF9MSU5LOworCWF0dHJbMV0gPSBlMV9wb3J0MDsKKwlhdHRyWzJdID0gdHMwOworCisJYXR0ciA9IG1zZ2JfcHV0KG1zZywgMyk7CisJYXR0clswXSA9IE5NX0FUVF9NRFJPUF9ORVhUOworCWF0dHJbMV0gPSBlMV9wb3J0MTsKKwlhdHRyWzJdID0gdHMxOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKKy8qIENoYXB0ZXIgOC43LjEgKi8KK2ludCBhYmlzX25tX3BlcmZvcm1fdGVzdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsCisJCQkgdV9pbnQ4X3QgYnRzX25yLCB1X2ludDhfdCB0cnhfbnIsIHVfaW50OF90IHRzX25yLAorCQkJIHVfaW50OF90IHRlc3RfbnIsIHVfaW50OF90IGF1dG9uX3JlcG9ydCwKKwkJCSB1X2ludDhfdCAqcGh5c19jb25maWcsIHVfaW50MTZfdCBwaHlzX2NvbmZpZ19sZW4pCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCWludCBsZW4gPSA0OyAvKiAyIFRWIGF0dHJpYnV0ZXMgKi8KKworCURFQlVHUChETk0sICJQRUZPUk0gVEVTVFxuIik7CisJCisJaWYgKHBoeXNfY29uZmlnX2xlbikKKwkJbGVuICs9IDMgKyBwaHlzX2NvbmZpZ19sZW47CisJCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgbGVuLCBOTV9NVF9QRVJGX1RFU1QsCisJCQlvYmpfY2xhc3MsIGJ0c19uciwgdHJ4X25yLCB0c19ucik7CisJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfVEVTVF9OTywgdGVzdF9ucik7CisJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfQVVUT05fUkVQT1JULCBhdXRvbl9yZXBvcnQpOworCWlmIChwaHlzX2NvbmZpZ19sZW4pCisJCW1zZ2JfdGwxNnZfcHV0KG1zZywgTk1fQVRUX1BIWVNfQ09ORiwgcGh5c19jb25maWdfbGVuLAorCQkJCXBoeXNfY29uZmlnKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9ldmVudF9yZXBvcnRzKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBvbikKK3sKKwlpZiAob24gPT0gMCkKKwkJcmV0dXJuIF9fc2ltcGxlX2NtZChidHMsIE5NX01UX1NUT1BfRVZFTlRfUkVQKTsKKwllbHNlCisJCXJldHVybiBfX3NpbXBsZV9jbWQoYnRzLCBOTV9NVF9SRVNUX0VWRU5UX1JFUCk7Cit9CisKKy8qIFNpZW1lbnMgKG9yIEJTLTExKSBzcGVjaWZpYyBjb21tYW5kcyAqLworCitpbnQgYWJpc19ubV9iczExX2JzY19kaXNjb25uZWN0KHN0cnVjdCBnc21fYnRzICpidHMsIGludCByZWNvbm5lY3QpCit7CisJaWYgKHJlY29ubmVjdCA9PSAwKQorCQlyZXR1cm4gX19zaW1wbGVfY21kKGJ0cywgTk1fTVRfQlMxMV9ESVNDT05ORUNUKTsKKwllbHNlCisJCXJldHVybiBfX3NpbXBsZV9jbWQoYnRzLCBOTV9NVF9CUzExX1JFQ09OTkVDVCk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfcmVzdGFydChzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXJldHVybiBfX3NpbXBsZV9jbWQoYnRzLCBOTV9NVF9CUzExX1JFU1RBUlQpOworfQorCisKK3N0cnVjdCBiczExX2RhdGVfdGltZSB7CisJdV9pbnQxNl90CXllYXI7CisJdV9pbnQ4X3QJbW9udGg7CisJdV9pbnQ4X3QJZGF5OworCXVfaW50OF90CWhvdXI7CisJdV9pbnQ4X3QJbWluOworCXVfaW50OF90CXNlYzsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKwordm9pZCBnZXRfYnMxMV9kYXRlX3RpbWUoc3RydWN0IGJzMTFfZGF0ZV90aW1lICphZXQpCit7CisJdGltZV90IHQ7CisJc3RydWN0IHRtICp0bTsKKworCXQgPSB0aW1lKE5VTEwpOworCXRtID0gbG9jYWx0aW1lKCZ0KTsKKwlhZXQtPnNlYyA9IHRtLT50bV9zZWM7CisJYWV0LT5taW4gPSB0bS0+dG1fbWluOworCWFldC0+aG91ciA9IHRtLT50bV9ob3VyOworCWFldC0+ZGF5ID0gdG0tPnRtX21kYXk7CisJYWV0LT5tb250aCA9IHRtLT50bV9tb247CisJYWV0LT55ZWFyID0gaHRvbnMoMTkwMCArIHRtLT50bV95ZWFyKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9yZXNldF9yZXNvdXJjZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXJldHVybiBfX3NpbXBsZV9jbWQoYnRzLCBOTV9NVF9CUzExX1JFU0VUX1JFU09VUkNFKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9kYl90cmFuc21pc3Npb24oc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IGJlZ2luKQoreworCWlmIChiZWdpbikKKwkJcmV0dXJuIF9fc2ltcGxlX2NtZChidHMsIE5NX01UX0JTMTFfQkVHSU5fREJfVFgpOworCWVsc2UKKwkJcmV0dXJuIF9fc2ltcGxlX2NtZChidHMsIE5NX01UX0JTMTFfRU5EX0RCX1RYKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9jcmVhdGVfb2JqZWN0KHN0cnVjdCBnc21fYnRzICpidHMsCisJCQkJZW51bSBhYmlzX2JzMTFfb2JqdHlwZSB0eXBlLCB1X2ludDhfdCBpZHgsCisJCQkJdV9pbnQ4X3QgYXR0cl9sZW4sIGNvbnN0IHVfaW50OF90ICphdHRyKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwl1X2ludDhfdCAqY3VyOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgYXR0cl9sZW4sIE5NX01UX0JTMTFfQ1JFQVRFX09CSiwKKwkJCU5NX09DX0JTMTEsIHR5cGUsIDAsIGlkeCk7CisJY3VyID0gbXNnYl9wdXQobXNnLCBhdHRyX2xlbik7CisJbWVtY3B5KGN1ciwgYXR0ciwgYXR0cl9sZW4pOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfZGVsZXRlX29iamVjdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLAorCQkJCWVudW0gYWJpc19iczExX29ianR5cGUgdHlwZSwgdV9pbnQ4X3QgaWR4KQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDAsIE5NX01UX0JTMTFfREVMRVRFX09CSiwKKwkJCU5NX09DX0JTMTEsIHR5cGUsIDAsIGlkeCk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9jcmVhdGVfZW52YUJUU0Uoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgaWR4KQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwl1X2ludDhfdCB6ZXJvID0gMHgwMDsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDMsIE5NX01UX0JTMTFfQ1JFQVRFX09CSiwKKwkJCU5NX09DX0JTMTFfRU5WQUJUU0UsIDAsIGlkeCwgMHhmZik7CisJbXNnYl90bHZfcHV0KG1zZywgMHg5OSwgMSwgJnplcm8pOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfY3JlYXRlX2Jwb3J0KHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGlkeCkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCAwLCBOTV9NVF9CUzExX0NSRUFURV9PQkosIE5NX09DX0JTMTFfQlBPUlQsCisJCQlpZHgsIDB4ZmYsIDB4ZmYpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfZGVsZXRlX2Jwb3J0KHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGlkeCkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCAwLCBOTV9NVF9CUzExX0RFTEVURV9PQkosIE5NX09DX0JTMTFfQlBPUlQsCisJCQlpZHgsIDB4ZmYsIDB4ZmYpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK3N0YXRpYyBjb25zdCB1X2ludDhfdCBzbV9hdHRyW10gPSB7IE5NX0FUVF9URUksIE5NX0FUVF9BQklTX0NIQU5ORUwgfTsKK2ludCBhYmlzX25tX2JzMTFfZ2V0X29tbF90ZWlfdHMoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCAyK3NpemVvZihzbV9hdHRyKSwgTk1fTVRfR0VUX0FUVFIsIE5NX09DX1NJVEVfTUFOQUdFUiwKKwkJCTB4ZmYsIDB4ZmYsIDB4ZmYpOworCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9MSVNUX1JFUV9BVFRSLCBzaXplb2Yoc21fYXR0ciksIHNtX2F0dHIpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKKy8qIGxpa2UgYWJpc19ubV9jb25uX3RlcnJfdHJhZiArIHNldF90ZWkgKi8KK2ludCBhYmlzX25tX2JzMTFfY29ubl9vbWxfdGVpKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGUxX3BvcnQsCisJCQkgIHVfaW50OF90IGUxX3RpbWVzbG90LCB1X2ludDhfdCBlMV9zdWJzbG90LAorCQkJICB1X2ludDhfdCB0ZWkpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgYWJpc19ubV9jaGFubmVsICpjaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgc2l6ZW9mKCpjaCkrMiwgTk1fTVRfQlMxMV9TRVRfQVRUUiwKKwkJCU5NX09DX1NJVEVfTUFOQUdFUiwgMHhmZiwgMHhmZiwgMHhmZik7CisKKwljaCA9IChzdHJ1Y3QgYWJpc19ubV9jaGFubmVsICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpjaCkpOworCWZpbGxfbm1fY2hhbm5lbChjaCwgZTFfcG9ydCwgZTFfdGltZXNsb3QsIGUxX3N1YnNsb3QpOworCW1zZ2JfdHZfcHV0KG1zZywgTk1fQVRUX1RFSSwgdGVpKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX3NldF90cnhfcG93ZXIoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90IGxldmVsKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDMsIE5NX01UX0JTMTFfU0VUX0FUVFIsCisJCQlOTV9PQ19CUzExLCBCUzExX09CSl9QQSwgMHgwMCwgdHJ4LT5ucik7CisJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0JTMTFfVFhQV1IsIDEsICZsZXZlbCk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKHRyeC0+YnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX2dldF90cnhfcG93ZXIoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90IGF0dHIgPSBOTV9BVFRfQlMxMV9UWFBXUjsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIrc2l6ZW9mKGF0dHIpLCBOTV9NVF9HRVRfQVRUUiwKKwkJCU5NX09DX0JTMTEsIEJTMTFfT0JKX1BBLCAweDAwLCB0cngtPm5yKTsKKwltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfTElTVF9SRVFfQVRUUiwgc2l6ZW9mKGF0dHIpLCAmYXR0cik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKHRyeC0+YnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX2dldF9wbGxfbW9kZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwl1X2ludDhfdCBhdHRyW10gPSB7IE5NX0FUVF9CUzExX1BMTF9NT0RFIH07CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCAyK3NpemVvZihhdHRyKSwgTk1fTVRfR0VUX0FUVFIsCisJCQlOTV9PQ19CUzExLCBCUzExX09CSl9MSSwgMHgwMCwgMHgwMCk7CisJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0xJU1RfUkVRX0FUVFIsIHNpemVvZihhdHRyKSwgYXR0cik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9nZXRfY2NsayhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwl1X2ludDhfdCBhdHRyW10gPSB7IE5NX0FUVF9CUzExX0NDTEtfQUNDVVJBQ1ksCisJCQkgICAgTk1fQVRUX0JTMTFfQ0NMS19UWVBFIH07CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCAyK3NpemVvZihhdHRyKSwgTk1fTVRfR0VUX0FUVFIsCisJCQlOTV9PQ19CUzExLCBCUzExX09CSl9DQ0xLLCAweDAwLCAweDAwKTsKKwltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfTElTVF9SRVFfQVRUUiwgc2l6ZW9mKGF0dHIpLCBhdHRyKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworCit9CisKKy8vc3RhdGljIGNvbnN0IHVfaW50OF90IGJzMTFfbG9nb25fYzdbXSA9IHsgMHgwNywgMHhkOSwgMHgwMSwgMHgxMSwgMHgwZCwgMHgxMCwgMHgyMCB9OworCitpbnQgYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IG9uKQoreworCXJldHVybiBhYmlzX25tX2JzMTFfbG9nb24oYnRzLCAweDAyLCAiRkFDVE9SWSIsIG9uKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9pbmZpZWxkX2xvZ29uKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBvbikKK3sKKwlyZXR1cm4gYWJpc19ubV9iczExX2xvZ29uKGJ0cywgMHgwMywgIkZJRUxEICAiLCBvbik7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfbG9nb24oc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgbGV2ZWwsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBvbikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJc3RydWN0IGJzMTFfZGF0ZV90aW1lIGJkdDsKKworCWdldF9iczExX2RhdGVfdGltZSgmYmR0KTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlpZiAob24pIHsKKwkJdV9pbnQ4X3QgbGVuID0gMyoyICsgc2l6ZW9mKGJkdCkKKwkJCQkrIDEgKyBzdHJsZW4obmFtZSk7CisJCWZpbGxfb21fZm9tX2hkcihvaCwgbGVuLCBOTV9NVF9CUzExX0xNVF9MT0dPTiwKKwkJCQlOTV9PQ19CUzExX0JUU0UsIDB4ZmYsIDB4ZmYsIDB4ZmYpOworCQltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfQlMxMV9MTVRfTE9HSU5fVElNRSwKKwkJCSAgICAgc2l6ZW9mKGJkdCksICh1X2ludDhfdCAqKSAmYmR0KTsKKwkJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0JTMTFfTE1UX1VTRVJfQUNDX0xFViwKKwkJCSAgICAgMSwgJmxldmVsKTsKKwkJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0JTMTFfTE1UX1VTRVJfTkFNRSwKKwkJCSAgICAgc3RybGVuKG5hbWUpLCAodV9pbnQ4X3QgKiluYW1lKTsKKwl9IGVsc2UgeworCQlmaWxsX29tX2ZvbV9oZHIob2gsIDAsIE5NX01UX0JTMTFfTE1UX0xPR09GRiwKKwkJCQlOTV9PQ19CUzExX0JUU0UsIDB4ZmYsIDB4ZmYsIDB4ZmYpOworCX0KKwkKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9zZXRfdHJ4MV9wdyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBjb25zdCBjaGFyICpwYXNzd29yZCkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2c7CisKKwlpZiAoc3RybGVuKHBhc3N3b3JkKSAhPSAxMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKyAJbXNnID0gbm1fbXNnYl9hbGxvYygpOworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIrc3RybGVuKHBhc3N3b3JkKSwgTk1fTVRfQlMxMV9TRVRfQVRUUiwKKwkJCU5NX09DX0JTMTEsIEJTMTFfT0JKX1RSWDEsIDB4MDAsIDB4MDApOworCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9CUzExX1BBU1NXT1JELCAxMCwgKGNvbnN0IHVfaW50OF90ICopcGFzc3dvcmQpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKKy8qIGNoYW5nZSB0aGUgQlMtMTEgUExMIE1vZGUgdG8gZWl0aGVyIGxvY2tlZCAoRTEgZGVyaXZlZCkgb3Igc3RhbmRhbG9uZSAqLworaW50IGFiaXNfbm1fYnMxMV9zZXRfcGxsX2xvY2tlZChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgbG9ja2VkKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwl1X2ludDhfdCB0bHZfdmFsdWU7CisJCisJbXNnID0gbm1fbXNnYl9hbGxvYygpOworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDMsIE5NX01UX0JTMTFfU0VUX0FUVFIsIE5NX09DX0JTMTEsCisJCQlCUzExX09CSl9MSSwgMHgwMCwgMHgwMCk7CisKKwlpZiAobG9ja2VkKQorCQl0bHZfdmFsdWUgPSBCUzExX0xJX1BMTF9MT0NLRUQ7CisJZWxzZQorCQl0bHZfdmFsdWUgPSBCUzExX0xJX1BMTF9TVEFOREFMT05FOworCQorCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9CUzExX1BMTF9NT0RFLCAxLCAmdGx2X3ZhbHVlKTsKKwkKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworLyogU2V0IHRoZSBjYWxpYnJhdGlvbiB2YWx1ZSBvZiB0aGUgUExMICh3b3JrIHZhbHVlL3NldCB2YWx1ZSkKKyAqIEl0IGRlcGVuZHMgb24gdGhlIGxvZ2luIHdoaWNoIG9uZSBpcyBjaGFuZ2VkICovCitpbnQgYWJpc19ubV9iczExX3NldF9wbGwoc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IHZhbHVlKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwl1X2ludDhfdCB0bHZfdmFsdWVbMl07CisKKwltc2cgPSBubV9tc2diX2FsbG9jKCk7CisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMywgTk1fTVRfQlMxMV9TRVRfQVRUUiwgTk1fT0NfQlMxMSwKKwkJCUJTMTFfT0JKX1RSWDEsIDB4MDAsIDB4MDApOworCisJdGx2X3ZhbHVlWzBdID0gdmFsdWU+Pjg7CisJdGx2X3ZhbHVlWzFdID0gdmFsdWUmMHhmZjsKKworCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9CUzExX1BMTCwgMiwgdGx2X3ZhbHVlKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX2dldF9zdGF0ZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXJldHVybiBfX3NpbXBsZV9jbWQoYnRzLCBOTV9NVF9CUzExX0dFVF9TVEFURSk7Cit9CisKKy8qIEJTMTEgU1dMICovCisKK3ZvaWQgKnRhbGxfZmxlX2N0eDsKKworc3RydWN0IGFiaXNfbm1fYnMxMV9zdyB7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwljaGFyIHN3bF9mbmFtZVtQQVRIX01BWF07CisJdV9pbnQ4X3Qgd2luX3NpemU7CisJaW50IGZvcmNlZDsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBmaWxlX2xpc3Q7CisJZ3NtX2NiZm4gKnVzZXJfY2I7CS8qIHNwZWNpZmllZCBieSB0aGUgdXNlciAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgYWJpc19ubV9iczExX3N3IF9nX2JzMTFfc3csICpnX2JzMTFfc3cgPSAmX2dfYnMxMV9zdzsKKworc3RydWN0IGZpbGVfbGlzdF9lbnRyeSB7CisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKwljaGFyIGZuYW1lW1BBVEhfTUFYXTsKK307CisKK3N0cnVjdCBmaWxlX2xpc3RfZW50cnkgKmZsX2RlcXVldWUoc3RydWN0IGxsaXN0X2hlYWQgKnF1ZXVlKQoreworCXN0cnVjdCBsbGlzdF9oZWFkICpsaDsKKworCWlmIChsbGlzdF9lbXB0eShxdWV1ZSkpCisJCXJldHVybiBOVUxMOworCisJbGggPSBxdWV1ZS0+bmV4dDsKKwlsbGlzdF9kZWwobGgpOworCQorCXJldHVybiBsbGlzdF9lbnRyeShsaCwgc3RydWN0IGZpbGVfbGlzdF9lbnRyeSwgbGlzdCk7Cit9CisKK3N0YXRpYyBpbnQgYnMxMV9yZWFkX3N3bF9maWxlKHN0cnVjdCBhYmlzX25tX2JzMTFfc3cgKmJzMTFfc3cpCit7CisJY2hhciBsaW5lYnVmWzI1NV07CisJc3RydWN0IGxsaXN0X2hlYWQgKmxoLCAqbGgyOworCUZJTEUgKnN3bDsKKwlpbnQgcmMgPSAwOworCisJc3dsID0gZm9wZW4oYnMxMV9zdy0+c3dsX2ZuYW1lLCAiciIpOworCWlmICghc3dsKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIHplcm8gdGhlIHN0YWxlIGZpbGUgbGlzdCwgaWYgYW55ICovCisJbGxpc3RfZm9yX2VhY2hfc2FmZShsaCwgbGgyLCAmYnMxMV9zdy0+ZmlsZV9saXN0KSB7CisJCWxsaXN0X2RlbChsaCk7CisJCXRhbGxvY19mcmVlKGxoKTsKKwl9CisKKwl3aGlsZSAoZmdldHMobGluZWJ1Ziwgc2l6ZW9mKGxpbmVidWYpLCBzd2wpKSB7CisJCWNoYXIgZmlsZV9pZFsxMisxXTsKKwkJY2hhciBmaWxlX3ZlcnNpb25bODArMV07CisJCXN0cnVjdCBmaWxlX2xpc3RfZW50cnkgKmZsZTsKKwkJc3RhdGljIGNoYXIgZGlyW1BBVEhfTUFYXTsKKworCQlpZiAoc3RybGVuKGxpbmVidWYpIDwgNCkKKwkJCWNvbnRpbnVlOworCQorCQlyYyA9IHNzY2FuZihsaW5lYnVmKzQsICIlMTJzOiU4MHNcclxuIiwgZmlsZV9pZCwgZmlsZV92ZXJzaW9uKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcGVycm9yKCJFUlIgcGFyc2luZyBTV0wgZmlsZSIpOworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKHJjIDwgMikKKwkJCWNvbnRpbnVlOworCisJCWZsZSA9IHRhbGxvY196ZXJvKHRhbGxfZmxlX2N0eCwgc3RydWN0IGZpbGVfbGlzdF9lbnRyeSk7CisJCWlmICghZmxlKSB7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qIGNvbnN0cnVjdCBuZXcgZmlsZW5hbWUgKi8KKwkJc3RybmNweShkaXIsIGJzMTFfc3ctPnN3bF9mbmFtZSwgc2l6ZW9mKGRpcikpOworCQlzdHJuY2F0KGZsZS0+Zm5hbWUsIGRpcm5hbWUoZGlyKSwgc2l6ZW9mKGZsZS0+Zm5hbWUpIC0gMSk7CisJCXN0cmNhdChmbGUtPmZuYW1lLCAiLyIpOworCQlzdHJuY2F0KGZsZS0+Zm5hbWUsIGZpbGVfaWQsIHNpemVvZihmbGUtPmZuYW1lKSAtIDEgLXN0cmxlbihmbGUtPmZuYW1lKSk7CisJCQorCQlsbGlzdF9hZGRfdGFpbCgmZmxlLT5saXN0LCAmYnMxMV9zdy0+ZmlsZV9saXN0KTsKKwl9CisKK291dDoKKwlmY2xvc2Uoc3dsKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIGJzMTEgc3dsb2FkIHNwZWNpZmljIGNhbGxiYWNrLCBwYXNzZWQgdG8gYWJpc19ubSBjb3JlIHN3bG9hZCAqLworc3RhdGljIGludCBiczExX3N3bG9hZF9jYmZuKHVuc2lnbmVkIGludCBob29rLCB1bnNpZ25lZCBpbnQgZXZlbnQsCisJCQkgICAgc3RydWN0IG1zZ2IgKm1zZywgdm9pZCAqZGF0YSwgdm9pZCAqcGFyYW0pCit7CisJc3RydWN0IGFiaXNfbm1fYnMxMV9zdyAqYnMxMV9zdyA9IGRhdGE7CisJc3RydWN0IGZpbGVfbGlzdF9lbnRyeSAqZmxlOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBOTV9NVF9MT0FEX0VORF9BQ0s6CisJCWZsZSA9IGZsX2RlcXVldWUoJmJzMTFfc3ctPmZpbGVfbGlzdCk7CisJCWlmIChmbGUpIHsKKwkJCS8qIHN0YXJ0IGRvd25sb2FkIHRoZSBuZXh0IGZpbGUgb2Ygb3VyIGZpbGUgbGlzdCAqLworCQkJcmMgPSBhYmlzX25tX3NvZnR3YXJlX2xvYWQoYnMxMV9zdy0+YnRzLCBmbGUtPmZuYW1lLAorCQkJCQkJICAgYnMxMV9zdy0+d2luX3NpemUsCisJCQkJCQkgICBiczExX3N3LT5mb3JjZWQsCisJCQkJCQkgICAmYnMxMV9zd2xvYWRfY2JmbiwgYnMxMV9zdyk7CisJCQl0YWxsb2NfZnJlZShmbGUpOworCQl9IGVsc2UgeworCQkJLyogYWN0aXZhdGUgdGhlIFNXTCAqLworCQkJcmMgPSBhYmlzX25tX3NvZnR3YXJlX2FjdGl2YXRlKGJzMTFfc3ctPmJ0cywKKwkJCQkJCQliczExX3N3LT5zd2xfZm5hbWUsCisJCQkJCQkJYnMxMV9zd2xvYWRfY2JmbiwKKwkJCQkJCQliczExX3N3KTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5NX01UX0xPQURfU0VHX0FDSzoKKwljYXNlIE5NX01UX0xPQURfRU5EX05BQ0s6CisJY2FzZSBOTV9NVF9MT0FEX0lOSVRfQUNLOgorCWNhc2UgTk1fTVRfTE9BRF9JTklUX05BQ0s6CisJY2FzZSBOTV9NVF9BQ1RJVkFURV9TV19OQUNLOgorCWNhc2UgTk1fTVRfQUNUSVZBVEVfU1dfQUNLOgorCWRlZmF1bHQ6CisJCS8qIGZhbGx0aHJvdWdoIHRvIHRoZSB1c2VyIGNhbGxiYWNrICovCisJCWlmIChiczExX3N3LT51c2VyX2NiKQorCQkJcmMgPSBiczExX3N3LT51c2VyX2NiKGhvb2ssIGV2ZW50LCBtc2csIE5VTEwsIE5VTEwpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIFNpZW1lbnMgcHJvdmlkZXMgYSBTV0wgZmlsZSB0aGF0IGlzIGEgbWVyZSBsaXN0aW5nIG9mIGFsbCB0aGUgb3RoZXIKKyAqIGZpbGVzIHRoYXQgYXJlIHBhcnQgb2YgYSBzb2Z0d2FyZSByZWxlYXNlLiAgV2UgbmVlZCB0byB1cGxvYWQgZmlyc3QKKyAqIHRoZSBsaXN0IGZpbGUsIGFuZCB0aGVuIGVhY2ggZmlsZSB0aGF0IGlzIGxpc3RlZCBpbiB0aGUgbGlzdCBmaWxlICovCitpbnQgYWJpc19ubV9iczExX2xvYWRfc3dsKHN0cnVjdCBnc21fYnRzICpidHMsIGNvbnN0IGNoYXIgKmZuYW1lLAorCQkJICB1X2ludDhfdCB3aW5fc2l6ZSwgaW50IGZvcmNlZCwgZ3NtX2NiZm4gKmNiZm4pCit7CisJc3RydWN0IGFiaXNfbm1fYnMxMV9zdyAqYnMxMV9zdyA9IGdfYnMxMV9zdzsKKwlzdHJ1Y3QgZmlsZV9saXN0X2VudHJ5ICpmbGU7CisJaW50IHJjID0gMDsKKworCUlOSVRfTExJU1RfSEVBRCgmYnMxMV9zdy0+ZmlsZV9saXN0KTsKKwliczExX3N3LT5idHMgPSBidHM7CisJYnMxMV9zdy0+d2luX3NpemUgPSB3aW5fc2l6ZTsKKwliczExX3N3LT51c2VyX2NiID0gY2JmbjsKKwliczExX3N3LT5mb3JjZWQgPSBmb3JjZWQ7CisKKwlzdHJuY3B5KGJzMTFfc3ctPnN3bF9mbmFtZSwgZm5hbWUsIHNpemVvZihiczExX3N3LT5zd2xfZm5hbWUpKTsKKwlyYyA9IGJzMTFfcmVhZF9zd2xfZmlsZShiczExX3N3KTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwkvKiBkZXF1ZXVlIG5leHQgaXRlbSBpbiBmaWxlIGxpc3QgKi8KKwlmbGUgPSBmbF9kZXF1ZXVlKCZiczExX3N3LT5maWxlX2xpc3QpOworCWlmICghZmxlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIHN0YXJ0IGRvd25sb2FkIHRoZSBuZXh0IGZpbGUgb2Ygb3VyIGZpbGUgbGlzdCAqLworCXJjID0gYWJpc19ubV9zb2Z0d2FyZV9sb2FkKGJ0cywgZmxlLT5mbmFtZSwgd2luX3NpemUsIGZvcmNlZCwKKwkJCQkgICBiczExX3N3bG9hZF9jYmZuLCBiczExX3N3KTsKKwl0YWxsb2NfZnJlZShmbGUpOworCXJldHVybiByYzsKK30KKworI2lmIDAKK3N0YXRpYyB1X2ludDhfdCByZXFfYXR0cl9idHNlW10gPSB7CisJTk1fQVRUX0FETV9TVEFURSwgTk1fQVRUX0JTMTFfTE1UX0xPR09OX1NFU1NJT04sCisJTk1fQVRUX0JTMTFfTE1UX0xPR0lOX1RJTUUsIE5NX0FUVF9CUzExX0xNVF9VU0VSX0FDQ19MRVYsCisJTk1fQVRUX0JTMTFfTE1UX1VTRVJfTkFNRSwKKworCTB4YWYsIE5NX0FUVF9CUzExX1JYX09GRlNFVCwgTk1fQVRUX0JTMTFfVkVORE9SX05BTUUsCisKKwlOTV9BVFRfQlMxMV9TV19MT0FEX0lOVEVOREVELCBOTV9BVFRfQlMxMV9TV19MT0FEX1NBRkVUWSwKKworCU5NX0FUVF9CUzExX1NXX0xPQURfU1RPUkVEIH07CisKK3N0YXRpYyB1X2ludDhfdCByZXFfYXR0cl9idHNtW10gPSB7CisJTk1fQVRUX0FCSVNfQ0hBTk5FTCwgTk1fQVRUX1RFSSwgTk1fQVRUX0JTMTFfQUJJU19FWFRfVElNRSwKKwlOTV9BVFRfQURNX1NUQVRFLCBOTV9BVFRfQVZBSUxfU1RBVFVTLCAweGNlLCBOTV9BVFRfRklMRV9JRCwKKwlOTV9BVFRfRklMRV9WRVJTSU9OLCBOTV9BVFRfT1BFUl9TVEFURSwgMHhlOCwgTk1fQVRUX0JTMTFfQUxMX1RFU1RfQ0FURywKKwlOTV9BVFRfU1dfREVTQ1IsIE5NX0FUVF9HRVRfQVJJIH07CisjZW5kaWYKKwkKK3N0YXRpYyB1X2ludDhfdCByZXFfYXR0cltdID0geworCU5NX0FUVF9BRE1fU1RBVEUsIE5NX0FUVF9BVkFJTF9TVEFUVVMsIDB4YTgsIE5NX0FUVF9PUEVSX1NUQVRFLAorCTB4ZDUsIDB4YTEsIE5NX0FUVF9CUzExX0VTTl9GV19DT0RFX05PLCBOTV9BVFRfQlMxMV9FU05fSFdfQ09ERV9OTywKKwkweDQyLCBOTV9BVFRfQlMxMV9FU05fUENCX1NFUklBTCwgTk1fQVRUX0JTMTFfUExMIH07CisKK2ludCBhYmlzX25tX2JzMTFfZ2V0X3Nlcm5vKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCS8qIFNpZW1lbnNIVyBDQ1RSTCBvYmplY3QgKi8KKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIrc2l6ZW9mKHJlcV9hdHRyKSwgTk1fTVRfR0VUX0FUVFIsIE5NX09DX0JTMTEsCisJCQkweDAzLCAweDAwLCAweDAwKTsKKwltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfTElTVF9SRVFfQVRUUiwgc2l6ZW9mKHJlcV9hdHRyKSwgcmVxX2F0dHIpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfc2V0X2V4dF90aW1lKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXN0cnVjdCBiczExX2RhdGVfdGltZSBhZXQ7CisKKwlnZXRfYnMxMV9kYXRlX3RpbWUoJmFldCk7CisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCS8qIFNpZW1lbnNIVyBDQ1RSTCBvYmplY3QgKi8KKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIrc2l6ZW9mKGFldCksIE5NX01UX0JTMTFfU0VUX0FUVFIsIE5NX09DX1NJVEVfTUFOQUdFUiwKKwkJCTB4ZmYsIDB4ZmYsIDB4ZmYpOworCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9CUzExX0FCSVNfRVhUX1RJTUUsIHNpemVvZihhZXQpLCAodV9pbnQ4X3QgKikgJmFldCk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9zZXRfYnBvcnRfbGluZV9jZmcoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgYnBvcnQsIGVudW0gYWJpc19iczExX2xpbmVfY2ZnIGxpbmVfY2ZnKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgYnMxMV9kYXRlX3RpbWUgYWV0OworCisJZ2V0X2JzMTFfZGF0ZV90aW1lKCZhZXQpOworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIsIE5NX01UX0JTMTFfU0VUX0FUVFIsIE5NX09DX0JTMTFfQlBPUlQsCisJCQlicG9ydCwgMHhmZiwgMHgwMik7CisJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfQlMxMV9MSU5FX0NGRywgbGluZV9jZmcpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKKy8qIGlwLmFjY2VzcyBuYW5vQlRTIHNwZWNpZmljIGNvbW1hbmRzICovCitzdGF0aWMgY29uc3QgY2hhciBpcGFjY2Vzc19tYWdpY1tdID0gImNvbS5pcGFjY2VzcyI7CisKKworc3RhdGljIGludCBhYmlzX25tX3J4X2lwYWNjKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaCA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2g7CisJdV9pbnQ4X3QgaWRzdHJsZW4gPSBvaC0+ZGF0YVswXTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgaXBhY2NfYWNrX3NpZ25hbF9kYXRhIHNpZ25hbDsKKworCWlmIChzdHJuY21wKChjaGFyICopJm9oLT5kYXRhWzFdLCBpcGFjY2Vzc19tYWdpYywgaWRzdHJsZW4pKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiaWQgc3RyaW5nIGlzIG5vdCBjb20uaXBhY2Nlc3MgIT8hXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZm9oID0gKHN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKikgKG9oLT5kYXRhICsgMSArIGlkc3RybGVuKTsKKwlhYmlzX25tX3Rsdl9wYXJzZSgmdHAsIG1zZy0+dHJ4LT5idHMsIGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCisJZGVidWdwX2ZvaChmb2gpOworCisJREVCVUdQQyhETk0sICJJUEFDQ0VTUygweCUwMngpOiAiLCBmb2gtPm1zZ190eXBlKTsKKworCXN3aXRjaCAoZm9oLT5tc2dfdHlwZSkgeworCWNhc2UgTk1fTVRfSVBBQ0NfUlNMX0NPTk5FQ1RfQUNLOgorCQlERUJVR1BDKEROTSwgIlJTTCBDT05ORUNUIEFDSyAiKTsKKwkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9JUEFDQ19EU1RfSVApKQorCQkJREVCVUdQQyhETk0sICJJUD0lcyAiLAorCQkJCWluZXRfbnRvYSgqKChzdHJ1Y3QgaW5fYWRkciAqKQorCQkJCQlUTFZQX1ZBTCgmdHAsIE5NX0FUVF9JUEFDQ19EU1RfSVApKSkpOworCQlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX0lQQUNDX0RTVF9JUF9QT1JUKSkKKwkJCURFQlVHUEMoRE5NLCAiUE9SVD0ldSAiLAorCQkJCW50b2hzKCooKHVfaW50MTZfdCAqKQorCQkJCQlUTFZQX1ZBTCgmdHAsIE5NX0FUVF9JUEFDQ19EU1RfSVBfUE9SVCkpKSk7CisJCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfSVBBQ0NfU1RSRUFNX0lEKSkKKwkJCURFQlVHUEMoRE5NLCAiU1RSRUFNPTB4JTAyeCAiLAorCQkJCQkqVExWUF9WQUwoJnRwLCBOTV9BVFRfSVBBQ0NfU1RSRUFNX0lEKSk7CisJCURFQlVHUEMoRE5NLCAiXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVF9OQUNLOgorCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlJTTCBDT05ORUNUIE5BQ0sgIik7CisJCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfTkFDS19DQVVTRVMpKQorCQkJREVCVUdQQyhETk0sICIgQ0FVU0U9JXNcbiIsCisJCQkJbmFja19jYXVzZV9uYW1lKCpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9OQUNLX0NBVVNFUykpKTsKKwkJZWxzZQorCQkJREVCVUdQQyhETk0sICJcbiIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0lQQUNDX1NFVF9OVkFUVFJfQUNLOgorCQlERUJVR1BDKEROTSwgIlNFVCBOVkFUVFIgQUNLXG4iKTsKKwkJLyogRklYTUU6IGRlY29kZSBhbmQgc2hvdyB0aGUgYWN0dWFsIGF0dHJpYnV0ZXMgKi8KKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9JUEFDQ19TRVRfTlZBVFRSX05BQ0s6CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiU0VUIE5WQVRUUiBOQUNLICIpOworCQlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX05BQ0tfQ0FVU0VTKSkKKwkJCUxPR1BDKEROTSwgTE9HTF9FUlJPUiwgIiBDQVVTRT0lc1xuIiwKKwkJCQluYWNrX2NhdXNlX25hbWUoKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX05BQ0tfQ0FVU0VTKSkpOworCQllbHNlCisJCQlMT0dQQyhETk0sIExPR0xfRVJST1IsICJcbiIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0lQQUNDX0dFVF9OVkFUVFJfQUNLOgorCQlERUJVR1BDKEROTSwgIkdFVCBOVkFUVFIgQUNLXG4iKTsKKwkJLyogRklYTUU6IGRlY29kZSBhbmQgc2hvdyB0aGUgYWN0dWFsIGF0dHJpYnV0ZXMgKi8KKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9JUEFDQ19HRVRfTlZBVFRSX05BQ0s6CisJCUxPR1BDKEROTSwgTE9HTF9FUlJPUiwgIkdFVCBOVkFUVFIgTkFDSyAiKTsKKwkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9OQUNLX0NBVVNFUykpCisJCQlMT0dQQyhETk0sIExPR0xfRVJST1IsICIgQ0FVU0U9JXNcbiIsCisJCQkJbmFja19jYXVzZV9uYW1lKCpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9OQUNLX0NBVVNFUykpKTsKKwkJZWxzZQorCQkJTE9HUEMoRE5NLCBMT0dMX0VSUk9SLCAiXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9JUEFDQ19TRVRfQVRUUl9BQ0s6CisJCURFQlVHUEMoRE5NLCAiU0VUIEFUVFIgQUNLXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9JUEFDQ19TRVRfQVRUUl9OQUNLOgorCQlMT0dQQyhETk0sIExPR0xfRVJST1IsICJTRVQgQVRUUiBOQUNLICIpOworCQlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX05BQ0tfQ0FVU0VTKSkKKwkJCUxPR1BDKEROTSwgTE9HTF9FUlJPUiwgIiBDQVVTRT0lc1xuIiwKKwkJCQluYWNrX2NhdXNlX25hbWUoKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX05BQ0tfQ0FVU0VTKSkpOworCQllbHNlCisJCQlMT0dQQyhETk0sIExPR0xfRVJST1IsICJcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR1BDKEROTSwgInVua25vd25cbiIpOworCQlicmVhazsKKwl9CisKKwkvKiBzaWduYWwgaGFuZGxpbmcgKi8KKwlzd2l0Y2ggIChmb2gtPm1zZ190eXBlKSB7CisJY2FzZSBOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVF9OQUNLOgorCWNhc2UgTk1fTVRfSVBBQ0NfU0VUX05WQVRUUl9OQUNLOgorCWNhc2UgTk1fTVRfSVBBQ0NfR0VUX05WQVRUUl9OQUNLOgorCQlzaWduYWwuYnRzID0gbXNnLT50cngtPmJ0czsKKwkJc2lnbmFsLm1zZ190eXBlID0gZm9oLT5tc2dfdHlwZTsKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX05NLCBTX05NX0lQQUNDX05BQ0ssICZzaWduYWwpOworCQlicmVhazsKKwljYXNlIE5NX01UX0lQQUNDX1NFVF9OVkFUVFJfQUNLOgorCQlzaWduYWwuYnRzID0gbXNnLT50cngtPmJ0czsKKwkJc2lnbmFsLm1zZ190eXBlID0gZm9oLT5tc2dfdHlwZTsKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX05NLCBTX05NX0lQQUNDX0FDSywgJnNpZ25hbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisvKiBzZW5kIGFuIGlwLWFjY2VzcyBtYW51ZmFjdHVyZXIgc3BlY2lmaWMgbWVzc2FnZSAqLworaW50IGFiaXNfbm1faXBhY2Nlc3NfbXNnKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG1zZ190eXBlLAorCQkJIHVfaW50OF90IG9ial9jbGFzcywgdV9pbnQ4X3QgYnRzX25yLAorCQkJIHVfaW50OF90IHRyeF9uciwgdV9pbnQ4X3QgdHNfbnIsCisJCQkgdV9pbnQ4X3QgKmF0dHIsIGludCBhdHRyX2xlbikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oOworCXVfaW50OF90ICpkYXRhOworCisJLyogY29uc3RydWN0IHRoZSAxMi4yMSBPTSBoZWFkZXIsIG9ic2VydmUgdGhlIGVycm9uZW91cyBsZW5ndGggKi8KKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKm9oKSk7CisJZmlsbF9vbV9oZHIob2gsIHNpemVvZigqZm9oKSArIGF0dHJfbGVuKTsKKwlvaC0+bWRpc2MgPSBBQklTX09NX01ESVNDX01BTlVGOworCisJLyogYWRkIHRoZSBpcC5hY2Nlc3MgbWFnaWMgKi8KKwlkYXRhID0gbXNnYl9wdXQobXNnLCBzaXplb2YoaXBhY2Nlc3NfbWFnaWMpKzEpOworCSpkYXRhKysgPSBzaXplb2YoaXBhY2Nlc3NfbWFnaWMpOworCW1lbWNweShkYXRhLCBpcGFjY2Vzc19tYWdpYywgc2l6ZW9mKGlwYWNjZXNzX21hZ2ljKSk7CisKKwkvKiBmaWxsIHRoZSAxMi4yMSBGT00gaGVhZGVyICovCisJZm9oID0gKHN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmZvaCkpOworCWZvaC0+bXNnX3R5cGUgPSBtc2dfdHlwZTsKKwlmb2gtPm9ial9jbGFzcyA9IG9ial9jbGFzczsKKwlmb2gtPm9ial9pbnN0LmJ0c19uciA9IGJ0c19ucjsKKwlmb2gtPm9ial9pbnN0LnRyeF9uciA9IHRyeF9ucjsKKwlmb2gtPm9ial9pbnN0LnRzX25yID0gdHNfbnI7CisKKwlpZiAoYXR0ciAmJiBhdHRyX2xlbikgeworCQlkYXRhID0gbXNnYl9wdXQobXNnLCBhdHRyX2xlbik7CisJCW1lbWNweShkYXRhLCBhdHRyLCBhdHRyX2xlbik7CisJfQorCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKKy8qIHNldCBzb21lIGF0dHJpYnV0ZXMgaW4gTlZSQU0gKi8KK2ludCBhYmlzX25tX2lwYWNjZXNzX3NldF9udmF0dHIoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90ICphdHRyLAorCQkJCWludCBhdHRyX2xlbikKK3sKKwlyZXR1cm4gYWJpc19ubV9pcGFjY2Vzc19tc2codHJ4LT5idHMsIE5NX01UX0lQQUNDX1NFVF9OVkFUVFIsCisJCQkJICAgIE5NX09DX0JBU0VCX1RSQU5TQywgMCwgdHJ4LT5uciwgMHhmZiwgYXR0ciwKKwkJCQkgICAgYXR0cl9sZW4pOworfQorCitpbnQgYWJpc19ubV9pcGFjY2Vzc19yc2xfY29ubmVjdChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwKKwkJCQkgdV9pbnQzMl90IGlwLCB1X2ludDE2X3QgcG9ydCwgdV9pbnQ4X3Qgc3RyZWFtKQoreworCXN0cnVjdCBpbl9hZGRyIGlhOworCXVfaW50OF90IGF0dHJbXSA9IHsgTk1fQVRUX0lQQUNDX1NUUkVBTV9JRCwgMCwKKwkJCSAgICBOTV9BVFRfSVBBQ0NfRFNUX0lQX1BPUlQsIDAsIDAsCisJCQkgICAgTk1fQVRUX0lQQUNDX0RTVF9JUCwgMCwgMCwgMCwgMCB9OworCisJaW50IGF0dHJfbGVuID0gc2l6ZW9mKGF0dHIpOworCisJaWEuc19hZGRyID0gaHRvbmwoaXApOworCWF0dHJbMV0gPSBzdHJlYW07CisJYXR0clszXSA9IHBvcnQgPj4gODsKKwlhdHRyWzRdID0gcG9ydCAmIDB4ZmY7CisJKih1X2ludDMyX3QgKikoYXR0cis2KSA9IGlhLnNfYWRkcjsKKworCS8qIGlmIGlwID09IDAsIHdlIHVzZSB0aGUgZGVmYXVsdCBJUCAqLworCWlmIChpcCA9PSAwKQorCQlhdHRyX2xlbiAtPSA1OworCisJREVCVUdQKEROTSwgImlwLmFjY2VzcyBSU0wgQ09OTkVDVCBJUD0lcyBQT1JUPSV1IFNUUkVBTT0weCUwMnhcbiIsCisJCWluZXRfbnRvYShpYSksIHBvcnQsIHN0cmVhbSk7CisKKwlyZXR1cm4gYWJpc19ubV9pcGFjY2Vzc19tc2codHJ4LT5idHMsIE5NX01UX0lQQUNDX1JTTF9DT05ORUNULAorCQkJCSAgICBOTV9PQ19CQVNFQl9UUkFOU0MsIHRyeC0+YnRzLT5idHNfbnIsCisJCQkJICAgIHRyeC0+bnIsIDB4ZmYsIGF0dHIsIGF0dHJfbGVuKTsKK30KKworLyogcmVzdGFydCAvIHJlYm9vdCBhbiBpcC5hY2Nlc3MgbmFub0JUUyAqLworaW50IGFiaXNfbm1faXBhY2Nlc3NfcmVzdGFydChzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXJldHVybiBfX3NpbXBsZV9jbWQoYnRzLCBOTV9NVF9JUEFDQ19SRVNUQVJUKTsKK30KKworaW50IGFiaXNfbm1faXBhY2Nlc3Nfc2V0X2F0dHIoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLAorCQkJCXVfaW50OF90IGJ0c19uciwgdV9pbnQ4X3QgdHJ4X25yLCB1X2ludDhfdCB0c19uciwKKwkJCQl1X2ludDhfdCAqYXR0ciwgdV9pbnQ4X3QgYXR0cl9sZW4pCit7CisJcmV0dXJuIGFiaXNfbm1faXBhY2Nlc3NfbXNnKGJ0cywgTk1fTVRfSVBBQ0NfU0VUX0FUVFIsCisJCQkJICAgIG9ial9jbGFzcywgYnRzX25yLCB0cnhfbnIsIHRzX25yLAorCQkJCSAgICAgYXR0ciwgYXR0cl9sZW4pOworfQorCit2b2lkIGFiaXNfbm1faXBhY2Nlc3NfY2dpKHVfaW50OF90ICpidWYsIHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJLyogd2Ugc2ltcGx5IHJldXNlIHRoZSBHU000OCBmdW5jdGlvbiBhbmQgb3ZlcndyaXRlIHRoZSBSQUMKKwkgKiB3aXRoIHRoZSBDZWxsIElEICovCisJZ3NtNDhfcmFfaWRfYnlfYnRzKGJ1ZiwgYnRzKTsKKwkqKCh1X2ludDE2X3QgKikoYnVmICsgNSkpID0gaHRvbnMoYnRzLT5jZWxsX2lkZW50aXR5KTsKK30KKwordm9pZCBnc21fdHJ4X2xvY2tfcmYoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIGludCBsb2NrZWQpCit7CisJaW50IG5ld19zdGF0ZSA9IGxvY2tlZCA/IE5NX1NUQVRFX0xPQ0tFRCA6IE5NX1NUQVRFX1VOTE9DS0VEOworCisJdHJ4LT5ubV9zdGF0ZS5hZG1pbmlzdHJhdGl2ZSA9IG5ld19zdGF0ZTsKKwlpZiAoIXRyeC0+YnRzIHx8ICF0cngtPmJ0cy0+b21sX2xpbmspCisJCXJldHVybjsKKworCWFiaXNfbm1fY2hnX2FkbV9zdGF0ZSh0cngtPmJ0cywgTk1fT0NfUkFESU9fQ0FSUklFUiwKKwkJCSAgICAgIHRyeC0+YnRzLT5idHNfbnIsIHRyeC0+bnIsIDB4ZmYsCisJCQkgICAgICBuZXdfc3RhdGUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBpcGFjY190ZXN0cmVzX25hbWVzW10gPSB7CisJeyBOTV9JUEFDQ19URVNUUkVTX1NVQ0NFU1MsCSJTVUNDRVNTIiB9LAorCXsgTk1fSVBBQ0NfVEVTVFJFU19USU1FT1VULAkiVElNRU9VVCIgfSwKKwl7IE5NX0lQQUNDX1RFU1RSRVNfTk9fQ0hBTlMsCSJOTyBDSEFOTkVMUyIgfSwKKwl7IE5NX0lQQUNDX1RFU1RSRVNfUEFSVElBTCwJIlBBUlRJQUwiIH0sCisJeyBOTV9JUEFDQ19URVNUUkVTX1NUT1BQRUQsCSJTVE9QUEVEIiB9LAorCXsgMCwJCQkJTlVMTCB9Cit9OworCitjb25zdCBjaGFyICppcGFjY190ZXN0cmVzX25hbWUodV9pbnQ4X3QgcmVzKQoreworCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKGlwYWNjX3Rlc3RyZXNfbmFtZXMsIHJlcyk7Cit9CisKK3ZvaWQgaXBhY19wYXJzZV9jZ2koc3RydWN0IGNlbGxfZ2xvYmFsX2lkICpjaWQsIGNvbnN0IHVfaW50OF90ICpidWYpCit7CisJY2lkLT5tY2MgPSAoYnVmWzBdICYgMHhmKSAqIDEwMDsKKwljaWQtPm1jYyArPSAoYnVmWzBdID4+IDQpICogIDEwOworCWNpZC0+bWNjICs9IChidWZbMV0gJiAweGYpICogIDE7CisKKwlpZiAoYnVmWzFdID4+IDQgPT0gMHhmKSB7CisJCWNpZC0+bW5jID0gKGJ1ZlsyXSAmIDB4ZikgKiAxMDsKKwkJY2lkLT5tbmMgKz0gKGJ1ZlsyXSA+PiA0KSAqICAxOworCX0gZWxzZSB7CisJCWNpZC0+bW5jID0gKGJ1ZlsyXSAmIDB4ZikgKiAxMDA7CisJCWNpZC0+bW5jICs9IChidWZbMl0gPj4gNCkgKiAgMTA7CisJCWNpZC0+bW5jICs9IChidWZbMV0gPj4gNCkgKiAgIDE7CisJfQorCisJY2lkLT5sYWMgPSBudG9ocygqKCh1X2ludDE2X3QgKikmYnVmWzNdKSk7CisJY2lkLT5jaSA9IG50b2hzKCooKHVfaW50MTZfdCAqKSZidWZbNV0pKTsKK30KKworLyogcGFyc2UgQkNDSCBpbmZvcm1hdGlvbiBJRUkgZnJvbSB3aXJlIGZvcm1hdCB0byBzdHJ1Y3QgaXBhY19iY2NoX2luZm8gKi8KK2ludCBpcGFjX3BhcnNlX2JjY2hfaW5mbyhzdHJ1Y3QgaXBhY19iY2NoX2luZm8gKmJpbmYsIHVfaW50OF90ICpidWYpCit7CisJdV9pbnQ4X3QgKmN1ciA9IGJ1ZjsKKwl1X2ludDE2X3QgbGVuOworCisJbWVtc2V0KGJpbmYsIDAsIHNpemVvZihiaW5mKSk7CisKKwlpZiAoY3VyWzBdICE9IE5NX0lQQUNfRUlFX0JDQ0hfSU5GTykKKwkJcmV0dXJuIC1FSU5WQUw7CisJY3VyKys7CisKKwlsZW4gPSBudG9ocygqKHVfaW50MTZfdCAqKWN1cik7CisJY3VyICs9IDI7CisKKwliaW5mLT5pbmZvX3R5cGUgPSBudG9ocygqKHVfaW50MTZfdCAqKWN1cik7CisJY3VyICs9IDI7CisKKwlpZiAoYmluZi0+aW5mb190eXBlICYgSVBBQ19CSU5GX0ZSRVFfRVJSX1FVQUwpCisJCWJpbmYtPmZyZXFfcXVhbCA9ICpjdXIgPj4gMjsKKworCWJpbmYtPmFyZmNuID0gKmN1cisrICYgMyA8PCA4OworCWJpbmYtPmFyZmNuIHw9ICpjdXIrKzsKKworCWlmIChiaW5mLT5pbmZvX3R5cGUgJiBJUEFDX0JJTkZfUlhMRVYpCisJCWJpbmYtPnJ4X2xldiA9ICpjdXIgJiAweDNmOworCWN1cisrOworCisJaWYgKGJpbmYtPmluZm9fdHlwZSAmIElQQUNfQklORl9SWFFVQUwpCisJCWJpbmYtPnJ4X3F1YWwgPSAqY3VyICYgMHg3OworCWN1cisrOworCisJaWYgKGJpbmYtPmluZm9fdHlwZSAmIElQQUNfQklORl9GUkVRX0VSUl9RVUFMKQorCQliaW5mLT5mcmVxX2VyciA9IG50b2hzKCoodV9pbnQxNl90ICopY3VyKTsKKwljdXIgKz0gMjsKKworCWlmIChiaW5mLT5pbmZvX3R5cGUgJiBJUEFDX0JJTkZfRlJBTUVfT0ZGU0VUKQorCQliaW5mLT5mcmFtZV9vZmZzZXQgPSBudG9ocygqKHVfaW50MTZfdCAqKWN1cik7CisJY3VyICs9IDI7CisKKwlpZiAoYmluZi0+aW5mb190eXBlICYgSVBBQ19CSU5GX0ZSQU1FX05SX09GRlNFVCkKKwkJYmluZi0+ZnJhbWVfbnJfb2Zmc2V0ID0gbnRvaGwoKih1X2ludDMyX3QgKiljdXIpOworCWN1ciArPSA0OworCisJaWYgKGJpbmYtPmluZm9fdHlwZSAmIElQQUNfQklORl9CU0lDKQorCQliaW5mLT5ic2ljID0gKmN1ciAmIDB4M2Y7CisJY3VyKys7CisKKwlpcGFjX3BhcnNlX2NnaSgmYmluZi0+Y2dpLCBjdXIpOworCWN1ciArPSA3OworCisJaWYgKGJpbmYtPmluZm9fdHlwZSAmIElQQUNfQklORl9ORUlHSF9CQV9TSTIpIHsKKwkJbWVtY3B5KGJpbmYtPmJhX2xpc3Rfc2kyLCBjdXIsIHNpemVvZihiaW5mLT5iYV9saXN0X3NpMikpOworCQljdXIgKz0gc2l6ZW9mKGJpbmYtPmJhX2xpc3Rfc2kyKTsKKwl9CisKKwlpZiAoYmluZi0+aW5mb190eXBlICYgSVBBQ19CSU5GX05FSUdIX0JBX1NJMmJpcykgeworCQltZW1jcHkoYmluZi0+YmFfbGlzdF9zaTJiaXMsIGN1ciwKKwkJCXNpemVvZihiaW5mLT5iYV9saXN0X3NpMmJpcykpOworCQljdXIgKz0gc2l6ZW9mKGJpbmYtPmJhX2xpc3Rfc2kyYmlzKTsKKwl9CisKKwlpZiAoYmluZi0+aW5mb190eXBlICYgSVBBQ19CSU5GX05FSUdIX0JBX1NJMnRlcikgeworCQltZW1jcHkoYmluZi0+YmFfbGlzdF9zaTJ0ZXIsIGN1ciwKKwkJCXNpemVvZihiaW5mLT5iYV9saXN0X3NpMnRlcikpOworCQljdXIgKz0gc2l6ZW9mKGJpbmYtPmJhX2xpc3Rfc2kydGVyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2FiaXNfcnNsLmMgYi9vcGVuYnNjL3NyYy9hYmlzX3JzbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYjI5ODIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9hYmlzX3JzbC5jCkBAIC0wLDAgKzEsMTc2NSBAQAorLyogR1NNIFJhZGlvIFNpZ25hbGxpbmcgTGluayBtZXNzYWdlcyBvbiB0aGUgQS1iaXMgaW50ZXJmYWNlCisgKiAzR1BQIFRTIDA4LjU4IHZlcnNpb24gOC42LjAgUmVsZWFzZSAxOTk5IC8gRVRTSSBUUyAxMDAgNTk2IFY4LjYuMCAqLworCisvKiAoQykgMjAwOC0yMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtX3V0aWxzLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvY2hhbl9hbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYnNjX3JsbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3BhZ2luZy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tZWFzX3JlcC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcnRwX3Byb3h5Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvcnNsLmg+CisKKyNkZWZpbmUgUlNMX0FMTE9DX1NJWkUJCTEwMjQKKyNkZWZpbmUgUlNMX0FMTE9DX0hFQURST09NCTEyOAorCisjZGVmaW5lIE1BWChhLCBiKSAoYSkgPj0gKGIpID8gKGEpIDogKGIpCisKK3N0YXRpYyB1X2ludDhfdCBtZGlzY19ieV9tc2d0eXBlKHVfaW50OF90IG1zZ190eXBlKQoreworCS8qIG1hc2sgb2ZmIHRoZSB0cmFuc3BhcmVudCBiaXQgPyAqLworCW1zZ190eXBlICY9IDB4ZmU7CisKKwlpZiAoKG1zZ190eXBlICYgMHhmMCkgPT0gMHgwMCkKKwkJcmV0dXJuIEFCSVNfUlNMX01ESVNDX1JMTDsKKwlpZiAoKG1zZ190eXBlICYgMHhmMCkgPT0gMHgxMCkgeworCQlpZiAobXNnX3R5cGUgPj0gMHgxOSAmJiBtc2dfdHlwZSA8PSAweDIyKQorCQkJcmV0dXJuIEFCSVNfUlNMX01ESVNDX1RSWDsKKwkJZWxzZQorCQkJcmV0dXJuIEFCSVNfUlNMX01ESVNDX0NPTV9DSEFOOworCX0KKwlpZiAoKG1zZ190eXBlICYgMHhlMCkgPT0gMHgyMCkKKwkJcmV0dXJuIEFCSVNfUlNMX01ESVNDX0RFRF9DSEFOOworCQorCXJldHVybiBBQklTX1JTTF9NRElTQ19MT0M7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2RjaGFuX2hkcihzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaCwKKwkJCQkgIHVfaW50OF90IG1zZ190eXBlKQoreworCWRoLT5jLm1zZ19kaXNjciA9IG1kaXNjX2J5X21zZ3R5cGUobXNnX3R5cGUpOworCWRoLT5jLm1zZ190eXBlID0gbXNnX3R5cGU7CisJZGgtPmllX2NoYW4gPSBSU0xfSUVfQ0hBTl9OUjsKK30KKworLyogZGV0ZXJtaW5lIGxvZ2ljYWwgY2hhbm5lbCBiYXNlZCBvbiBUUlggYW5kIGNoYW5uZWwgbnVtYmVyIElFICovCitzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbl9sb29rdXAoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90IGNoYW5fbnIpCit7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisJdV9pbnQ4X3QgdHNfbnIgPSBjaGFuX25yICYgMHgwNzsKKwl1X2ludDhfdCBjYml0cyA9IGNoYW5fbnIgPj4gMzsKKwl1X2ludDhfdCBsY2hfaWR4OworCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMgPSAmdHJ4LT50c1t0c19ucl07CisKKwlpZiAoY2JpdHMgPT0gMHgwMSkgeworCQlsY2hfaWR4ID0gMDsJLyogVENIL0YgKi8JCisJCWlmICh0cy0+cGNoYW4gIT0gR1NNX1BDSEFOX1RDSF9GICYmCisJCSAgICB0cy0+cGNoYW4gIT0gR1NNX1BDSEFOX1BEQ0ggJiYKKwkJICAgIHRzLT5wY2hhbiAhPSBHU01fUENIQU5fVENIX0ZfUERDSCkKKwkJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgImNoYW5fbnI9MHglMDJ4IGJ1dCBwY2hhbj0ldVxuIiwKKwkJCQljaGFuX25yLCB0cy0+cGNoYW4pOworCX0gZWxzZSBpZiAoKGNiaXRzICYgMHgxZSkgPT0gMHgwMikgeworCQlsY2hfaWR4ID0gY2JpdHMgJiAweDE7CS8qIFRDSC9IICovCisJCWlmICh0cy0+cGNoYW4gIT0gR1NNX1BDSEFOX1RDSF9IKQorCQkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiY2hhbl9ucj0weCUwMnggYnV0IHBjaGFuPSV1XG4iLAorCQkJCWNoYW5fbnIsIHRzLT5wY2hhbik7CisJfSBlbHNlIGlmICgoY2JpdHMgJiAweDFjKSA9PSAweDA0KSB7CisJCWxjaF9pZHggPSBjYml0cyAmIDB4MzsJLyogU0RDQ0gvNCAqLworCQlpZiAodHMtPnBjaGFuICE9IEdTTV9QQ0hBTl9DQ0NIX1NEQ0NINCkKKwkJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgImNoYW5fbnI9MHglMDJ4IGJ1dCBwY2hhbj0ldVxuIiwKKwkJCQljaGFuX25yLCB0cy0+cGNoYW4pOworCX0gZWxzZSBpZiAoKGNiaXRzICYgMHgxOCkgPT0gMHgwOCkgeworCQlsY2hfaWR4ID0gY2JpdHMgJiAweDc7CS8qIFNEQ0NILzggKi8KKwkJaWYgKHRzLT5wY2hhbiAhPSBHU01fUENIQU5fU0RDQ0g4X1NBQ0NIOEMpCisJCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICJjaGFuX25yPTB4JTAyeCBidXQgcGNoYW49JXVcbiIsCisJCQkJY2hhbl9uciwgdHMtPnBjaGFuKTsKKwl9IGVsc2UgaWYgKGNiaXRzID09IDB4MTAgfHwgY2JpdHMgPT0gMHgxMSB8fCBjYml0cyA9PSAweDEyKSB7CisJCWxjaF9pZHggPSAwOworCQlpZiAodHMtPnBjaGFuICE9IEdTTV9QQ0hBTl9DQ0NIICYmCisJCSAgICB0cy0+cGNoYW4gIT0gR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0KQorCQkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiY2hhbl9ucj0weCUwMnggYnV0IHBjaGFuPSV1XG4iLAorCQkJCWNoYW5fbnIsIHRzLT5wY2hhbik7CisJCS8qIEZJWE1FOiB3ZSBzaG91bGQgbm90IHJldHVybiBmaXJzdCBzZGNjaDQgISEhICovCisJfSBlbHNlIHsKKwkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAidW5rbm93biBjaGFuX25yPTB4JTAyeFxuIiwgY2hhbl9ucik7CisJCXJldHVybiBOVUxMOworCX0KKworCWxjaGFuID0gJnRzLT5sY2hhbltsY2hfaWR4XTsKKwlsb2dfc2V0X2NvbnRleHQoQlNDX0NUWF9MQ0hBTiwgbGNoYW4pOworCWxvZ19zZXRfY29udGV4dChCU0NfQ1RYX1NVQlNDUiwgbGNoYW4tPmNvbm4uc3Vic2NyKTsKKworCXJldHVybiBsY2hhbjsKK30KKworLyogU2VlIFRhYmxlIDEwLjUuMjUgb2YgR1NNMDQuMDggKi8KK3VfaW50OF90IGxjaGFuMmNoYW5fbnIoY29uc3Qgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9IGxjaGFuLT50czsKKwl1X2ludDhfdCBjYml0cywgY2hhbl9ucjsKKworCXN3aXRjaCAodHMtPnBjaGFuKSB7CisJY2FzZSBHU01fUENIQU5fVENIX0Y6CisJY2FzZSBHU01fUENIQU5fUERDSDoKKwljYXNlIEdTTV9QQ0hBTl9UQ0hfRl9QRENIOgorCQljYml0cyA9IDB4MDE7CisJCWJyZWFrOworCWNhc2UgR1NNX1BDSEFOX1RDSF9IOgorCQljYml0cyA9IDB4MDI7CisJCWNiaXRzICs9IGxjaGFuLT5ucjsKKwkJYnJlYWs7CisJY2FzZSBHU01fUENIQU5fQ0NDSF9TRENDSDQ6CisJCWNiaXRzID0gMHgwNDsKKwkJY2JpdHMgKz0gbGNoYW4tPm5yOworCQlicmVhazsKKwljYXNlIEdTTV9QQ0hBTl9TRENDSDhfU0FDQ0g4QzoKKwkJY2JpdHMgPSAweDA4OworCQljYml0cyArPSBsY2hhbi0+bnI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJY2FzZSBHU01fUENIQU5fQ0NDSDoKKwkJY2JpdHMgPSAweDEwOworCQlicmVhazsKKwl9CisKKwljaGFuX25yID0gKGNiaXRzIDw8IDMpIHwgKHRzLT5uciAmIDB4Nyk7CisKKwlyZXR1cm4gY2hhbl9ucjsKK30KKworLyogQXMgcGVyIFRTIDAzLjAzIFNlY3Rpb24gMi4yLCB0aGUgSU1TSSBoYXMgJ25vdCBtb3JlIHRoYW4gMTUgZGlnaXRzJyAqLwordV9pbnQ2NF90IHN0cl90b19pbXNpKGNvbnN0IGNoYXIgKmltc2lfc3RyKQoreworCXVfaW50NjRfdCByZXQ7CisKKwlyZXQgPSBzdHJ0b3VsbChpbXNpX3N0ciwgTlVMTCwgMTApOworCisJcmV0dXJuIHJldDsKK30KKworLyogVGFibGUgNSBDbGF1c2UgNyBUUyAwNS4wMiAqLwordW5zaWduZWQgaW50IG5fcGFnX2Jsb2NrcyhpbnQgYnNfY2NjaF9zZGNjaF9jb21iLCB1bnNpZ25lZCBpbnQgYnNfYWdfYmxrc19yZXMpCit7CisJaWYgKCFic19jY2NoX3NkY2NoX2NvbWIpCisJCXJldHVybiA5IC0gYnNfYWdfYmxrc19yZXM7CisJZWxzZQorCQlyZXR1cm4gMyAtIGJzX2FnX2Jsa3NfcmVzOworfQorCisvKiBDaGFwdGVyIDYuNS4yIG9mIFRTIDA1LjAyICovCit1bnNpZ25lZCBpbnQgZ2V0X2NjY2hfZ3JvdXAodV9pbnQ2NF90IGltc2ksIHVuc2lnbmVkIGludCBic19jY19jaGFucywKKwkJCSAgICB1bnNpZ25lZCBpbnQgbl9wYWdfYmxvY2tzKQoreworCXJldHVybiAoaW1zaSAlIDEwMDApICUgKGJzX2NjX2NoYW5zICogbl9wYWdfYmxvY2tzKSAvIG5fcGFnX2Jsb2NrczsKK30KKworLyogQ2hhcHRlciA2LjUuMiBvZiBUUyAwNS4wMiAqLwordW5zaWduZWQgaW50IGdldF9wYWdpbmdfZ3JvdXAodV9pbnQ2NF90IGltc2ksIHVuc2lnbmVkIGludCBic19jY19jaGFucywKKwkJCSAgICAgIGludCBuX3BhZ19ibG9ja3MpCit7CisJcmV0dXJuIChpbXNpICUgMTAwMCkgJSAoYnNfY2NfY2hhbnMgKiBuX3BhZ19ibG9ja3MpICUgbl9wYWdfYmxvY2tzOworfQorCitzdGF0aWMgc3RydWN0IG1zZ2IgKnJzbF9tc2diX2FsbG9jKHZvaWQpCit7CisJcmV0dXJuIG1zZ2JfYWxsb2NfaGVhZHJvb20oUlNMX0FMTE9DX1NJWkUsIFJTTF9BTExPQ19IRUFEUk9PTSwKKwkJCQkgICAiUlNMIik7Cit9CisKKyNkZWZpbmUgTUFDQkxPQ0tfU0laRQkyMworc3RhdGljIHZvaWQgcGFkX21hY2Jsb2NrKHVfaW50OF90ICpvdXQsIGNvbnN0IHVfaW50OF90ICppbiwgaW50IGxlbikKK3sKKwltZW1jcHkob3V0LCBpbiwgbGVuKTsKKworCWlmIChsZW4gPCBNQUNCTE9DS19TSVpFKQorCQltZW1zZXQob3V0K2xlbiwgMHgyYiwgTUFDQkxPQ0tfU0laRS1sZW4pOworfQorCisvKiBDaGFwdGVyIDkuMy43OiBFbmNyeXB0aW9uIEluZm9ybWF0aW9uICovCitzdGF0aWMgaW50IGJ1aWxkX2VuY3JfaW5mbyh1X2ludDhfdCAqb3V0LCBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwkqb3V0KysgPSBsY2hhbi0+ZW5jci5hbGdfaWQgJiAweGZmOworCWlmIChsY2hhbi0+ZW5jci5rZXlfbGVuKQorCQltZW1jcHkob3V0LCBsY2hhbi0+ZW5jci5rZXksIGxjaGFuLT5lbmNyLmtleV9sZW4pOworCXJldHVybiBsY2hhbi0+ZW5jci5rZXlfbGVuICsgMTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfcnNsX2NhdXNlKGludCBsdmwsIGNvbnN0IHVfaW50OF90ICpjYXVzZV92LCB1X2ludDhfdCBjYXVzZV9sZW4pCit7CisJaW50IGk7CisKKwlMT0dQQyhEUlNMLCBsdmwsICJDQVVTRT0weCUwMngoJXMpICIsCisJCWNhdXNlX3ZbMF0sIHJzbF9lcnJfbmFtZShjYXVzZV92WzBdKSk7CisJZm9yIChpID0gMTsgaSA8IGNhdXNlX2xlbi0xOyBpKyspCisJCUxPR1BDKERSU0wsIGx2bCwgIiUwMnggIiwgY2F1c2VfdltpXSk7Cit9CisKKy8qIFNlbmQgYSBCQ0NIX0lORk8gbWVzc2FnZSBhcyBwZXIgQ2hhcHRlciA4LjUuMSAqLworaW50IHJzbF9iY2NoX2luZm8oc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90IHR5cGUsCisJCSAgY29uc3QgdV9pbnQ4X3QgKmRhdGEsIGludCBsZW4pCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisJc3RydWN0IG1zZ2IgKm1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKmRoKTsKKwlpbml0X2RjaGFuX2hkcihkaCwgUlNMX01UX0JDQ0hfSU5GTyk7CisJZGgtPmNoYW5fbnIgPSBSU0xfQ0hBTl9CQ0NIOworCisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfU1lTSU5GT19UWVBFLCB0eXBlKTsKKwltc2diX3Rsdl9wdXQobXNnLCBSU0xfSUVfRlVMTF9CQ0NIX0lORk8sIGxlbiwgZGF0YSk7CisKKwltc2ctPnRyeCA9IHRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKK2ludCByc2xfc2FjY2hfZmlsbGluZyhzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgdHlwZSwKKwkJICAgICAgY29uc3QgdV9pbnQ4X3QgKmRhdGEsIGludCBsZW4pCit7CisJc3RydWN0IGFiaXNfcnNsX2NvbW1vbl9oZHIgKmNoOworCXN0cnVjdCBtc2diICptc2cgPSByc2xfbXNnYl9hbGxvYygpOworCisJY2ggPSAoc3RydWN0IGFiaXNfcnNsX2NvbW1vbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmNoKSk7CisJY2gtPm1zZ19kaXNjciA9IEFCSVNfUlNMX01ESVNDX1RSWDsKKwljaC0+bXNnX3R5cGUgPSBSU0xfTVRfU0FDQ0hfRklMTDsKKworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX1NZU0lORk9fVFlQRSwgdHlwZSk7CisJbXNnYl90bDE2dl9wdXQobXNnLCBSU0xfSUVfTDNfSU5GTywgbGVuLCBkYXRhKTsKKworCW1zZy0+dHJ4ID0gdHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworaW50IHJzbF9jaGFuX2JzX3Bvd2VyX2N0cmwoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVuc2lnbmVkIGludCBmcGMsIGludCBkYikKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXVfaW50OF90IGNoYW5fbnIgPSBsY2hhbjJjaGFuX25yKGxjaGFuKTsKKworCWRiID0gYWJzKGRiKTsKKwlpZiAoZGIgPiAzMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltc2cgPSByc2xfbXNnYl9hbGxvYygpOworCisJbGNoYW4tPmJzX3Bvd2VyID0gZGIvMjsKKwlpZiAoZnBjKQorCQlsY2hhbi0+YnNfcG93ZXIgfD0gMHgxMDsKKwkKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfQlNfUE9XRVJfQ09OVFJPTCk7CisJZGgtPmNoYW5fbnIgPSBjaGFuX25yOworCisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfQlNfUE9XRVIsIGxjaGFuLT5ic19wb3dlcik7CisKKwltc2ctPnRyeCA9IGxjaGFuLT50cy0+dHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworaW50IHJzbF9jaGFuX21zX3Bvd2VyX2N0cmwoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVuc2lnbmVkIGludCBmcGMsIGludCBkYm0pCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwl1X2ludDhfdCBjaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisJaW50IGN0bF9sdmw7CisKKwljdGxfbHZsID0gbXNfcHdyX2N0bF9sdmwobGNoYW4tPnRzLT50cngtPmJ0cy0+YmFuZCwgZGJtKTsKKwlpZiAoY3RsX2x2bCA8IDApCisJCXJldHVybiBjdGxfbHZsOworCisJbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKworCWxjaGFuLT5tc19wb3dlciA9IGN0bF9sdmw7CisKKwlpZiAoZnBjKQorCQlsY2hhbi0+bXNfcG93ZXIgfD0gMHgyMDsKKwkKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfTVNfUE9XRVJfQ09OVFJPTCk7CisJZGgtPmNoYW5fbnIgPSBjaGFuX25yOworCisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfTVNfUE9XRVIsIGxjaGFuLT5tc19wb3dlcik7CisKKwltc2ctPnRyeCA9IGxjaGFuLT50cy0+dHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworc3RhdGljIGludCBjaGFubmVsX21vZGVfZnJvbV9sY2hhbihzdHJ1Y3QgcnNsX2llX2NoYW5fbW9kZSAqY20sCisJCQkJICAgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJbWVtc2V0KGNtLCAwLCBzaXplb2YoY20pKTsKKworCS8qIEZJWE1FOiB3aGF0IHRvIGRvIHdpdGggZGF0YSBjYWxscyA/ICovCisJY20tPmR0eF9kdHUgPSAweDAwOworCisJLyogc2V0IFRDSCBTcGVlY2gvRGF0YSAqLworCWNtLT5zcGRfaW5kID0gbGNoYW4tPnJzbF9jbW9kZTsKKworCWlmIChsY2hhbi0+cnNsX2Ntb2RlID09IFJTTF9DTU9EX1NQRF9TSUdOICYmCisJICAgIGxjaGFuLT50Y2hfbW9kZSAhPSBHU000OF9DTU9ERV9TSUdOKQorCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICJ1bnN1cHBvcnRlZDogcnNsX21vZGUgPT0gc2lnbmFsbGluZywgIgorCQkJImJ1dCB0Y2hfbW9kZSAhPSBzaWduYWxsaW5nXG4iKTsKKworCXN3aXRjaCAobGNoYW4tPnR5cGUpIHsKKwljYXNlIEdTTV9MQ0hBTl9TRENDSDoKKwkJY20tPmNoYW5fcnQgPSBSU0xfQ01PRF9DUlRfU0RDQ0g7CisJCWJyZWFrOworCWNhc2UgR1NNX0xDSEFOX1RDSF9GOgorCQljbS0+Y2hhbl9ydCA9IFJTTF9DTU9EX0NSVF9UQ0hfQm07CisJCWJyZWFrOworCWNhc2UgR1NNX0xDSEFOX1RDSF9IOgorCQljbS0+Y2hhbl9ydCA9IFJTTF9DTU9EX0NSVF9UQ0hfTG07CisJCWJyZWFrOworCWNhc2UgR1NNX0xDSEFOX05PTkU6CisJY2FzZSBHU01fTENIQU5fVU5LTk9XTjoKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGxjaGFuLT50Y2hfbW9kZSkgeworCWNhc2UgR1NNNDhfQ01PREVfU0lHTjoKKwkJY20tPmNoYW5fcmF0ZSA9IDA7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfQ01PREVfU1BFRUNIX1YxOgorCQljbS0+Y2hhbl9yYXRlID0gUlNMX0NNT0RfU1BfR1NNMTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9DTU9ERV9TUEVFQ0hfRUZSOgorCQljbS0+Y2hhbl9yYXRlID0gUlNMX0NNT0RfU1BfR1NNMjsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9DTU9ERV9TUEVFQ0hfQU1SOgorCQljbS0+Y2hhbl9yYXRlID0gUlNMX0NNT0RfU1BfR1NNMzsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9DTU9ERV9EQVRBXzE0azU6CisJCWNtLT5jaGFuX3JhdGUgPSBSU0xfQ01PRF9TUF9OVF8xNGs1OworCQlicmVhazsKKwljYXNlIEdTTTQ4X0NNT0RFX0RBVEFfMTJrMDoKKwkJY20tPmNoYW5fcmF0ZSA9IFJTTF9DTU9EX1NQX05UXzEyazA7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfQ01PREVfREFUQV82azA6CisJCWNtLT5jaGFuX3JhdGUgPSBSU0xfQ01PRF9TUF9OVF82azA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKiBDaGFwdGVyIDguNC4xICovCisjaWYgMAoraW50IHJzbF9jaGFuX2FjdGl2YXRlKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCBjaGFuX25yLAorCQkgICAgICB1X2ludDhfdCBhY3RfdHlwZSwKKwkJICAgICAgc3RydWN0IHJzbF9pZV9jaGFuX21vZGUgKmNoYW5fbW9kZSwKKwkJICAgICAgc3RydWN0IHJzbF9pZV9jaGFuX2lkZW50ICpjaGFuX2lkZW50LAorCQkgICAgICB1X2ludDhfdCBic19wb3dlciwgdV9pbnQ4X3QgbXNfcG93ZXIsCisJCSAgICAgIHVfaW50OF90IHRhKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCXN0cnVjdCBtc2diICptc2cgPSByc2xfbXNnYl9hbGxvYygpOworCisJZGggPSAoc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZGgpKTsKKwlpbml0X2RjaGFuX2hkcihkaCwgUlNMX01UX0NIQU5fQUNUSVYpOworCWRoLT5jaGFuX25yID0gY2hhbl9ucjsKKworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX0FDVF9UWVBFLCBhY3RfdHlwZSk7CisJLyogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBQaGFzZSAxICovCisJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX0NIQU5fTU9ERSwgc2l6ZW9mKCpjaGFuX21vZGUpLAorCQkgICAgICh1X2ludDhfdCAqKSBjaGFuX21vZGUpOworCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9DSEFOX0lERU5ULCA0LAorCQkgICAgICh1X2ludDhfdCAqKSBjaGFuX2lkZW50KTsKKyNpZiAwCisJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX0VOQ1JfSU5GTywgMSwKKwkJICAgICAodV9pbnQ4X3QgKikgJmVuY3JfaW5mbyk7CisjZW5kaWYKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9CU19QT1dFUiwgYnNfcG93ZXIpOworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX01TX1BPV0VSLCBtc19wb3dlcik7CisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfVElNSU5HX0FEVkFOQ0UsIHRhKTsKKworCW1zZy0+dHJ4ID0gdHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKyNlbmRpZgorCitpbnQgcnNsX2NoYW5fYWN0aXZhdGVfbGNoYW4oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGFjdF90eXBlLAorCQkJICAgIHVfaW50OF90IHRhLCB1X2ludDhfdCBob19yZWYpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlpbnQgcmM7CisKKwl1X2ludDhfdCBjaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisJdV9pbnQxNl90IGFyZmNuID0gbGNoYW4tPnRzLT50cngtPmFyZmNuOworCXN0cnVjdCByc2xfaWVfY2hhbl9tb2RlIGNtOworCXN0cnVjdCByc2xfaWVfY2hhbl9pZGVudCBjaTsKKworCXJjID0gY2hhbm5lbF9tb2RlX2Zyb21fbGNoYW4oJmNtLCBsY2hhbik7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJbWVtc2V0KCZjaSwgMCwgc2l6ZW9mKGNpKSk7CisJY2kuY2hhbl9kZXNjLmllaSA9IDB4NjQ7CisJY2kuY2hhbl9kZXNjLmNoYW5fbnIgPSBjaGFuX25yOworCWNpLmNoYW5fZGVzYy5vY3QzID0gKGxjaGFuLT50cy0+dHJ4LT5idHMtPnRzYyA8PCA1KSB8ICgoYXJmY24gJiAweDNmZikgPj4gOCk7CisJY2kuY2hhbl9kZXNjLm9jdDQgPSBhcmZjbiAmIDB4ZmY7CisKKwltc2cgPSByc2xfbXNnYl9hbGxvYygpOworCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9DSEFOX0FDVElWKTsKKwlkaC0+Y2hhbl9uciA9IGNoYW5fbnI7CisKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9BQ1RfVFlQRSwgYWN0X3R5cGUpOworCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9DSEFOX01PREUsIHNpemVvZihjbSksCisJCSAgICAgKHVfaW50OF90ICopICZjbSk7CisJLyogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBQaGFzZSAxICovCisJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX0NIQU5fSURFTlQsIDQsCisJCSAgICAgKHVfaW50OF90ICopICZjaSk7CisKKwlpZiAobGNoYW4tPmVuY3IuYWxnX2lkID4gUlNMX0VOQ19BTEdfQTUoMCkpIHsKKwkJdV9pbnQ4X3QgZW5jcl9pbmZvW01BWF9BNV9LRVlfTEVOKzJdOworCQlyYyA9IGJ1aWxkX2VuY3JfaW5mbyhlbmNyX2luZm8sIGxjaGFuKTsKKwkJaWYgKHJjID4gMCkKKwkJCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9FTkNSX0lORk8sIHJjLCBlbmNyX2luZm8pOworCX0KKworCXN3aXRjaCAoYWN0X3R5cGUpIHsKKwljYXNlIFJTTF9BQ1RfSU5URVJfQVNZTkM6CisJY2FzZSBSU0xfQUNUX0lOVEVSX1NZTkM6CisJCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX0hBTkRPX1JFRiwgaG9fcmVmKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfQlNfUE9XRVIsIGxjaGFuLT5ic19wb3dlcik7CisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfTVNfUE9XRVIsIGxjaGFuLT5tc19wb3dlcik7CisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfVElNSU5HX0FEVkFOQ0UsIHRhKTsKKworCWlmIChsY2hhbi0+dGNoX21vZGUgPT0gR1NNNDhfQ01PREVfU1BFRUNIX0FNUikKKwkJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX01SX0NPTkZJRywgc2l6ZW9mKGxjaGFuLT5tcl9jb25mKSwKKwkJCSAgICAgKHVfaW50OF90ICopICZsY2hhbi0+bXJfY29uZik7CisKKwltc2ctPnRyeCA9IGxjaGFuLT50cy0+dHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworLyogQ2hhcHRlciA4LjQuOTogTW9kaWZ5IGNoYW5uZWwgbW9kZSBvbiBCVFMgc2lkZSAqLworaW50IHJzbF9jaGFuX21vZGVfbW9kaWZ5X3JlcShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCWludCByYzsKKworCXVfaW50OF90IGNoYW5fbnIgPSBsY2hhbjJjaGFuX25yKGxjaGFuKTsKKwlzdHJ1Y3QgcnNsX2llX2NoYW5fbW9kZSBjbTsKKworCXJjID0gY2hhbm5lbF9tb2RlX2Zyb21fbGNoYW4oJmNtLCBsY2hhbik7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfTU9ERV9NT0RJRllfUkVRKTsKKwlkaC0+Y2hhbl9uciA9IGNoYW5fbnI7CisKKwltc2diX3Rsdl9wdXQobXNnLCBSU0xfSUVfQ0hBTl9NT0RFLCBzaXplb2YoY20pLAorCQkgICAgICh1X2ludDhfdCAqKSAmY20pOworCisJaWYgKGxjaGFuLT5lbmNyLmFsZ19pZCA+IFJTTF9FTkNfQUxHX0E1KDApKSB7CisJCXVfaW50OF90IGVuY3JfaW5mb1tNQVhfQTVfS0VZX0xFTisyXTsKKwkJcmMgPSBidWlsZF9lbmNyX2luZm8oZW5jcl9pbmZvLCBsY2hhbik7CisJCWlmIChyYyA+IDApCisJCQltc2diX3Rsdl9wdXQobXNnLCBSU0xfSUVfRU5DUl9JTkZPLCByYywgZW5jcl9pbmZvKTsKKwl9CisKKwlpZiAobGNoYW4tPnRjaF9tb2RlID09IEdTTTQ4X0NNT0RFX1NQRUVDSF9BTVIpIHsKKwkJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX01SX0NPTkZJRywgc2l6ZW9mKGxjaGFuLT5tcl9jb25mKSwKKwkJCSAgICAgKHVfaW50OF90ICopICZsY2hhbi0+bXJfY29uZik7CisJfQorCisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKKy8qIENoYXB0ZXIgOC40LjY6IFNlbmQgdGhlIGVuY3J5cHRpb24gY29tbWFuZCB3aXRoIGdpdmVuIEwzIGluZm8gKi8KK2ludCByc2xfZW5jcnlwdGlvbl9jbWQoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IG1zZy0+bGNoYW47CisJdV9pbnQ4X3QgY2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCXVfaW50OF90IGVuY3JfaW5mb1tNQVhfQTVfS0VZX0xFTisyXTsKKwl1X2ludDhfdCBsM19sZW4gPSBtc2ctPmxlbjsKKwlpbnQgcmM7CisKKwkvKiBGaXJzdCBwdXNoIHRoZSBMMyBJRSB0YWcgYW5kIGxlbmd0aCAqLworCW1zZ2JfdHYxNl9wdXNoKG1zZywgUlNMX0lFX0wzX0lORk8sIGwzX2xlbik7CisKKwkvKiB0aGVuIHRoZSBsaW5rIGlkZW50aWZpZXIgKFNBUEkwLCBtYWluIHNpZ24gbGluaykgKi8KKwltc2diX3R2X3B1c2gobXNnLCBSU0xfSUVfTElOS19JREVOVCwgMCk7CisKKwkvKiB0aGVuIGVuY3J5cHRpb24gaW5mb3JtYXRpb24gKi8KKwlyYyA9IGJ1aWxkX2VuY3JfaW5mbyhlbmNyX2luZm8sIGxjaGFuKTsKKwlpZiAocmMgPD0gMCkKKwkJcmV0dXJuIHJjOworCW1zZ2JfdGx2X3B1c2gobXNnLCBSU0xfSUVfRU5DUl9JTkZPLCByYywgZW5jcl9pbmZvKTsKKworCS8qIGFuZCBmaW5hbGx5IHRoZSBEQ0hBTiBoZWFkZXIgKi8KKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHVzaChtc2csIHNpemVvZigqZGgpKTsKKwlpbml0X2RjaGFuX2hkcihkaCwgUlNMX01UX0VOQ1JfQ01EKTsKKwlkaC0+Y2hhbl9uciA9IGNoYW5fbnI7CisKKwltc2ctPnRyeCA9IGxjaGFuLT50cy0+dHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworLyogQ2hhcHRlciA4LjQuNSAvIDQuNjogRGVhY3RpdmF0ZSB0aGUgU0FDQ0ggYWZ0ZXIgMDQuMDggUlIgQ0hBTiBSRUxFQVNFICovCitpbnQgcnNsX2RlYWN0X3NhY2NoKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCXN0cnVjdCBtc2diICptc2cgPSByc2xfbXNnYl9hbGxvYygpOworCisJZGggPSAoc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZGgpKTsKKwlpbml0X2RjaGFuX2hkcihkaCwgUlNMX01UX0RFQUNUSVZBVEVfU0FDQ0gpOworCWRoLT5jaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisKKwltc2ctPmxjaGFuID0gbGNoYW47CisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCURFQlVHUChEUlNMLCAiJXMgREVBQ1RpdmF0ZSBTQUNDSCBDTURcbiIsIGdzbV9sY2hhbl9uYW1lKGxjaGFuKSk7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCisvKiBDaGFwdGVyIDguNC4xNCAvIDQuNzogVGVsbCBCVFMgdG8gcmVsZWFzZSB0aGUgcmFkaW8gY2hhbm5lbCAqLworaW50IHJzbF9yZl9jaGFuX3JlbGVhc2Uoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisJc3RydWN0IG1zZ2IgKm1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfUkZfQ0hBTl9SRUwpOworCWRoLT5jaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisKKwltc2ctPmxjaGFuID0gbGNoYW47CisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCURFQlVHUChEUlNMLCAiJXMgUkYgQ2hhbm5lbCBSZWxlYXNlIENNRFxuIiwgZ3NtX2xjaGFuX25hbWUobGNoYW4pKTsKKworCS8qIEJUUyB3aWxsIHJlc3BvbmQgYnkgUkYgQ0hBTiBSRUwgQUNLICovCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworaW50IHJzbF9wYWdpbmdfY21kKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IHBhZ2luZ19ncm91cCwgdV9pbnQ4X3QgbGVuLAorCQkgICB1X2ludDhfdCAqbXNfaWRlbnQsIHVfaW50OF90IGNoYW5fbmVlZGVkKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCXN0cnVjdCBtc2diICptc2cgPSByc2xfbXNnYl9hbGxvYygpOworCisJZGggPSAoc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZGgpKTsKKwlpbml0X2RjaGFuX2hkcihkaCwgUlNMX01UX1BBR0lOR19DTUQpOworCWRoLT5jaGFuX25yID0gUlNMX0NIQU5fUENIX0FHQ0g7CisKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9QQUdJTkdfR1JPVVAsIHBhZ2luZ19ncm91cCk7CisJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX01TX0lERU5USVRZLCBsZW4tMiwgbXNfaWRlbnQrMik7CisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfQ0hBTl9ORUVERUQsIGNoYW5fbmVlZGVkKTsKKworCW1zZy0+dHJ4ID0gYnRzLT5jMDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKK2ludCByc2xfcGFnaW5nX2NtZF9zdWJzY3Ioc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgY2hhbl9uZWVkLAorCQkJICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKyNpZiAwCisJdV9pbnQ4X3QgbWlbMTI4XTsKKwl1bnNpZ25lZCBpbnQgbWlfbGVuOworCXVfaW50OF90IHBhZ2luZ19ncm91cDsKKyNlbmRpZgorCisJcmV0dXJuIC0xOworfQorCitpbnQgaW1zaV9zdHIyYmNkKHVfaW50OF90ICpiY2Rfb3V0LCBjb25zdCBjaGFyICpzdHJfaW4pCit7CisJaW50IGksIGxlbiA9IHN0cmxlbihzdHJfaW4pOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWludCBudW0gPSBzdHJfaW5baV0gLSAweDMwOworCQlpZiAobnVtIDwgMCB8fCBudW0gPiA5KQorCQkJcmV0dXJuIC0xOworCQlpZiAoaSAlIDIgPT0gMCkKKwkJCWJjZF9vdXRbaS8yXSA9IG51bTsKKwkJZWxzZQorCQkJYmNkX291dFtpLzJdIHw9IChudW0gPDwgNCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIENoYXB0ZXIgOC41LjYgKi8KK2ludCByc2xfaW1tX2Fzc2lnbl9jbWQoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgbGVuLCB1X2ludDhfdCAqdmFsKQoreworCXN0cnVjdCBtc2diICptc2cgPSByc2xfbXNnYl9hbGxvYygpOworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCXVfaW50OF90IGJ1ZltNQUNCTE9DS19TSVpFXTsKKworCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9JTU1FRElBVEVfQVNTSUdOX0NNRCk7CisJZGgtPmNoYW5fbnIgPSBSU0xfQ0hBTl9QQ0hfQUdDSDsKKworCXN3aXRjaCAoYnRzLT50eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfQlMxMToKKwkJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX0lNTV9BU1NfSU5GTywgbGVuLCB2YWwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBJZiBwaGFzZSAyLCBjb25zdHJ1Y3QgYSBGVUxMX0lNTV9BU1NfSU5GTyAqLworCQlwYWRfbWFjYmxvY2soYnVmLCB2YWwsIGxlbik7CisJCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9GVUxMX0lNTV9BU1NfSU5GTywgTUFDQkxPQ0tfU0laRSwgYnVmKTsKKwkJYnJlYWs7CisJfQorCisJbXNnLT50cnggPSBidHMtPmMwOworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworLyogU2VuZCBTaWVtZW5zIHNwZWNpZmljIE1TIFJGIFBvd2VyIENhcGFiaWxpdHkgSW5kaWNhdGlvbiAqLworaW50IHJzbF9zaWVtZW5zX21ycGNpKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCBzdHJ1Y3QgcnNsX21ycGNpICptcnBjaSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKworCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9TSUVNRU5TX01SUENJKTsKKwlkaC0+Yy5tc2dfZGlzY3IgPSBBQklTX1JTTF9NRElTQ19ERURfQ0hBTjsKKwlkaC0+Y2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX1NJRU1FTlNfTVJQQ0ksICoodV9pbnQ4X3QgKiltcnBjaSk7CisKKwlERUJVR1AoRFJTTCwgIiVzIFRYIFNpZW1lbnMgTVJQQ0kgMHglMDJ4XG4iLAorCQlnc21fbGNoYW5fbmFtZShsY2hhbiksICoodV9pbnQ4X3QgKiltcnBjaSk7CisKKwltc2ctPnRyeCA9IGxjaGFuLT50cy0+dHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworCisvKiBTZW5kICJEQVRBIFJFUVVFU1QiIG1lc3NhZ2Ugd2l0aCBnaXZlbiBMMyBJbmZvIHBheWxvYWQgKi8KKy8qIENoYXB0ZXIgOC4zLjEgKi8KK2ludCByc2xfZGF0YV9yZXF1ZXN0KHN0cnVjdCBtc2diICptc2csIHVfaW50OF90IGxpbmtfaWQpCit7CisJaWYgKG1zZy0+bGNoYW4gPT0gTlVMTCkgeworCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICJjYW5ub3Qgc2VuZCBEQVRBIFJFUVVFU1QgdG8gdW5rbm93biBsY2hhblxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJzbF9ybGxfcHVzaF9sMyhtc2csIFJTTF9NVF9EQVRBX1JFUSwgbGNoYW4yY2hhbl9ucihtc2ctPmxjaGFuKSwKKwkJCWxpbmtfaWQsIDEpOworCisJbXNnLT50cnggPSBtc2ctPmxjaGFuLT50cy0+dHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworLyogU2VuZCAiRVNUQUJMSVNIIFJFUVVFU1QiIG1lc3NhZ2Ugd2l0aCBnaXZlbiBMMyBJbmZvIHBheWxvYWQgKi8KKy8qIENoYXB0ZXIgOC4zLjEgKi8KK2ludCByc2xfZXN0YWJsaXNoX3JlcXVlc3Qoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGxpbmtfaWQpCit7CisJc3RydWN0IG1zZ2IgKm1zZzsKKworCW1zZyA9IHJzbF9ybGxfc2ltcGxlKFJTTF9NVF9FU1RfUkVRLCBsY2hhbjJjaGFuX25yKGxjaGFuKSwKKwkJCSAgICAgbGlua19pZCwgMCk7CisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKKy8qIENoYXB0ZXIgOC4zLjcgUmVxdWVzdCB0aGUgcmVsZWFzZSBvZiBtdWx0aWZyYW1lIG1vZGUgb2YgUkxMIGNvbm5lY3Rpb24uCisgICBUaGlzIGlzIHdoYXQgaGlnaGVyIGxheWVycyBzaG91bGQgY2FsbC4gIFRoZSBCVFMgdGhlbiByZXNwb25kcyB3aXRoCisgICBSRUxFQVNFIENPTkZJUk0sIHdoaWNoIHdlIGluIHR1cm4gdXNlIHRvIHRyaWdnZXIgUlNMIENIQU5ORUwgUkVMRUFTRSwKKyAgIHdoaWNoIGluIHR1cm4gaXMgYWNrbm93bGVkZ2VkIGJ5IFJTTCBDSEFOTkVMIFJFTEVBU0UgQUNLLCB3aGljaCBjYWxscworICAgbGNoYW5fZnJlZSgpICovCitpbnQgcnNsX3JlbGVhc2VfcmVxdWVzdChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbGlua19pZCkKK3sKKworCXN0cnVjdCBtc2diICptc2c7CisKKwltc2cgPSByc2xfcmxsX3NpbXBsZShSU0xfTVRfUkVMX1JFUSwgbGNoYW4yY2hhbl9ucihsY2hhbiksCisJCQkgICAgIGxpbmtfaWQsIDApOworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX1JFTEVBU0VfTU9ERSwgMCk7CS8qIG5vcm1hbCByZWxlYXNlICovCisKKwkvKiBGSVhNRTogc3RhcnQgc29tZSB0aW1lciBpbiBjYXNlIHdlIGRvbid0IHJlY2VpdmUgYSBSRUwgQUNLID8gKi8KKworCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCitpbnQgcnNsX2xjaGFuX3NldF9zdGF0ZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgaW50IHN0YXRlKQoreworCWxjaGFuLT5zdGF0ZSA9IHN0YXRlOworCXJldHVybiAwOworfQorCisvKiBDaGFwdGVyIDguNC4yOiBDaGFubmVsIEFjdGl2YXRlIEFja25vd2xlZGdlICovCitzdGF0aWMgaW50IHJzbF9yeF9jaGFuX2FjdF9hY2soc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpyc2xoID0gbXNnYl9sMihtc2cpOworCisJLyogQlRTIGhhcyBjb25maXJtZWQgY2hhbm5lbCBhY3RpdmF0aW9uLCB3ZSBub3cgbmVlZAorCSAqIHRvIGFzc2lnbiB0aGUgYWN0aXZhdGVkIGNoYW5uZWwgdG8gdGhlIE1TICovCisJaWYgKHJzbGgtPmllX2NoYW4gIT0gUlNMX0lFX0NIQU5fTlIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG1zZy0+bGNoYW4tPnN0YXRlICE9IExDSEFOX1NfQUNUX1JFUSkKKwkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIiVzIENIQU4gQUNUIEFDSywgYnV0IHN0YXRlICVzXG4iLAorCQkJZ3NtX2xjaGFuX25hbWUobXNnLT5sY2hhbiksCisJCQlnc21fbGNoYW5zX25hbWUobXNnLT5sY2hhbi0+c3RhdGUpKTsKKwlyc2xfbGNoYW5fc2V0X3N0YXRlKG1zZy0+bGNoYW4sIExDSEFOX1NfQUNUSVZFKTsKKworCWRpc3BhdGNoX3NpZ25hbChTU19MQ0hBTiwgU19MQ0hBTl9BQ1RJVkFURV9BQ0ssIG1zZy0+bGNoYW4pOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENoYXB0ZXIgOC40LjM6IENoYW5uZWwgQWN0aXZhdGUgTkFDSyAqLworc3RhdGljIGludCByc2xfcnhfY2hhbl9hY3RfbmFjayhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoID0gbXNnYl9sMihtc2cpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCisJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiJXMgQ0hBTk5FTCBBQ1RJVkFURSBOQUNLIiwKKwkJZ3NtX2xjaGFuX25hbWUobXNnLT5sY2hhbikpOworCisJLyogQlRTIGhhcyByZWplY3RlZCBjaGFubmVsIGFjdGl2YXRpb24gPyE/ICovCisJaWYgKGRoLT5pZV9jaGFuICE9IFJTTF9JRV9DSEFOX05SKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJzbF90bHZfcGFyc2UoJnRwLCBkaC0+ZGF0YSwgbXNnYl9sMmxlbihtc2cpLXNpemVvZigqZGgpKTsKKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgUlNMX0lFX0NBVVNFKSkgeworCQljb25zdCB1X2ludDhfdCAqY2F1c2UgPSBUTFZQX1ZBTCgmdHAsIFJTTF9JRV9DQVVTRSk7CisJCXByaW50X3JzbF9jYXVzZShMT0dMX0VSUk9SLCBjYXVzZSwKKwkJCQlUTFZQX0xFTigmdHAsIFJTTF9JRV9DQVVTRSkpOworCQlpZiAoKmNhdXNlICE9IFJTTF9FUlJfUkNIX0FMUl9BQ1RWX0FMTE9DKQorCQkJcnNsX2xjaGFuX3NldF9zdGF0ZShtc2ctPmxjaGFuLCBMQ0hBTl9TX05PTkUpOworCX0gZWxzZQorCQlyc2xfbGNoYW5fc2V0X3N0YXRlKG1zZy0+bGNoYW4sIExDSEFOX1NfTk9ORSk7CisKKwlMT0dQQyhEUlNMLCBMT0dMX0VSUk9SLCAiXG4iKTsKKworCWRpc3BhdGNoX3NpZ25hbChTU19MQ0hBTiwgU19MQ0hBTl9BQ1RJVkFURV9OQUNLLCBtc2ctPmxjaGFuKTsKKworCWxjaGFuX2ZyZWUobXNnLT5sY2hhbik7CisJcmV0dXJuIDA7Cit9CisKKy8qIENoYXB0ZXIgOC40LjQ6IENvbm5lY3Rpb24gRmFpbHVyZSBJbmRpY2F0aW9uICovCitzdGF0aWMgaW50IHJzbF9yeF9jb25uX2ZhaWwoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaCA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKworCS8qIEZJWE1FOiBwcmludCB3aGljaCBjaGFubmVsICovCisJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIiVzIENPTk5FQ1RJT04gRkFJTDogUkVMRUFTSU5HICIsCisJICAgICBnc21fbGNoYW5fbmFtZShtc2ctPmxjaGFuKSk7CisKKwlyc2xfdGx2X3BhcnNlKCZ0cCwgZGgtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKS1zaXplb2YoKmRoKSk7CisKKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgUlNMX0lFX0NBVVNFKSkKKwkJcHJpbnRfcnNsX2NhdXNlKExPR0xfTk9USUNFLCBUTFZQX1ZBTCgmdHAsIFJTTF9JRV9DQVVTRSksCisJCQkJVExWUF9MRU4oJnRwLCBSU0xfSUVfQ0FVU0UpKTsKKworCUxPR1BDKERSU0wsIExPR0xfTk9USUNFLCAiXG4iKTsKKwkvKiBGSVhNRTogb25seSBmcmVlIGl0IGFmdGVyIGNoYW5uZWwgcmVsZWFzZSBBQ0sgKi8KKwljb3VudGVyX2luYyhtc2ctPmxjaGFuLT50cy0+dHJ4LT5idHMtPm5ldHdvcmstPnN0YXRzLmNoYW4ucmZfZmFpbCk7CisJcmV0dXJuIHJzbF9yZl9jaGFuX3JlbGVhc2UobXNnLT5sY2hhbik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X21lYXNfcmVwX3VuaShzdHJ1Y3QgZ3NtX21lYXNfcmVwX3VuaWRpciAqbXJ1LAorCQkJCWNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlERUJVR1BDKERNRUFTLCAiUlhMLUZVTEwtJXM9JTNkZEJtIFJYTC1TVUItJXM9JTNkZEJtICIsCisJCXByZWZpeCwgcnhsZXYyZGJtKG1ydS0+ZnVsbC5yeF9sZXYpLAorCQlwcmVmaXgsIHJ4bGV2MmRibShtcnUtPnN1Yi5yeF9sZXYpKTsKKwlERUJVR1BDKERNRUFTLCAiUlhRLUZVTEwtJXM9JWQgUlhRLVNVQi0lcz0lZCAiLAorCQlwcmVmaXgsIG1ydS0+ZnVsbC5yeF9xdWFsLCBwcmVmaXgsIG1ydS0+c3ViLnJ4X3F1YWwpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9tZWFzX3JlcChzdHJ1Y3QgZ3NtX21lYXNfcmVwICptcikKK3sKKwlpbnQgaTsKKworCURFQlVHUChETUVBUywgIk1FQVNVUkVNRU5UIFJFU1VMVCBOUj0lZCAiLCBtci0+bnIpOworCisJaWYgKG1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfRExfRFRYKQorCQlERUJVR1BDKERNRUFTLCAiRFRYZCAiKTsKKworCXByaW50X21lYXNfcmVwX3VuaSgmbXItPnVsLCAidWwiKTsKKwlERUJVR1BDKERNRUFTLCAiQlNfUE9XRVI9JWQgIiwgbXItPmJzX3Bvd2VyKTsKKwlpZiAobXItPmZsYWdzICYgTUVBU19SRVBfRl9NU19UTykKKwkJREVCVUdQQyhETUVBUywgIk1TX1RPPSVkICIsIG1yLT5tc190aW1pbmdfb2Zmc2V0KTsKKworCWlmIChtci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX01TX0wxKSB7CisJCURFQlVHUEMoRE1FQVMsICJMMV9NU19QV1I9JTNkZEJtICIsIG1yLT5tc19sMS5wd3IpOworCQlERUJVR1BDKERNRUFTLCAiTDFfRlBDPSV1ICIsCisJCQltci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX0ZQQyA/IDEgOiAwKTsKKwkJREVCVUdQQyhETUVBUywgIkwxX1RBPSV1ICIsIG1yLT5tc19sMS50YSk7CisJfQorCisJaWYgKG1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfVUxfRFRYKQorCQlERUJVR1BDKERNRUFTLCAiRFRYdSAiKTsKKwlpZiAobXItPmZsYWdzICYgTUVBU19SRVBfRl9CQTEpCisJCURFQlVHUEMoRE1FQVMsICJCQTEgIik7CisJaWYgKCEobXItPmZsYWdzICYgTUVBU19SRVBfRl9ETF9WQUxJRCkpCisJCURFQlVHUEMoRE1FQVMsICJOT1QgVkFMSUQgIik7CisJZWxzZQorCQlwcmludF9tZWFzX3JlcF91bmkoJm1yLT5kbCwgImRsIik7CisKKwlERUJVR1BDKERNRUFTLCAiTlVNX05FSUdIPSV1XG4iLCBtci0+bnVtX2NlbGwpOworCWlmIChtci0+bnVtX2NlbGwgPT0gNykKKwkJcmV0dXJuOworCWZvciAoaSA9IDA7IGkgPCBtci0+bnVtX2NlbGw7IGkrKykgeworCQlzdHJ1Y3QgZ3NtX21lYXNfcmVwX2NlbGwgKm1yYyA9ICZtci0+Y2VsbFtpXTsKKwkJREVCVUdQKERNRUFTLCAiSURYPSV1IEFSRkNOPSV1IEJTSUM9JXUgPT4gJWQgZEJtXG4iLAorCQkJbXJjLT5uZWlnaF9pZHgsIG1yYy0+YXJmY24sIG1yYy0+YnNpYywgcnhsZXYyZGJtKG1yYy0+cnhsZXYpKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcnNsX3J4X21lYXNfcmVzKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGggPSBtc2diX2wyKG1zZyk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJc3RydWN0IGdzbV9tZWFzX3JlcCAqbXIgPSBsY2hhbl9uZXh0X21lYXNfcmVwKG1zZy0+bGNoYW4pOworCXVfaW50OF90IGxlbjsKKwljb25zdCB1X2ludDhfdCAqdmFsOworCWludCByYzsKKworCS8qIGNoZWNrIGlmIHRoaXMgY2hhbm5lbCBpcyBhY3R1YWxseSBhY3RpdmUgKi8KKwkvKiBGSVhNRTogbWF5YmUgdGhpcyBjaGVjayBzaG91bGQgYmUgd2F5IG1vcmUgZ2VuZXJpYy9jZW50cmFsaXplZCAqLworCWlmIChtc2ctPmxjaGFuLT5zdGF0ZSAhPSBMQ0hBTl9TX0FDVElWRSkgeworCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiJXM6IE1FQVMgUkVTIGZvciBpbmFjdGl2ZSBjaGFubmVsXG4iLAorCQkJZ3NtX2xjaGFuX25hbWUobXNnLT5sY2hhbikpOworCQlyZXR1cm4gMDsKKwl9CisKKwltZW1zZXQobXIsIDAsIHNpemVvZigqbXIpKTsKKwltci0+bGNoYW4gPSBtc2ctPmxjaGFuOworCisJcnNsX3Rsdl9wYXJzZSgmdHAsIGRoLT5kYXRhLCBtc2diX2wybGVuKG1zZyktc2l6ZW9mKCpkaCkpOworCisJaWYgKCFUTFZQX1BSRVNFTlQoJnRwLCBSU0xfSUVfTUVBU19SRVNfTlIpIHx8CisJICAgICFUTFZQX1BSRVNFTlQoJnRwLCBSU0xfSUVfVVBMSU5LX01FQVMpIHx8CisJICAgICFUTFZQX1BSRVNFTlQoJnRwLCBSU0xfSUVfQlNfUE9XRVIpKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIE1hbmRhdG9yeSBQYXJ0cyAqLworCW1yLT5uciA9ICpUTFZQX1ZBTCgmdHAsIFJTTF9JRV9NRUFTX1JFU19OUik7CisKKwlsZW4gPSBUTFZQX0xFTigmdHAsIFJTTF9JRV9VUExJTktfTUVBUyk7CisJdmFsID0gVExWUF9WQUwoJnRwLCBSU0xfSUVfVVBMSU5LX01FQVMpOworCWlmIChsZW4gPj0gMykgeworCQlpZiAodmFsWzBdICYgMHg0MCkKKwkJCW1yLT5mbGFncyB8PSBNRUFTX1JFUF9GX0RMX0RUWDsKKwkJbXItPnVsLmZ1bGwucnhfbGV2ID0gdmFsWzBdICYgMHgzZjsKKwkJbXItPnVsLnN1Yi5yeF9sZXYgPSB2YWxbMV0gJiAweDNmOworCQltci0+dWwuZnVsbC5yeF9xdWFsID0gdmFsWzJdPj4zICYgMHg3OworCQltci0+dWwuc3ViLnJ4X3F1YWwgPSB2YWxbMl0gJiAweDc7CisJfQorCisJbXItPmJzX3Bvd2VyID0gKlRMVlBfVkFMKCZ0cCwgUlNMX0lFX0JTX1BPV0VSKTsKKworCS8qIE9wdGlvbmFsIFBhcnRzICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIFJTTF9JRV9NU19USU1JTkdfT0ZGU0VUKSkKKwkJbXItPm1zX3RpbWluZ19vZmZzZXQgPQorCQkJKlRMVlBfVkFMKCZ0cCwgUlNMX0lFX01TX1RJTUlOR19PRkZTRVQpOworCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIFJTTF9JRV9MMV9JTkZPKSkgeworCQl2YWwgPSBUTFZQX1ZBTCgmdHAsIFJTTF9JRV9MMV9JTkZPKTsKKwkJbXItPmZsYWdzIHw9IE1FQVNfUkVQX0ZfTVNfTDE7CisJCW1yLT5tc19sMS5wd3IgPSBtc19wd3JfZGJtKG1zZy0+dHJ4LT5idHMtPmJhbmQsIHZhbFswXSA+PiAzKTsKKwkJaWYgKHZhbFswXSAmIDB4MDQpCisJCQltci0+ZmxhZ3MgfD0gTUVBU19SRVBfRl9GUEM7CisJCW1yLT5tc19sMS50YSA9IHZhbFsxXTsKKwl9CisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIFJTTF9JRV9MM19JTkZPKSkgeworCQltc2ctPmwzaCA9ICh1X2ludDhfdCAqKSBUTFZQX1ZBTCgmdHAsIFJTTF9JRV9MM19JTkZPKTsKKwkJcmMgPSBnc200OF9wYXJzZV9tZWFzX3JlcChtciwgbXNnKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKwl9CisKKwlwcmludF9tZWFzX3JlcChtcik7CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfTENIQU4sIFNfTENIQU5fTUVBU19SRVAsIG1yKTsKKworCXJldHVybiAwOworfQorCisvKiBDaGFwdGVyIDguNC43ICovCitzdGF0aWMgaW50IHJzbF9yeF9oYW5kb19kZXQoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaCA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKworCURFQlVHUChEUlNMLCAiJXMgSEFORE9WRVIgREVURUNUICIsIGdzbV9sY2hhbl9uYW1lKG1zZy0+bGNoYW4pKTsKKworCXJzbF90bHZfcGFyc2UoJnRwLCBkaC0+ZGF0YSwgbXNnYl9sMmxlbihtc2cpLXNpemVvZigqZGgpKTsKKworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBSU0xfSUVfQUNDRVNTX0RFTEFZKSkKKwkJREVCVUdQQyhEUlNMLCAiYWNjZXNzIGRlbGF5ID0gJXVcbiIsCisJCQkqVExWUF9WQUwoJnRwLCBSU0xfSUVfQUNDRVNTX0RFTEFZKSk7CisJZWxzZQorCQlERUJVR1BDKERSU0wsICJcbiIpOworCisJZGlzcGF0Y2hfc2lnbmFsKFNTX0xDSEFOLCBTX0xDSEFOX0hBTkRPVkVSX0RFVEVDVCwgbXNnLT5sY2hhbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhYmlzX3JzbF9yeF9kY2hhbihzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKnJzbGggPSBtc2diX2wyKG1zZyk7CisJaW50IHJjID0gMDsKKwljaGFyICp0c19uYW1lOworCisJbXNnLT5sY2hhbiA9IGxjaGFuX2xvb2t1cChtc2ctPnRyeCwgcnNsaC0+Y2hhbl9ucik7CisJdHNfbmFtZSA9IGdzbV9sY2hhbl9uYW1lKG1zZy0+bGNoYW4pOworCisJc3dpdGNoIChyc2xoLT5jLm1zZ190eXBlKSB7CisJY2FzZSBSU0xfTVRfQ0hBTl9BQ1RJVl9BQ0s6CisJCURFQlVHUChEUlNMLCAiJXMgQ0hBTk5FTCBBQ1RJVkFURSBBQ0tcbiIsIHRzX25hbWUpOworCQlyYyA9IHJzbF9yeF9jaGFuX2FjdF9hY2sobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfQ0hBTl9BQ1RJVl9OQUNLOgorCQlyYyA9IHJzbF9yeF9jaGFuX2FjdF9uYWNrKG1zZyk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX0NPTk5fRkFJTDoKKwkJcmMgPSByc2xfcnhfY29ubl9mYWlsKG1zZyk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX01FQVNfUkVTOgorCQlyYyA9IHJzbF9yeF9tZWFzX3Jlcyhtc2cpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9IQU5ET19ERVQ6CisJCXJjID0gcnNsX3J4X2hhbmRvX2RldChtc2cpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9SRl9DSEFOX1JFTF9BQ0s6CisJCURFQlVHUChEUlNMLCAiJXMgUkYgQ0hBTk5FTCBSRUxFQVNFIEFDS1xuIiwgdHNfbmFtZSk7CisJCWlmIChtc2ctPmxjaGFuLT5zdGF0ZSAhPSBMQ0hBTl9TX1JFTF9SRVEpCisJCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiJXMgQ0hBTiBSRUwgQUNLIGJ1dCBzdGF0ZSAlc1xuIiwKKwkJCQlnc21fbGNoYW5fbmFtZShtc2ctPmxjaGFuKSwKKwkJCQlnc21fbGNoYW5zX25hbWUobXNnLT5sY2hhbi0+c3RhdGUpKTsKKwkJcnNsX2xjaGFuX3NldF9zdGF0ZShtc2ctPmxjaGFuLCBMQ0hBTl9TX05PTkUpOworCQlsY2hhbl9mcmVlKG1zZy0+bGNoYW4pOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9NT0RFX01PRElGWV9BQ0s6CisJCURFQlVHUChEUlNMLCAiJXMgQ0hBTk5FTCBNT0RFIE1PRElGWSBBQ0tcbiIsIHRzX25hbWUpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9NT0RFX01PRElGWV9OQUNLOgorCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICIlcyBDSEFOTkVMIE1PREUgTU9ESUZZIE5BQ0tcbiIsIHRzX25hbWUpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9JUEFDX1BEQ0hfQUNUX0FDSzoKKwkJREVCVUdQQyhEUlNMLCAiJXMgSVBBQyBQRENIIEFDVCBBQ0tcbiIsIHRzX25hbWUpOworCQltc2ctPmxjaGFuLT50cy0+ZmxhZ3MgfD0gVFNfRl9QRENIX01PREU7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX0lQQUNfUERDSF9BQ1RfTkFDSzoKKwkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiJXMgSVBBQyBQRENIIEFDVCBOQUNLXG4iLCB0c19uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfSVBBQ19QRENIX0RFQUNUX0FDSzoKKwkJREVCVUdQKERSU0wsICIlcyBJUEFDIFBEQ0ggREVBQ1QgQUNLXG4iLCB0c19uYW1lKTsKKwkJbXNnLT5sY2hhbi0+dHMtPmZsYWdzICY9IH5UU19GX1BEQ0hfTU9ERTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfSVBBQ19QRENIX0RFQUNUX05BQ0s6CisJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgIiVzIElQQUMgUERDSCBERUFDVCBOQUNLXG4iLCB0c19uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfUEhZX0NPTlRFWFRfQ09ORjoKKwljYXNlIFJTTF9NVF9QUkVQUk9DX01FQVNfUkVTOgorCWNhc2UgUlNMX01UX1RBTEtFUl9ERVQ6CisJY2FzZSBSU0xfTVRfTElTVEVORVJfREVUOgorCWNhc2UgUlNMX01UX1JFTU9URV9DT0RFQ19DT05GX1JFUDoKKwljYXNlIFJTTF9NVF9NUl9DT0RFQ19NT0RfQUNLOgorCWNhc2UgUlNMX01UX01SX0NPREVDX01PRF9OQUNLOgorCWNhc2UgUlNMX01UX01SX0NPREVDX01PRF9QRVI6CisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICIlcyBVbmltcGxlbWVudGVkIEFiaXMgUlNMIERDaGFuICIKKwkJCSJtc2cgMHglMDJ4XG4iLCB0c19uYW1lLCByc2xoLT5jLm1zZ190eXBlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIiVzIHVua25vd24gQWJpcyBSU0wgRENoYW4gbXNnIDB4JTAyeFxuIiwKKwkJCXRzX25hbWUsIHJzbGgtPmMubXNnX3R5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcnNsX3J4X2Vycm9yX3JlcChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9jb21tb25faGRyICpyc2xoID0gbXNnYl9sMihtc2cpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCisJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiJXMgRVJST1IgUkVQT1JUICIsIGdzbV90cnhfbmFtZShtc2ctPnRyeCkpOworCisJcnNsX3Rsdl9wYXJzZSgmdHAsIHJzbGgtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKS1zaXplb2YoKnJzbGgpKTsKKworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBSU0xfSUVfQ0FVU0UpKQorCQlwcmludF9yc2xfY2F1c2UoTE9HTF9FUlJPUiwgVExWUF9WQUwoJnRwLCBSU0xfSUVfQ0FVU0UpLAorCQkJCVRMVlBfTEVOKCZ0cCwgUlNMX0lFX0NBVVNFKSk7CisKKwlMT0dQQyhEUlNMLCBMT0dMX0VSUk9SLCAiXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFiaXNfcnNsX3J4X3RyeChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9jb21tb25faGRyICpyc2xoID0gbXNnYl9sMihtc2cpOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKHJzbGgtPm1zZ190eXBlKSB7CisJY2FzZSBSU0xfTVRfRVJST1JfUkVQT1JUOgorCQlyYyA9IHJzbF9yeF9lcnJvcl9yZXAobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfUkZfUkVTX0lORDoKKwkJLyogaW50ZXJmZXJlbmNlIG9uIGlkbGUgY2hhbm5lbHMgb2YgVFJYICovCisJCS8vREVCVUdQKERSU0wsICIlcyBSRiBSZXNvdXJjZSBJbmRpY2F0aW9uXG4iLCBnc21fdHJ4X25hbWUobXNnLT50cngpKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfT1ZFUkxPQUQ6CisJCS8qIGluZGljYXRlIENDQ0ggLyBBQ0NIIC8gcHJvY2Vzc29yIG92ZXJsb2FkICovCisJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgIiVzIENDQ0gvQUNDSC9DUFUgT3ZlcmxvYWRcbiIsCisJCSAgICAgZ3NtX3RyeF9uYW1lKG1zZy0+dHJ4KSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICIlcyBVbmtub3duIEFiaXMgUlNMIFRSWCBtZXNzYWdlICIKKwkJCSJ0eXBlIDB4JTAyeFxuIiwgZ3NtX3RyeF9uYW1lKG1zZy0+dHJ4KSwgcnNsaC0+bXNnX3R5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHJjOworfQorCisvKiBJZiBUMzEwMSBleHBpcmVzLCB3ZSBuZXZlciByZWNlaXZlZCBhIHJlc3BvbnNlIHRvIElNTUVESUFURSBBU1NJR04gKi8KK3N0YXRpYyB2b2lkIHQzMTAxX2V4cGlyZWQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IGRhdGE7CisKKwlyc2xfcmZfY2hhbl9yZWxlYXNlKGxjaGFuKTsKK30KKworLyogTVMgaGFzIHJlcXVlc3RlZCBhIGNoYW5uZWwgb24gdGhlIFJBQ0ggKi8KK3N0YXRpYyBpbnQgcnNsX3J4X2NoYW5fcnFkKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IG1zZy0+dHJ4LT5idHM7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqcnFkX2hkciA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgZ3NtNDhfcmVxX3JlZiAqcnFkX3JlZjsKKwlzdHJ1Y3QgZ3NtNDhfaW1tX2FzcyBpYTsKKwllbnVtIGdzbV9jaGFuX3QgbGN0eXBlOworCWVudW0gZ3NtX2NocmVxX3JlYXNvbl90IGNocmVxX3JlYXNvbjsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKwl1X2ludDhfdCBycWRfdGE7CisJaW50IHJldDsKKworCXVfaW50MTZfdCBhcmZjbjsKKwl1X2ludDhfdCB0c19udW1iZXIsIHN1YmNoOworCisJLyogcGFyc2UgcmVxdWVzdCByZWZlcmVuY2UgdG8gYmUgdXNlZCBpbiBpbW1lZGlhdGUgYXNzaWduICovCisJaWYgKHJxZF9oZHItPmRhdGFbMF0gIT0gUlNMX0lFX1JFUV9SRUZFUkVOQ0UpCisJCXJldHVybiAtRUlOVkFMOworCisJcnFkX3JlZiA9IChzdHJ1Y3QgZ3NtNDhfcmVxX3JlZiAqKSAmcnFkX2hkci0+ZGF0YVsxXTsKKworCS8qIHBhcnNlIGFjY2VzcyBkZWxheSBhbmQgdXNlIGFzIFRBICovCisJaWYgKHJxZF9oZHItPmRhdGFbc2l6ZW9mKHN0cnVjdCBnc200OF9yZXFfcmVmKSsxXSAhPSBSU0xfSUVfQUNDRVNTX0RFTEFZKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlycWRfdGEgPSBycWRfaGRyLT5kYXRhW3NpemVvZihzdHJ1Y3QgZ3NtNDhfcmVxX3JlZikrMl07CisKKwkvKiBkZXRlcm1pbmUgY2hhbm5lbCB0eXBlIChTRENDSC9UQ0hfRi9UQ0hfSCkgYmFzZWQgb24KKwkgKiByZXF1ZXN0IHJlZmVyZW5jZSBSQSAqLworCWxjdHlwZSA9IGdldF9jdHlwZV9ieV9jaHJlcShidHMsIHJxZF9yZWYtPnJhLCBidHMtPm5ldHdvcmstPm5lY2kpOworCWNocmVxX3JlYXNvbiA9IGdldF9yZWFzb25fYnlfY2hyZXEoYnRzLCBycWRfcmVmLT5yYSwgYnRzLT5uZXR3b3JrLT5uZWNpKTsKKworCWNvdW50ZXJfaW5jKGJ0cy0+bmV0d29yay0+c3RhdHMuY2hyZXEudG90YWwpOworCisJLyogY2hlY2sgYXZhaWxhYmlsaXR5IC8gYWxsb2NhdGUgY2hhbm5lbCAqLworCWxjaGFuID0gbGNoYW5fYWxsb2MoYnRzLCBsY3R5cGUpOworCWlmICghbGNoYW4pIHsKKwkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIkJUUyAlZCBDSEFOIFJRRDogbm8gcmVzb3VyY2VzIGZvciAlcyAweCV4XG4iLAorCQkgICAgIG1zZy0+bGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsIGdzbV9sY2hhbnRfbmFtZShsY3R5cGUpLCBycWRfcmVmLT5yYSk7CisJCWNvdW50ZXJfaW5jKGJ0cy0+bmV0d29yay0+c3RhdHMuY2hyZXEubm9fY2hhbm5lbCk7CisJCS8qIEZJWE1FOiBzZW5kIHNvbWUga2luZCBvZiByZWplY3QgPyE/ICovCisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChsY2hhbi0+c3RhdGUgIT0gTENIQU5fU19OT05FKQorCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiJXMgbGNoYW5fYWxsb2MoKSByZXR1cm5lZCBjaGFubmVsICIKKwkJICAgICAiaW4gc3RhdGUgJXNcbiIsIGdzbV9sY2hhbl9uYW1lKGxjaGFuKSwKKwkJICAgICBnc21fbGNoYW5zX25hbWUobGNoYW4tPnN0YXRlKSk7CisJcnNsX2xjaGFuX3NldF9zdGF0ZShsY2hhbiwgTENIQU5fU19BQ1RfUkVRKTsKKworCXRzX251bWJlciA9IGxjaGFuLT50cy0+bnI7CisJYXJmY24gPSBsY2hhbi0+dHMtPnRyeC0+YXJmY247CisJc3ViY2ggPSBsY2hhbi0+bnI7CisJCisJbGNoYW4tPmVuY3IuYWxnX2lkID0gUlNMX0VOQ19BTEdfQTUoMCk7CS8qIG5vIGVuY3J5cHRpb24gKi8KKwlsY2hhbi0+bXNfcG93ZXIgPSBtc19wd3JfY3RsX2x2bChidHMtPmJhbmQsIGJ0cy0+bXNfbWF4X3Bvd2VyKTsKKwlsY2hhbi0+YnNfcG93ZXIgPSAwOyAvKiAwZEIgcmVkdWN0aW9uLCBvdXRwdXQgcG93ZXIgPSBQbiAqLworCWxjaGFuLT5yc2xfY21vZGUgPSBSU0xfQ01PRF9TUERfU0lHTjsKKwlsY2hhbi0+dGNoX21vZGUgPSBHU000OF9DTU9ERV9TSUdOOworCXJzbF9jaGFuX2FjdGl2YXRlX2xjaGFuKGxjaGFuLCAweDAwLCBycWRfdGEsIDApOworCisJLyogY3JlYXRlIElNTUVESUFURSBBU1NJR04gMDQuMDggbWVzc2dlICovCisJbWVtc2V0KCZpYSwgMCwgc2l6ZW9mKGlhKSk7CisJaWEubDJfcGxlbiA9IDB4MmQ7CisJaWEucHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19SUjsKKwlpYS5tc2dfdHlwZSA9IEdTTTQ4X01UX1JSX0lNTV9BU1M7CisJaWEucGFnZV9tb2RlID0gR1NNNDhfUE1fU0FNRTsKKwlpYS5jaGFuX2Rlc2MuY2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCWlhLmNoYW5fZGVzYy5oMC5oID0gMDsKKwlpYS5jaGFuX2Rlc2MuaDAuYXJmY25faGlnaCA9IGFyZmNuID4+IDg7CisJaWEuY2hhbl9kZXNjLmgwLmFyZmNuX2xvdyA9IGFyZmNuICYgMHhmZjsKKwlpYS5jaGFuX2Rlc2MuaDAudHNjID0gYnRzLT50c2M7CisJLyogdXNlIHJlcXVlc3QgcmVmZXJlbmNlIGV4dHJhY3RlZCBmcm9tIENIQU5fUlFEICovCisJbWVtY3B5KCZpYS5yZXFfcmVmLCBycWRfcmVmLCBzaXplb2YoaWEucmVxX3JlZikpOworCWlhLnRpbWluZ19hZHZhbmNlID0gcnFkX3RhOworCWlhLm1vYl9hbGxvY19sZW4gPSAwOworCisJREVCVUdQKERSU0wsICIlcyBBY3RpdmF0aW5nIEFSRkNOKCV1KSBTUygldSkgbGN0eXBlICVzICIKKwkJInI9JXMgcmE9MHglMDJ4XG4iLCBnc21fbGNoYW5fbmFtZShsY2hhbiksIGFyZmNuLCBzdWJjaCwKKwkJZ3NtX2xjaGFudF9uYW1lKGxjaGFuLT50eXBlKSwgZ3NtX2NocmVxX25hbWUoY2hyZXFfcmVhc29uKSwKKwkJcnFkX3JlZi0+cmEpOworCisJLyogU3RhcnQgdGltZXIgVDMxMDEgdG8gd2FpdCBmb3IgR1NNNDhfTVRfUlJfUEFHX1JFU1AgKi8KKwlsY2hhbi0+VDMxMDEuY2IgPSB0MzEwMV9leHBpcmVkOworCWxjaGFuLT5UMzEwMS5kYXRhID0gbGNoYW47CisJYnNjX3NjaGVkdWxlX3RpbWVyKCZsY2hhbi0+VDMxMDEsIGJ0cy0+bmV0d29yay0+VDMxMDEsIDApOworCisJLyogc2VuZCBJTU1FRElBVEUgQVNTSUdOIENNRCBvbiBSU0wgdG8gQlRTICh0byBzZW5kIG9uIENDQ0ggdG8gTVMpICovCisJcmV0ID0gcnNsX2ltbV9hc3NpZ25fY21kKGJ0cywgc2l6ZW9mKGlhKSwgKHVfaW50OF90ICopICZpYSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBNUyBoYXMgcmVxdWVzdGVkIGEgY2hhbm5lbCBvbiB0aGUgUkFDSCAqLworc3RhdGljIGludCByc2xfcnhfY2NjaF9sb2FkKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqcnNsaCA9IG1zZ2JfbDIobXNnKTsKKwl1X2ludDE2X3QgcGdfYnVmX3NwYWNlOworCXVfaW50MTZfdCByYWNoX3Nsb3RfY291bnQgPSAtMTsKKwl1X2ludDE2X3QgcmFjaF9idXN5X2NvdW50ID0gLTE7CisJdV9pbnQxNl90IHJhY2hfYWNjZXNzX2NvdW50ID0gLTE7CisKKwlzd2l0Y2ggKHJzbGgtPmRhdGFbMF0pIHsKKwljYXNlIFJTTF9JRV9QQUdJTkdfTE9BRDoKKwkJcGdfYnVmX3NwYWNlID0gcnNsaC0+ZGF0YVsxXSA8PCA4IHwgcnNsaC0+ZGF0YVsyXTsKKwkJaWYgKGlzX2lwYWNjZXNzX2J0cyhtc2ctPnRyeC0+YnRzKSAmJiBwZ19idWZfc3BhY2UgPT0gMHhmZmZmKSB7CisJCQkvKiBwYWdpbmcgbG9hZCBiZWxvdyBjb25maWd1cmVkIHRocmVzaG9sZCwgdXNlIDUwIGFzIGRlZmF1bHQgKi8KKwkJCXBnX2J1Zl9zcGFjZSA9IDUwOworCQl9CisJCXBhZ2luZ191cGRhdGVfYnVmZmVyX3NwYWNlKG1zZy0+dHJ4LT5idHMsIHBnX2J1Zl9zcGFjZSk7CisJCWJyZWFrOworCWNhc2UgUlNMX0lFX1JBQ0hfTE9BRDoKKwkJaWYgKG1zZy0+ZGF0YV9sZW4gPj0gNykgeworCQkJcmFjaF9zbG90X2NvdW50ID0gcnNsaC0+ZGF0YVsyXSA8PCA4IHwgcnNsaC0+ZGF0YVszXTsKKwkJCXJhY2hfYnVzeV9jb3VudCA9IHJzbGgtPmRhdGFbNF0gPDwgOCB8IHJzbGgtPmRhdGFbNV07CisJCQlyYWNoX2FjY2Vzc19jb3VudCA9IHJzbGgtPmRhdGFbNl0gPDwgOCB8IHJzbGgtPmRhdGFbN107CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWJpc19yc2xfcnhfY2NoYW4oc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpyc2xoID0gbXNnYl9sMihtc2cpOworCWludCByYyA9IDA7CisKKwltc2ctPmxjaGFuID0gbGNoYW5fbG9va3VwKG1zZy0+dHJ4LCByc2xoLT5jaGFuX25yKTsKKworCXN3aXRjaCAocnNsaC0+Yy5tc2dfdHlwZSkgeworCWNhc2UgUlNMX01UX0NIQU5fUlFEOgorCQkvKiBNUyBoYXMgcmVxdWVzdGVkIGEgY2hhbm5lbCBvbiB0aGUgUkFDSCAqLworCQlyYyA9IHJzbF9yeF9jaGFuX3JxZChtc2cpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9DQ0NIX0xPQURfSU5EOgorCQkvKiBjdXJyZW50IGxvYWQgb24gdGhlIENDQ0ggKi8KKwkJcmMgPSByc2xfcnhfY2NjaF9sb2FkKG1zZyk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX0RFTEVURV9JTkQ6CisJCS8qIENDQ0ggb3ZlcmxvYWRlZCwgSU1NX0FTU0lHTiB3YXMgZHJvcHBlZCAqLworCWNhc2UgUlNMX01UX0NCQ0hfTE9BRF9JTkQ6CisJCS8qIGN1cnJlbnQgbG9hZCBvbiB0aGUgQ0JDSCAqLworCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiVW5pbXBsZW1lbnRlZCBBYmlzIFJTTCBUUlggbWVzc2FnZSAiCisJCQkidHlwZSAweCUwMnhcbiIsIHJzbGgtPmMubXNnX3R5cGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiVW5rbm93biBBYmlzIFJTTCBUUlggbWVzc2FnZSB0eXBlICIKKwkJCSIweCUwMnhcbiIsIHJzbGgtPmMubXNnX3R5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcnNsX3J4X3JsbF9lcnJfaW5kKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX3JsbF9oZHIgKnJsbGggPSBtc2diX2wyKG1zZyk7CisJdV9pbnQ4X3QgKnJsbV9jYXVzZSA9IHJsbGgtPmRhdGE7CisKKwlMT0dQKERSTEwsIExPR0xfRVJST1IsICIlcyBFUlJPUiBJTkRJQ0FUSU9OIGNhdXNlPSVzXG4iLAorCQlnc21fbGNoYW5fbmFtZShtc2ctPmxjaGFuKSwKKwkJcnNsX3JsbV9jYXVzZV9uYW1lKHJsbV9jYXVzZVsxXSkpOworCisJcmxsX2luZGljYXRpb24obXNnLT5sY2hhbiwgcmxsaC0+bGlua19pZCwgQlNDX1JMTFJfSU5EX0VSUl9JTkQpOworCisJaWYgKHJsbV9jYXVzZVsxXSA9PSBSTExfQ0FVU0VfVDIwMF9FWFBJUkVEKSB7CisJCWNvdW50ZXJfaW5jKG1zZy0+bGNoYW4tPnRzLT50cngtPmJ0cy0+bmV0d29yay0+c3RhdHMuY2hhbi5ybGxfZXJyKTsKKwkJcmV0dXJuIHJzbF9yZl9jaGFuX3JlbGVhc2UobXNnLT5sY2hhbik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCUVTVEFCTElTSCBJTkRJQ0FUSU9OLCBMT0NBVElPTiBBUkVBIFVQREFURSBSRVFVRVNUCisJMHgwMiwgMHgwNiwKKwkweDAxLCAweDIwLAorCTB4MDIsIDB4MDAsCisJMHgwYiwgMHgwMCwgMHgwZiwgMHgwNSwgMHgwOCwgLi4uICovCisKK3N0YXRpYyBpbnQgYWJpc19yc2xfcnhfcmxsKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX3JsbF9oZHIgKnJsbGggPSBtc2diX2wyKG1zZyk7CisJaW50IHJjID0gMDsKKwljaGFyICp0c19uYW1lOworCXVfaW50OF90IHNhcGkgPSBybGxoLT5saW5rX2lkICYgNzsKKworCW1zZy0+bGNoYW4gPSBsY2hhbl9sb29rdXAobXNnLT50cngsIHJsbGgtPmNoYW5fbnIpOworCXRzX25hbWUgPSBnc21fbGNoYW5fbmFtZShtc2ctPmxjaGFuKTsKKwlERUJVR1AoRFJMTCwgIiVzIFNBUEk9JXUgIiwgdHNfbmFtZSwgc2FwaSk7CisJCisJc3dpdGNoIChybGxoLT5jLm1zZ190eXBlKSB7CisJY2FzZSBSU0xfTVRfREFUQV9JTkQ6CisJCURFQlVHUEMoRFJMTCwgIkRBVEEgSU5ESUNBVElPTlxuIik7CisJCWlmIChtc2diX2wybGVuKG1zZykgPgorCQkgICAgc2l6ZW9mKHN0cnVjdCBhYmlzX3JzbF9jb21tb25faGRyKSArIHNpemVvZigqcmxsaCkgJiYKKwkJICAgIHJsbGgtPmRhdGFbMF0gPT0gUlNMX0lFX0wzX0lORk8pIHsKKwkJCW1zZy0+bDNoID0gJnJsbGgtPmRhdGFbM107CisJCQlyZXR1cm4gZ3NtMDQwOF9yY3Ztc2cobXNnLCBybGxoLT5saW5rX2lkKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFJTTF9NVF9FU1RfSU5EOgorCQlERUJVR1BDKERSTEwsICJFU1RBQkxJU0ggSU5ESUNBVElPTlxuIik7CisJCS8qIGxjaGFuIGlzIGVzdGFibGlzaGVkLCBzdG9wIFQzMTAxICovCisJCW1zZy0+bGNoYW4tPnNhcGlzW3JsbGgtPmxpbmtfaWQgJiAweDddID0gTENIQU5fU0FQSV9NUzsKKwkJYnNjX2RlbF90aW1lcigmbXNnLT5sY2hhbi0+VDMxMDEpOworCQlpZiAobXNnYl9sMmxlbihtc2cpID4KKwkJICAgIHNpemVvZihzdHJ1Y3QgYWJpc19yc2xfY29tbW9uX2hkcikgKyBzaXplb2YoKnJsbGgpICYmCisJCSAgICBybGxoLT5kYXRhWzBdID09IFJTTF9JRV9MM19JTkZPKSB7CisJCQltc2ctPmwzaCA9ICZybGxoLT5kYXRhWzNdOworCQkJcmV0dXJuIGdzbTA0MDhfcmN2bXNnKG1zZywgcmxsaC0+bGlua19pZCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfRVNUX0NPTkY6CisJCURFQlVHUEMoRFJMTCwgIkVTVEFCTElTSCBDT05GSVJNXG4iKTsKKwkJbXNnLT5sY2hhbi0+c2FwaXNbcmxsaC0+bGlua19pZCAmIDB4N10gPSBMQ0hBTl9TQVBJX05FVDsKKwkJcmxsX2luZGljYXRpb24obXNnLT5sY2hhbiwgcmxsaC0+bGlua19pZCwKKwkJCQkgIEJTQ19STExSX0lORF9FU1RfQ09ORik7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX1JFTF9JTkQ6CisJCS8qIEJUUyBpbmZvcm1zIHVzIG9mIGhhdmluZyByZWNlaXZlZCAgRElTQyBmcm9tIE1TICovCisJCURFQlVHUEMoRFJMTCwgIlJFTEVBU0UgSU5ESUNBVElPTlxuIik7CisJCW1zZy0+bGNoYW4tPnNhcGlzW3JsbGgtPmxpbmtfaWQgJiAweDddID0gTENIQU5fU0FQSV9VTlVTRUQ7CisJCXJsbF9pbmRpY2F0aW9uKG1zZy0+bGNoYW4sIHJsbGgtPmxpbmtfaWQsCisJCQkJICBCU0NfUkxMUl9JTkRfUkVMX0lORCk7CisJCS8qIHdlIGNhbiBub3cgcmVsZWFlIHRoZSBjaGFubmVsIG9uIHRoZSBCVFMvQWJpcyBzaWRlICovCisJCS8qIEZJWE1FOiBvZmZpY2lhbGx5IHdlIG5lZWQgdG8gc3RhcnQgVDMxMTEgYW5kIHdhaXQgZm9yCisJCSAqIHNvbWUgZ3JhY2UgcGVyaW9kICovCisJCXJzbF9yZl9jaGFuX3JlbGVhc2UobXNnLT5sY2hhbik7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX1JFTF9DT05GOgorCQkvKiBCVFMgaW5mb3JtcyB1cyBvZiBoYXZpbmcgcmVjZWl2ZWQgVUEgZnJvbSBNUywKKwkJICogaW4gcmVzcG9uc2UgdG8gRElTQyB0aGF0IHdlJ3ZlIHNlbnQgZWFybGllciAqLworCQlERUJVR1BDKERSTEwsICJSRUxFQVNFIENPTkZJUk1BVElPTlxuIik7CisJCW1zZy0+bGNoYW4tPnNhcGlzW3JsbGgtPmxpbmtfaWQgJiAweDddID0gTENIQU5fU0FQSV9VTlVTRUQ7CisJCS8qIHdlIGNhbiBub3cgcmVsZWFlIHRoZSBjaGFubmVsIG9uIHRoZSBCVFMvQWJpcyBzaWRlICovCisJCS8qIEZJWE1FOiBvZmZpY2lhbGx5IHdlIG5lZWQgdG8gc3RhcnQgVDMxMTEgYW5kIHdhaXQgZm9yCisJCSAqIHNvbWUgZ3JhY2UgcGVyaW9kICovCisJCXJzbF9yZl9jaGFuX3JlbGVhc2UobXNnLT5sY2hhbik7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX0VSUk9SX0lORDoKKwkJcmMgPSByc2xfcnhfcmxsX2Vycl9pbmQobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfVU5JVF9EQVRBX0lORDoKKwkJTE9HUChEUkxMLCBMT0dMX05PVElDRSwgInVuaW1wbGVtZW50ZWQgQWJpcyBSTEwgbWVzc2FnZSAiCisJCQkidHlwZSAweCUwMnhcbiIsIHJsbGgtPmMubXNnX3R5cGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERSTEwsIExPR0xfTk9USUNFLCAidW5rbm93biBBYmlzIFJMTCBtZXNzYWdlICIKKwkJCSJ0eXBlIDB4JTAyeFxuIiwgcmxsaC0+Yy5tc2dfdHlwZSk7CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIHVfaW50OF90IGlwYV9zbW9kX3NfZm9yX2xjaGFuKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN3aXRjaCAobGNoYW4tPnRjaF9tb2RlKSB7CisJY2FzZSBHU000OF9DTU9ERV9TUEVFQ0hfVjE6CisJCXN3aXRjaCAobGNoYW4tPnR5cGUpIHsKKwkJY2FzZSBHU01fTENIQU5fVENIX0Y6CisJCQlyZXR1cm4gMHgwMDsKKwkJY2FzZSBHU01fTENIQU5fVENIX0g6CisJCQlyZXR1cm4gMHgwMzsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJY2FzZSBHU000OF9DTU9ERV9TUEVFQ0hfRUZSOgorCQlzd2l0Y2ggKGxjaGFuLT50eXBlKSB7CisJCWNhc2UgR1NNX0xDSEFOX1RDSF9GOgorCQkJcmV0dXJuIDB4MDE7CisJCS8qIHRoZXJlJ3Mgbm8gaGFsZi1yYXRlIEVGUiAqLworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwljYXNlIEdTTTQ4X0NNT0RFX1NQRUVDSF9BTVI6CisJCXN3aXRjaCAobGNoYW4tPnR5cGUpIHsKKwkJY2FzZSBHU01fTENIQU5fVENIX0Y6CisJCQlyZXR1cm4gMHgwMjsKKwkJY2FzZSBHU01fTENIQU5fVENIX0g6CisJCQlyZXR1cm4gMHgwNTsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgIkNhbm5vdCBkZXRlcm1pbmUgaXAuYWNjZXNzIHNwZWVjaCBtb2RlIGZvciAiCisJCSJ0Y2hfbW9kZSA9PSAweCUwMnhcbiIsIGxjaGFuLT50Y2hfbW9kZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1X2ludDhfdCBpcGFfcnRwX3B0X2Zvcl9sY2hhbihzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzd2l0Y2ggKGxjaGFuLT50Y2hfbW9kZSkgeworCWNhc2UgR1NNNDhfQ01PREVfU1BFRUNIX1YxOgorCQlzd2l0Y2ggKGxjaGFuLT50eXBlKSB7CisJCWNhc2UgR1NNX0xDSEFOX1RDSF9GOgorCQkJcmV0dXJuIFJUUF9QVF9HU01fRlVMTDsKKwkJY2FzZSBHU01fTENIQU5fVENIX0g6CisJCQlyZXR1cm4gUlRQX1BUX0dTTV9IQUxGOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwljYXNlIEdTTTQ4X0NNT0RFX1NQRUVDSF9FRlI6CisJCXN3aXRjaCAobGNoYW4tPnR5cGUpIHsKKwkJY2FzZSBHU01fTENIQU5fVENIX0Y6CisJCQlyZXR1cm4gUlRQX1BUX0dTTV9FRlI7CisJCS8qIHRoZXJlJ3Mgbm8gaGFsZi1yYXRlIEVGUiAqLworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwljYXNlIEdTTTQ4X0NNT0RFX1NQRUVDSF9BTVI6CisJCXN3aXRjaCAobGNoYW4tPnR5cGUpIHsKKwkJY2FzZSBHU01fTENIQU5fVENIX0Y6CisJCQlyZXR1cm4gUlRQX1BUX0FNUl9GVUxMOworCQljYXNlIEdTTV9MQ0hBTl9UQ0hfSDoKKwkJCXJldHVybiBSVFBfUFRfQU1SX0hBTEY7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlMT0dQKERSU0wsIExPR0xfRVJST1IsICJDYW5ub3QgZGV0ZXJtaW5lIGlwLmFjY2VzcyBydHAgcGF5bG9hZCB0eXBlIGZvciAiCisJCSJ0Y2hfbW9kZSA9PSAweCUwMnhcbiAmIGxjaGFuX3R5cGUgPT0gJWQiLAorCQlsY2hhbi0+dGNoX21vZGUsIGxjaGFuLT50eXBlKTsKKwlyZXR1cm4gMDsKK30KKworLyogaXAuYWNjZXNzIHNwZWNpZmljIFJTTCBleHRlbnNpb25zICovCitzdGF0aWMgdm9pZCBpcGFjX3BhcnNlX3J0cChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgc3RydWN0IHRsdl9wYXJzZWQgKnR2KQoreworCXN0cnVjdCBpbl9hZGRyIGlwOworCXVfaW50MTZfdCBwb3J0LCBjb25uX2lkOworCisJaWYgKFRMVlBfUFJFU0VOVCh0diwgUlNMX0lFX0lQQUNfTE9DQUxfSVApKSB7CisJCWlwLnNfYWRkciA9ICooKHVfaW50MzJfdCAqKSBUTFZQX1ZBTCh0diwgUlNMX0lFX0lQQUNfTE9DQUxfSVApKTsKKwkJREVCVUdQQyhEUlNMLCAiTE9DQUxfSVA9JXMgIiwgaW5ldF9udG9hKGlwKSk7CisJCWxjaGFuLT5hYmlzX2lwLmJvdW5kX2lwID0gbnRvaGwoaXAuc19hZGRyKTsKKwl9CisKKwlpZiAoVExWUF9QUkVTRU5UKHR2LCBSU0xfSUVfSVBBQ19MT0NBTF9QT1JUKSkgeworCQlwb3J0ID0gKigodV9pbnQxNl90ICopIFRMVlBfVkFMKHR2LCBSU0xfSUVfSVBBQ19MT0NBTF9QT1JUKSk7CisJCXBvcnQgPSBudG9ocyhwb3J0KTsKKwkJREVCVUdQQyhEUlNMLCAiTE9DQUxfUE9SVD0ldSAiLCBwb3J0KTsKKwkJbGNoYW4tPmFiaXNfaXAuYm91bmRfcG9ydCA9IHBvcnQ7CisJfQorCisJaWYgKFRMVlBfUFJFU0VOVCh0diwgUlNMX0lFX0lQQUNfQ09OTl9JRCkpIHsKKwkJY29ubl9pZCA9ICooKHVfaW50MTZfdCAqKSBUTFZQX1ZBTCh0diwgUlNMX0lFX0lQQUNfQ09OTl9JRCkpOworCQljb25uX2lkID0gbnRvaHMoY29ubl9pZCk7CisJCURFQlVHUEMoRFJTTCwgIkNPTl9JRD0ldSAiLCBjb25uX2lkKTsKKwkJbGNoYW4tPmFiaXNfaXAuY29ubl9pZCA9IGNvbm5faWQ7CisJfQorCisJaWYgKFRMVlBfUFJFU0VOVCh0diwgUlNMX0lFX0lQQUNfUlRQX1BBWUxPQUQyKSkgeworCQlsY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZDIgPQorCQkJCSpUTFZQX1ZBTCh0diwgUlNMX0lFX0lQQUNfUlRQX1BBWUxPQUQyKTsKKwkJREVCVUdQQyhEUlNMLCAiUlRQX1BBWUxPQUQyPTB4JTAyeCAiLAorCQkJbGNoYW4tPmFiaXNfaXAucnRwX3BheWxvYWQyKTsKKwl9CisKKwlpZiAoVExWUF9QUkVTRU5UKHR2LCBSU0xfSUVfSVBBQ19TUEVFQ0hfTU9ERSkpIHsKKwkJbGNoYW4tPmFiaXNfaXAuc3BlZWNoX21vZGUgPQorCQkJCSpUTFZQX1ZBTCh0diwgUlNMX0lFX0lQQUNfU1BFRUNIX01PREUpOworCQlERUJVR1BDKERSU0wsICJzcGVlY2hfbW9kZT0weCUwMnggIiwKKwkJCWxjaGFuLT5hYmlzX2lwLnNwZWVjaF9tb2RlKTsKKwl9CisKKwlpZiAoVExWUF9QUkVTRU5UKHR2LCBSU0xfSUVfSVBBQ19SRU1PVEVfSVApKSB7CisJCWlwLnNfYWRkciA9ICooKHVfaW50MzJfdCAqKSBUTFZQX1ZBTCh0diwgUlNMX0lFX0lQQUNfUkVNT1RFX0lQKSk7CisJCURFQlVHUEMoRFJTTCwgIlJFTU9URV9JUD0lcyAiLCBpbmV0X250b2EoaXApKTsKKwkJbGNoYW4tPmFiaXNfaXAuY29ubmVjdF9pcCA9IG50b2hsKGlwLnNfYWRkcik7CisJfQorCisJaWYgKFRMVlBfUFJFU0VOVCh0diwgUlNMX0lFX0lQQUNfUkVNT1RFX1BPUlQpKSB7CisJCXBvcnQgPSAqKCh1X2ludDE2X3QgKikgVExWUF9WQUwodHYsIFJTTF9JRV9JUEFDX1JFTU9URV9QT1JUKSk7CisJCXBvcnQgPSBudG9ocyhwb3J0KTsKKwkJREVCVUdQQyhEUlNMLCAiUkVNT1RFX1BPUlQ9JXUgIiwgcG9ydCk7CisJCWxjaGFuLT5hYmlzX2lwLmNvbm5lY3RfcG9ydCA9IHBvcnQ7CisJfQorfQorCitpbnQgcnNsX2lwYWNjX2NyY3goc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfSVBBQ19DUkNYKTsKKwlkaC0+Yy5tc2dfZGlzY3IgPSBBQklTX1JTTF9NRElTQ19JUEFDQ0VTUzsKKwlkaC0+Y2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCisJLyogMHgxLSA9PSByZWNlaXZlLW9ubHksIDB4LTEgPT0gRUZSIGNvZGVjICovCisJbGNoYW4tPmFiaXNfaXAuc3BlZWNoX21vZGUgPSAweDEwIHwgaXBhX3Ntb2Rfc19mb3JfbGNoYW4obGNoYW4pOworCWxjaGFuLT5hYmlzX2lwLnJ0cF9wYXlsb2FkID0gaXBhX3J0cF9wdF9mb3JfbGNoYW4obGNoYW4pOworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX0lQQUNfU1BFRUNIX01PREUsIGxjaGFuLT5hYmlzX2lwLnNwZWVjaF9tb2RlKTsKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9JUEFDX1JUUF9QQVlMT0FELCBsY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZCk7CisKKwlERUJVR1AoRFJTTCwgIiVzIElQQUNfQklORCBzcGVlY2hfbW9kZT0weCUwMnggUlRQX1BBWUxPQUQ9JWRcbiIsCisJCWdzbV9sY2hhbl9uYW1lKGxjaGFuKSwgbGNoYW4tPmFiaXNfaXAuc3BlZWNoX21vZGUsCisJCWxjaGFuLT5hYmlzX2lwLnJ0cF9wYXlsb2FkKTsKKworCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCitpbnQgcnNsX2lwYWNjX21kY3goc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50MzJfdCBpcCwgdV9pbnQxNl90IHBvcnQsCisJCSAgIHVfaW50OF90IHJ0cF9wYXlsb2FkMikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwl1X2ludDMyX3QgKmF0dF9pcDsKKwlzdHJ1Y3QgaW5fYWRkciBpYTsKKworCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9JUEFDX01EQ1gpOworCWRoLT5jLm1zZ19kaXNjciA9IEFCSVNfUlNMX01ESVNDX0lQQUNDRVNTOworCWRoLT5jaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisKKwkvKiB3ZSBuZWVkIHRvIHN0b3JlIHRoZXNlIG5vdyBhcyBNRENYX0FDSyBkb2VzIG5vdCByZXR1cm4gdGhlbSA6KCAqLworCWxjaGFuLT5hYmlzX2lwLnJ0cF9wYXlsb2FkMiA9IHJ0cF9wYXlsb2FkMjsKKwlsY2hhbi0+YWJpc19pcC5jb25uZWN0X3BvcnQgPSBwb3J0OworCWxjaGFuLT5hYmlzX2lwLmNvbm5lY3RfaXAgPSBpcDsKKworCS8qIDB4MC0gPT0gYm90aCBkaXJlY3Rpb25zLCAweC0xID09IEVGUiBjb2RlYyAqLworCWxjaGFuLT5hYmlzX2lwLnNwZWVjaF9tb2RlID0gMHgwMCB8IGlwYV9zbW9kX3NfZm9yX2xjaGFuKGxjaGFuKTsKKwlsY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZCA9IGlwYV9ydHBfcHRfZm9yX2xjaGFuKGxjaGFuKTsKKworCWlhLnNfYWRkciA9IGh0b25sKGlwKTsKKwlERUJVR1AoRFJTTCwgIiVzIElQQUNfTURDWCBJUD0lcyBQT1JUPSVkIFJUUF9QQVlMT0FEPSVkIFJUUF9QQVlMT0FEMj0lZCAiCisJCSJDT05OX0lEPSVkIHNwZWVjaF9tb2RlPTB4JTAyeFxuIiwgZ3NtX2xjaGFuX25hbWUobGNoYW4pLAorCQlpbmV0X250b2EoaWEpLCBwb3J0LCBsY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZCwgcnRwX3BheWxvYWQyLAorCQlsY2hhbi0+YWJpc19pcC5jb25uX2lkLCBsY2hhbi0+YWJpc19pcC5zcGVlY2hfbW9kZSk7CisKKwltc2diX3R2MTZfcHV0KG1zZywgUlNMX0lFX0lQQUNfQ09OTl9JRCwgbGNoYW4tPmFiaXNfaXAuY29ubl9pZCk7CisJbXNnYl92X3B1dChtc2csIFJTTF9JRV9JUEFDX1JFTU9URV9JUCk7CisJYXR0X2lwID0gKHVfaW50MzJfdCAqKSBtc2diX3B1dChtc2csIHNpemVvZihpcCkpOworCSphdHRfaXAgPSBpYS5zX2FkZHI7CisJbXNnYl90djE2X3B1dChtc2csIFJTTF9JRV9JUEFDX1JFTU9URV9QT1JULCBwb3J0KTsKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9JUEFDX1NQRUVDSF9NT0RFLCBsY2hhbi0+YWJpc19pcC5zcGVlY2hfbW9kZSk7CisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfSVBBQ19SVFBfUEFZTE9BRCwgbGNoYW4tPmFiaXNfaXAucnRwX3BheWxvYWQpOworCWlmIChydHBfcGF5bG9hZDIpCisJCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX0lQQUNfUlRQX1BBWUxPQUQyLCBydHBfcGF5bG9hZDIpOworCQorCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCisvKiB0ZWxsIEJUUyB0byBjb25uZWN0IFJUUCBzdHJlYW0gdG8gb3VyIGxvY2FsIFJUUCBzb2NrZXQgKi8KK2ludCByc2xfaXBhY2NfbWRjeF90b19ydHBzb2NrKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN0cnVjdCBydHBfc29ja2V0ICpycyA9IGxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQ7CisJaW50IHJjOworCisJcmMgPSByc2xfaXBhY2NfbWRjeChsY2hhbiwgbnRvaGwocnMtPnJ0cC5zaW5fbG9jYWwuc2luX2FkZHIuc19hZGRyKSwKKwkJCQludG9ocyhycy0+cnRwLnNpbl9sb2NhbC5zaW5fcG9ydCksCisJCQkvKiBGSVhNRTogdXNlIFJUUCBwYXlsb2FkIG9mIGJvdW5kIHNvY2tldCwgbm90IEJUUyovCisJCQkJbGNoYW4tPmFiaXNfaXAucnRwX3BheWxvYWQyKTsKKworCXJldHVybiByYzsKK30KKworaW50IHJzbF9pcGFjY19wZGNoX2FjdGl2YXRlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCBpbnQgYWN0KQoreworCXN0cnVjdCBtc2diICptc2cgPSByc2xfbXNnYl9hbGxvYygpOworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCXVfaW50OF90IG1zZ190eXBlOworCisJaWYgKGFjdCkKKwkJbXNnX3R5cGUgPSBSU0xfTVRfSVBBQ19QRENIX0FDVDsKKwllbHNlCisJCW1zZ190eXBlID0gUlNMX01UX0lQQUNfUERDSF9ERUFDVDsKKworCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIG1zZ190eXBlKTsKKwlkaC0+Yy5tc2dfZGlzY3IgPSBBQklTX1JTTF9NRElTQ19ERURfQ0hBTjsKKwlkaC0+Y2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCisJREVCVUdQKERSU0wsICIlcyBJUEFDX1BEQ0hfJXNBQ1RcbiIsIGdzbV9sY2hhbl9uYW1lKGxjaGFuKSwKKwkJYWN0ID8gIiIgOiAiREUiKTsKKworCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCitzdGF0aWMgaW50IGFiaXNfcnNsX3J4X2lwYWNjX2NyY3hfYWNrKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGggPSBtc2diX2wyKG1zZyk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHY7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBtc2ctPmxjaGFuOworCisJLyogdGhlIEJUUyBoYXMgYWNrbm93bGVkZ2VkIGEgbG9jYWwgYmluZCwgaXQgbm93IHRlbGxzIHVzIHRoZSBJUAorCSogYWRkcmVzcyBhbmQgcG9ydCBudW1iZXIgdG8gd2hpY2ggaXQgaGFzIGJvdW5kIHRoZSBnaXZlbiBsb2dpY2FsCisJKiBjaGFubmVsICovCisKKwlyc2xfdGx2X3BhcnNlKCZ0diwgZGgtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKS1zaXplb2YoKmRoKSk7CisJaWYgKCFUTFZQX1BSRVNFTlQoJnR2LCBSU0xfSUVfSVBBQ19MT0NBTF9QT1JUKSB8fAorCSAgICAhVExWUF9QUkVTRU5UKCZ0diwgUlNMX0lFX0lQQUNfTE9DQUxfSVApIHx8CisJICAgICFUTFZQX1BSRVNFTlQoJnR2LCBSU0xfSUVfSVBBQ19DT05OX0lEKSkgeworCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAibWFuZGF0b3J5IElFIG1pc3NpbmciKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaXBhY19wYXJzZV9ydHAobGNoYW4sICZ0dik7CisKKwkvKiBpbiBjYXNlIHdlIGRvbid0IHVzZSBkaXJlY3QgQlRTLXRvLUJUUyBSVFAgKi8KKwlpZiAoIWlwYWNjX3J0cF9kaXJlY3QpIHsKKwkJaW50IHJjOworCQkvKiB0aGUgQlRTIGhhcyBzdWNjZXNzZnVsbHkgYm91bmQgYSBUQ0ggdG8gYSBsb2NhbCBpcC9wb3J0LAorCQkgKiB3aGljaCBtZWFucyB3ZSBjYW4gY29ubmVjdCBvdXIgVURQIHNvY2tldCB0byBpdCAqLworCQlpZiAobGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCkgeworCQkJcnRwX3NvY2tldF9mcmVlKGxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQpOworCQkJbGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCA9IE5VTEw7CisJCX0KKworCQlsY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0ID0gcnRwX3NvY2tldF9jcmVhdGUoKTsKKwkJaWYgKCFsY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0KQorCQkJZ290byBvdXRfZXJyOworCisJCXJjID0gcnRwX3NvY2tldF9jb25uZWN0KGxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQsCisJCQkJICAgbGNoYW4tPmFiaXNfaXAuYm91bmRfaXAsCisJCQkJICAgbGNoYW4tPmFiaXNfaXAuYm91bmRfcG9ydCk7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIG91dF9lcnI7CisJfQorCisJZGlzcGF0Y2hfc2lnbmFsKFNTX0FCSVNJUCwgU19BQklTSVBfQ1JDWF9BQ0ssIG1zZy0+bGNoYW4pOworCisJcmV0dXJuIDA7CitvdXRfZXJyOgorCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaW50IGFiaXNfcnNsX3J4X2lwYWNjX21kY3hfYWNrKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGggPSBtc2diX2wyKG1zZyk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHY7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBtc2ctPmxjaGFuOworCisJLyogdGhlIEJUUyBoYXMgYWNrbm93bGVkZ2VkIGEgcmVtb3RlIGNvbm5lY3QgcmVxdWVzdCBhbmQKKwkgKiBpdCBub3cgdGVsbHMgdXMgdGhlIElQIGFkZHJlc3MgYW5kIHBvcnQgbnVtYmVyIHRvIHdoaWNoIGl0IGhhcworCSAqIGNvbm5lY3RlZCB0aGUgZ2l2ZW4gbG9naWNhbCBjaGFubmVsICovCisKKwlyc2xfdGx2X3BhcnNlKCZ0diwgZGgtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKS1zaXplb2YoKmRoKSk7CisJaXBhY19wYXJzZV9ydHAobGNoYW4sICZ0dik7CisJZGlzcGF0Y2hfc2lnbmFsKFNTX0FCSVNJUCwgU19BQklTSVBfTURDWF9BQ0ssIG1zZy0+bGNoYW4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWJpc19yc2xfcnhfaXBhY2NfZGxjeF9pbmQoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaCA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0djsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IG1zZy0+bGNoYW47CisKKwlyc2xfdGx2X3BhcnNlKCZ0diwgZGgtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKS1zaXplb2YoKmRoKSk7CisKKwlpZiAoVExWUF9QUkVTRU5UKCZ0diwgUlNMX0lFX0NBVVNFKSkKKwkJcHJpbnRfcnNsX2NhdXNlKExPR0xfREVCVUcsIFRMVlBfVkFMKCZ0diwgUlNMX0lFX0NBVVNFKSwKKwkJCQlUTFZQX0xFTigmdHYsIFJTTF9JRV9DQVVTRSkpOworCisJLyogdGhlIEJUUyB0ZWxscyB1cyBhIFJUUCBzdHJlYW0gaGFzIGJlZW4gZGlzY29ubmVjdGVkICovCisJaWYgKGxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQpIHsKKwkJcnRwX3NvY2tldF9mcmVlKGxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQpOworCQlsY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0ID0gTlVMTDsKKwl9CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfQUJJU0lQLCBTX0FCSVNJUF9ETENYX0lORCwgbXNnLT5sY2hhbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhYmlzX3JzbF9yeF9pcGFjYyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9ybGxfaGRyICpybGxoID0gbXNnYl9sMihtc2cpOworCWNoYXIgKnRzX25hbWU7CisJaW50IHJjID0gMDsKKworCW1zZy0+bGNoYW4gPSBsY2hhbl9sb29rdXAobXNnLT50cngsIHJsbGgtPmNoYW5fbnIpOworCXRzX25hbWUgPSBnc21fbGNoYW5fbmFtZShtc2ctPmxjaGFuKTsKKwkKKwlzd2l0Y2ggKHJsbGgtPmMubXNnX3R5cGUpIHsKKwljYXNlIFJTTF9NVF9JUEFDX0NSQ1hfQUNLOgorCQlERUJVR1AoRFJTTCwgIiVzIElQQUNfQ1JDWF9BQ0sgIiwgdHNfbmFtZSk7CisJCXJjID0gYWJpc19yc2xfcnhfaXBhY2NfY3JjeF9hY2sobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfSVBBQ19DUkNYX05BQ0s6CisJCS8qIHNvbWVob3cgdGhlIEJUUyB3YXMgdW5hYmxlIHRvIGJpbmQgdGhlIGxjaGFuIHRvIGl0cyBsb2NhbAorCQkgKiBwb3J0PyE/ICovCisJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgIiVzIElQQUNfQ1JDWF9OQUNLXG4iLCB0c19uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfSVBBQ19NRENYX0FDSzoKKwkJLyogdGhlIEJUUyB0ZWxscyB1cyB0aGF0IGEgY29ubmVjdCBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgKi8KKwkJREVCVUdQKERSU0wsICIlcyBJUEFDX01EQ1hfQUNLICIsIHRzX25hbWUpOworCQlyYyA9IGFiaXNfcnNsX3J4X2lwYWNjX21kY3hfYWNrKG1zZyk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX0lQQUNfTURDWF9OQUNLOgorCQkvKiBzb21laG93IHRoZSBCVFMgd2FzIHVuYWJsZSB0byBjb25uZWN0IHRoZSBsY2hhbiB0byBhIHJlbW90ZQorCQkgKiBwb3J0ICovCisJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgIiVzIElQQUNfTURDWF9OQUNLXG4iLCB0c19uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfSVBBQ19ETENYX0lORDoKKwkJREVCVUdQKERSU0wsICIlcyBJUEFDX0RMQ1hfSU5EICIsIHRzX25hbWUpOworCQlyYyA9IGFiaXNfcnNsX3J4X2lwYWNjX2RsY3hfaW5kKG1zZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICJVbmtub3duIGlwLmFjY2VzcyBtc2dfdHlwZSAweCUwMnhcbiIsCisJCQlybGxoLT5jLm1zZ190eXBlKTsKKwkJYnJlYWs7CisJfQorCURFQlVHUEMoRFJTTCwgIlxuIik7CisKKwlyZXR1cm4gcmM7Cit9CisKKworLyogRW50cnktcG9pbnQgd2hlcmUgTDIgUlNMIGZyb20gQlRTIGVudGVycyAqLworaW50IGFiaXNfcnNsX3Jjdm1zZyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9jb21tb25faGRyICpyc2xoOworCWludCByYyA9IDA7CisKKwlpZiAoIW1zZykgeworCQlERUJVR1AoRFJTTCwgIkVtcHR5IFJTTCBtc2c/Li5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKG1zZ2JfbDJsZW4obXNnKSA8IHNpemVvZigqcnNsaCkpIHsKKwkJREVCVUdQKERSU0wsICJUcnVuY2F0ZWQgUlNMIG1lc3NhZ2Ugd2l0aCBsMmxlbjogJXVcbiIsIG1zZ2JfbDJsZW4obXNnKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyc2xoID0gbXNnYl9sMihtc2cpOworCisJc3dpdGNoIChyc2xoLT5tc2dfZGlzY3IgJiAweGZlKSB7CisJY2FzZSBBQklTX1JTTF9NRElTQ19STEw6CisJCXJjID0gYWJpc19yc2xfcnhfcmxsKG1zZyk7CisJCWJyZWFrOworCWNhc2UgQUJJU19SU0xfTURJU0NfREVEX0NIQU46CisJCXJjID0gYWJpc19yc2xfcnhfZGNoYW4obXNnKTsKKwkJYnJlYWs7CisJY2FzZSBBQklTX1JTTF9NRElTQ19DT01fQ0hBTjoKKwkJcmMgPSBhYmlzX3JzbF9yeF9jY2hhbihtc2cpOworCQlicmVhazsKKwljYXNlIEFCSVNfUlNMX01ESVNDX1RSWDoKKwkJcmMgPSBhYmlzX3JzbF9yeF90cngobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBBQklTX1JTTF9NRElTQ19MT0M6CisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICJ1bmltcGxlbWVudGVkIFJTTCBtc2cgZGlzYyAweCUwMnhcbiIsCisJCQlyc2xoLT5tc2dfZGlzY3IpOworCQlicmVhazsKKwljYXNlIEFCSVNfUlNMX01ESVNDX0lQQUNDRVNTOgorCQlyYyA9IGFiaXNfcnNsX3J4X2lwYWNjKG1zZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICJ1bmtub3duIFJTTCBtZXNzYWdlIGRpc2NyaW1pbmF0b3IgIgorCQkJIjB4JTAyeFxuIiwgcnNsaC0+bXNnX2Rpc2NyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW1zZ2JfZnJlZShtc2cpOworCXJldHVybiByYzsKK30KKworLyogRnJvbSBUYWJsZSAxMC41LjMzIG9mIEdTTSAwNC4wOCAqLworaW50IHJzbF9udW1iZXJfb2ZfcGFnaW5nX3N1YmNoYW5uZWxzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJaWYgKGJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5jY2NoX2NvbmYgPT0gUlNMX0JDQ0hfQ0NDSF9DT05GXzFfQykgeworCQlyZXR1cm4gTUFYKDEsICgzIC0gYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLmJzX2FnX2Jsa3NfcmVzKSkKKwkJCSogKGJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5ic19wYV9tZnJtcyArIDIpOworCX0gZWxzZSB7CisJCXJldHVybiAoOSAtIGJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5ic19hZ19ibGtzX3JlcykKKwkJCSogKGJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5ic19wYV9tZnJtcyArIDIpOworCX0KK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2JzMTFfY29uZmlnLmMgYi9vcGVuYnNjL3NyYy9iczExX2NvbmZpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NDkzYjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9iczExX2NvbmZpZy5jCkBAIC0wLDAgKzEsODcyIEBACisvKiBTaWVtZW5zIEJTLTExIG1pY3JvQlRTIGNvbmZpZ3VyYXRpb24gdG9vbCAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYmFzZWQgb24gaWRlYXMgKGJ1dCBub3QgY29kZSkgb2YgQlMxMUNvbmZpZworICogKEMpIDIwMDkgYnkgRGlldGVyIFNwYWFyIDxzcGFhckBtaXJpZGVyLmF1Z3VzdGEuZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfbm0uaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcnMyMzIuaD4KKworLyogc3RhdGUgb2Ygb3VyIGJzMTFfY29uZmlnIGFwcGxpY2F0aW9uICovCitlbnVtIGJzMTFjZmdfc3RhdGUgeworCVNUQVRFX05PTkUsCisJU1RBVEVfTE9HT05fV0FJVCwKKwlTVEFURV9MT0dPTl9BQ0ssCisJU1RBVEVfU1dMT0FELAorCVNUQVRFX1FVRVJZLAorfTsKK3N0YXRpYyBlbnVtIGJzMTFjZmdfc3RhdGUgYnMxMWNmZ19zdGF0ZSA9IFNUQVRFX05PTkU7CitzdGF0aWMgY2hhciAqY29tbWFuZCwgKnZhbHVlOworc3RydWN0IHRpbWVyX2xpc3Qgc3RhdHVzX3RpbWVyOworCitzdGF0aWMgY29uc3QgdV9pbnQ4X3Qgb2JqX2xpX2F0dHJbXSA9IHsKKwlOTV9BVFRfQlMxMV9CSVRfRVJSX1RIRVNILCAweDA5LCAweDAwLAorCU5NX0FUVF9CUzExX0wxX1BST1RfVFlQRSwgMHgwMCwKKwlOTV9BVFRfQlMxMV9MSU5FX0NGRywgMHgwMCwKK307CitzdGF0aWMgY29uc3QgdV9pbnQ4X3Qgb2JqX2Jic2lnMF9hdHRyW10gPSB7CisJTk1fQVRUX0JTMTFfUlNTSV9PRkZTLCAweDAyLCAweDAwLCAweDAwLAorCU5NX0FUVF9CUzExX0RJVkVSU0lUWSwgMHgwMSwgMHgwMCwKK307CitzdGF0aWMgY29uc3QgdV9pbnQ4X3Qgb2JqX3BhMF9hdHRyW10gPSB7CisJTk1fQVRUX0JTMTFfVFhQV1IsIDB4MDEsIEJTMTFfVFJYX1BPV0VSX0dTTV8zMG1XLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICp0cngxX3Bhc3N3b3JkID0gIjExMTExMTExMTEiOworI2RlZmluZSBURUlfT01MCTI1CisKK3N0YXRpYyBjb25zdCB1X2ludDhfdCB0b29fZmFzdFtdID0geyAweDEyLCAweDgwLCAweDAwLCAweDAwLCAweDAyLCAweDAyIH07CisKK3N0YXRpYyBzdHJ1Y3QgbG9nX3RhcmdldCAqc3RkZXJyX3RhcmdldDsKKworLyogZHVtbXkgZnVuY3Rpb24gdG8ga2VlcCBnc21fZGF0YS5jIGhhcHB5ICovCitzdHJ1Y3QgY291bnRlciAqY291bnRlcl9hbGxvYyhjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiBOVUxMOworfQorCitpbnQgaGFuZGxlX3NlcmlhbF9tc2coc3RydWN0IG1zZ2IgKnJ4X21zZyk7CisKKy8qIGNyZWF0ZSBhbGwgb2JqZWN0cyBmb3IgYW4gaW5pdGlhbCBjb25maWd1cmF0aW9uICovCitzdGF0aWMgaW50IGNyZWF0ZV9vYmplY3RzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJZnByaW50ZihzdGRvdXQsICJDcmF0aW5nIE9iamVjdHMgZm9yIG1pbmltYWwgY29uZmlnXG4iKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX29iamVjdChidHMsIEJTMTFfT0JKX0xJLCAwLCBzaXplb2Yob2JqX2xpX2F0dHIpLAorCQkJCSAgIG9ial9saV9hdHRyKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX29iamVjdChidHMsIEJTMTFfT0JKX0dQU1UsIDAsIDAsIE5VTEwpOworCWFiaXNfbm1fYnMxMV9jcmVhdGVfb2JqZWN0KGJ0cywgQlMxMV9PQkpfQUxDTywgMCwgMCwgTlVMTCk7CisJYWJpc19ubV9iczExX2NyZWF0ZV9vYmplY3QoYnRzLCBCUzExX09CSl9DQ0xLLCAwLCAwLCBOVUxMKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX29iamVjdChidHMsIEJTMTFfT0JKX0JCU0lHLCAwLAorCQkJCSAgIHNpemVvZihvYmpfYmJzaWcwX2F0dHIpLCBvYmpfYmJzaWcwX2F0dHIpOworCWFiaXNfbm1fYnMxMV9jcmVhdGVfb2JqZWN0KGJ0cywgQlMxMV9PQkpfUEEsIDAsCisJCQkJICAgc2l6ZW9mKG9ial9wYTBfYXR0ciksIG9ial9wYTBfYXR0cik7CisJYWJpc19ubV9iczExX2NyZWF0ZV9lbnZhQlRTRShidHMsIDApOworCWFiaXNfbm1fYnMxMV9jcmVhdGVfZW52YUJUU0UoYnRzLCAxKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX2VudmFCVFNFKGJ0cywgMik7CisJYWJpc19ubV9iczExX2NyZWF0ZV9lbnZhQlRTRShidHMsIDMpOworCisJYWJpc19ubV9iczExX2Nvbm5fb21sX3RlaShidHMsIDAsIDEsIDB4ZmYsIFRFSV9PTUwpOworCisJYWJpc19ubV9iczExX3NldF90cnhfcG93ZXIoYnRzLT5jMCwgQlMxMV9UUlhfUE9XRVJfR1NNXzMwbVcpOworCQorCXNsZWVwKDEpOworCisJYWJpc19ubV9iczExX3NldF90cngxX3B3KGJ0cywgdHJ4MV9wYXNzd29yZCk7CisKKwlzbGVlcCgxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNyZWF0ZV90cngxKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJdV9pbnQ4X3QgYmJzaWcxX2F0dHJbc2l6ZW9mKG9ial9iYnNpZzBfYXR0cikrMTJdOworCXVfaW50OF90ICpjdXIgPSBiYnNpZzFfYXR0cjsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIDEpOworCisJaWYgKCF0cngpCisJCXRyeCA9IGdzbV9idHNfdHJ4X2FsbG9jKGJ0cyk7CisKKwlmcHJpbnRmKHN0ZG91dCwgIkNyYXRpbmcgT2JqZWN0cyBmb3IgVFJYMVxuIik7CisKKwlhYmlzX25tX2JzMTFfc2V0X3RyeDFfcHcoYnRzLCB0cngxX3Bhc3N3b3JkKTsKKworCXNsZWVwKDEpOworCisJY3VyID0gdGx2X3B1dChjdXIsIE5NX0FUVF9CUzExX1BBU1NXT1JELCAxMCwKKwkJICAgICAgKHVfaW50OF90ICopdHJ4MV9wYXNzd29yZCk7CisJbWVtY3B5KGN1ciwgb2JqX2Jic2lnMF9hdHRyLCBzaXplb2Yob2JqX2Jic2lnMF9hdHRyKSk7CisJYWJpc19ubV9iczExX2NyZWF0ZV9vYmplY3QoYnRzLCBCUzExX09CSl9CQlNJRywgMSwKKwkJCQkgICBzaXplb2YoYmJzaWcxX2F0dHIpLCBiYnNpZzFfYXR0cik7CisJYWJpc19ubV9iczExX2NyZWF0ZV9vYmplY3QoYnRzLCBCUzExX09CSl9QQSwgMSwKKwkJCQkgICBzaXplb2Yob2JqX3BhMF9hdHRyKSwgb2JqX3BhMF9hdHRyKTsKKwlhYmlzX25tX2JzMTFfc2V0X3RyeF9wb3dlcih0cngsIEJTMTFfVFJYX1BPV0VSX0dTTV8zMG1XKTsKKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNoYXIgKnNlcmlhbF9wb3J0ID0gIi9kZXYvdHR5VVNCMCI7CitzdGF0aWMgY2hhciAqZm5hbWVfc2FmZXR5ID0gIkJUU0JNQzc2LlNXSSI7CitzdGF0aWMgY2hhciAqZm5hbWVfc29mdHdhcmUgPSAiSFMwMTExMDYuU1dMIjsKK3N0YXRpYyBpbnQgZGVsYXlfbXMgPSAwOworc3RhdGljIGludCB3aW5fc2l6ZSA9IDg7CitzdGF0aWMgaW50IHBhcmFtX2Rpc2Nvbm5lY3QgPSAwOworc3RhdGljIGludCBwYXJhbV9yZXN0YXJ0ID0gMDsKK3N0YXRpYyBpbnQgcGFyYW1fZm9yY2VkID0gMDsKK3N0YXRpYyBzdHJ1Y3QgZ3NtX2J0cyAqZ19idHM7CisKK3N0YXRpYyBpbnQgZmlsZV9pc19yZWFkYWJsZShjb25zdCBjaGFyICpmbmFtZSkKK3sKKwlpbnQgcmM7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlyYyA9IHN0YXQoZm5hbWUsICZzdCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoU19JU1JFRyhzdC5zdF9tb2RlKSAmJiAoc3Quc3RfbW9kZSAmIFNfSVJVU1IpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBlcmNlbnQ7CitzdGF0aWMgaW50IHBlcmNlbnRfb2xkOworCisvKiBjYWxsYmFjayBmdW5jdGlvbiBwYXNzZWQgdG8gdGhlIEFCSVMgT01MIGNvZGUgKi8KK3N0YXRpYyBpbnQgc3dsb2FkX2NiZm4odW5zaWduZWQgaW50IGhvb2ssIHVuc2lnbmVkIGludCBldmVudCwgc3RydWN0IG1zZ2IgKm1zZywKKwkJICAgICAgIHZvaWQgKmRhdGEsIHZvaWQgKnBhcmFtKQoreworCWlmIChob29rICE9IEdTTV9IT09LX05NX1NXTE9BRCkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBOTV9NVF9MT0FEX0lOSVRfQUNLOgorCQlmcHJpbnRmKHN0ZG91dCwgIlNvZnR3YXJlIExvYWQgSW5pdGlhdGUgQUNLXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9MT0FEX0lOSVRfTkFDSzoKKwkJZnByaW50ZihzdGRlcnIsICJFUlJPUjogU29mdHdhcmUgTG9hZCBJbml0aWF0ZSBOQUNLXG4iKTsKKwkJZXhpdCg1KTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9MT0FEX0VORF9BQ0s6CisJCWlmIChkYXRhKSB7CisJCQkvKiB3ZSBkaWQgYSBzYWZldHkgbG9hZCBhbmQgbXVzdCBhY3RpdmF0ZSBpdCAqLworCQkJYWJpc19ubV9zb2Z0d2FyZV9hY3RpdmF0ZShnX2J0cywgZm5hbWVfc2FmZXR5LAorCQkJCQkJICBzd2xvYWRfY2JmbiwgZ19idHMpOworCQkJc2xlZXAoNSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9MT0FEX0VORF9OQUNLOgorCQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBTb2Z0d2FyZSBMb2FkIEVuZCBOQUNLXG4iKTsKKwkJZXhpdCgzKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9BQ1RJVkFURV9TV19OQUNLOgorCQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBBY3RpdmF0ZSBTb2Z0d2FyZSBOQUNLXG4iKTsKKwkJZXhpdCg0KTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9BQ1RJVkFURV9TV19BQ0s6CisJCWJzMTFjZmdfc3RhdGUgPSBTVEFURV9OT05FOworCQkKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9MT0FEX1NFR19BQ0s6CisJCXBlcmNlbnQgPSBhYmlzX25tX3NvZnR3YXJlX2xvYWRfc3RhdHVzKGdfYnRzKTsKKwkJaWYgKHBlcmNlbnQgPiBwZXJjZW50X29sZCkKKwkJCXByaW50ZigiU29mdHdhcmUgRG93bmxvYWQgUHJvZ3Jlc3M6ICVkJSVcbiIsIHBlcmNlbnQpOworCQlwZXJjZW50X29sZCA9IHBlcmNlbnQ7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmJzMTFfbGlua19zdGF0ZVtdID0geworCVsweDAwXQk9ICJEb3duIiwKKwlbMHgwMV0JPSAiVXAiLAorCVsweDAyXQk9ICJSZXN0b3JpbmciLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmxpbmtzdGF0ZV9uYW1lKHVfaW50OF90IGxpbmtzdGF0ZSkKK3sKKwlpZiAobGlua3N0YXRlID4gQVJSQVlfU0laRShiczExX2xpbmtfc3RhdGUpKQorCQlyZXR1cm4gIlVua25vd24iOworCisJcmV0dXJuIGJzMTFfbGlua19zdGF0ZVtsaW5rc3RhdGVdOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqbWJjY3VfbG9hZFtdID0geworCVswXQk9ICJObyBMb2FkIiwKKwlbMV0JPSAiTG9hZCBCVFNDQUMiLAorCVsyXQk9ICJMb2FkIEJUU0RSWCIsCisJWzNdCT0gIkxvYWQgQlRTQkJYIiwKKwlbNF0JPSAiTG9hZCBCVFNBUkMiLAorCVs1XQk9ICJMb2FkIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICptYmNjdV9sb2FkX25hbWUodV9pbnQ4X3QgbGlua3N0YXRlKQoreworCWlmIChsaW5rc3RhdGUgPiBBUlJBWV9TSVpFKG1iY2N1X2xvYWQpKQorCQlyZXR1cm4gIlVua25vd24iOworCisJcmV0dXJuIG1iY2N1X2xvYWRbbGlua3N0YXRlXTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmJ0c19waGFzZV9uYW1lKHVfaW50OF90IHBoYXNlKQoreworCXN3aXRjaCAocGhhc2UpIHsKKwljYXNlIEJTMTFfU1RBVEVfV0FSTV9VUDoKKwljYXNlIEJTMTFfU1RBVEVfV0FSTV9VUF8yOgorCQlyZXR1cm4gIldhcm0gVXAiOworCQlicmVhazsKKwljYXNlIEJTMTFfU1RBVEVfTE9BRF9TTVVfU0FGRVRZOgorCQlyZXR1cm4gIkxvYWQgU01VIFNhZmV0eSI7CisJCWJyZWFrOworCWNhc2UgQlMxMV9TVEFURV9MT0FEX1NNVV9JTlRFTkRFRDoKKwkJcmV0dXJuICJMb2FkIFNNVSBJbnRlbmRlZCI7CisJCWJyZWFrOworCWNhc2UgQlMxMV9TVEFURV9MT0FEX01CQ0NVOgorCQlyZXR1cm4gIkxvYWQgTUJDQ1UiOworCQlicmVhazsKKwljYXNlIEJTMTFfU1RBVEVfU09GVFdBUkVfUlFEOgorCQlyZXR1cm4gIlNvZnR3YXJlIHJlcXVpcmVkIjsKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX1dBSVRfTUlOX0NGRzoKKwljYXNlIEJTMTFfU1RBVEVfV0FJVF9NSU5fQ0ZHXzI6CisJCXJldHVybiAiV2FpdCBtaW5pbWFsIGNvbmZpZyI7CisJCWJyZWFrOworCWNhc2UgQlMxMV9TVEFURV9NQUlOVEVOQU5DRToKKwkJcmV0dXJuICJNYWludGVuYW5jZSI7CisJCWJyZWFrOworCWNhc2UgQlMxMV9TVEFURV9OT1JNQUw6CisJCXJldHVybiAiTm9ybWFsIjsKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX0FCSVNfTE9BRDoKKwkJcmV0dXJuICJBYmlzIGxvYWQiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gIlVua25vd24iOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICp0cnhfcG93ZXJfbmFtZSh1X2ludDhfdCBwd3IpCit7CisJc3dpdGNoIChwd3IpIHsKKwljYXNlIEJTMTFfVFJYX1BPV0VSX0dTTV8yVzoJCisJCXJldHVybiAiMlcgKEdTTSkiOworCWNhc2UgQlMxMV9UUlhfUE9XRVJfR1NNXzI1MG1XOgorCQlyZXR1cm4gIjI1MG1XIChHU00pIjsKKwljYXNlIEJTMTFfVFJYX1BPV0VSX0dTTV84MG1XOgorCQlyZXR1cm4gIjgwbVcgKEdTTSkiOworCWNhc2UgQlMxMV9UUlhfUE9XRVJfR1NNXzMwbVc6CisJCXJldHVybiAiMzBtVyAoR1NNKSI7CisJY2FzZSBCUzExX1RSWF9QT1dFUl9EQ1NfM1c6CisJCXJldHVybiAiM1cgKERDUykiOworCWNhc2UgQlMxMV9UUlhfUE9XRVJfRENTXzFXNjoKKwkJcmV0dXJuICIxLjZXIChEQ1MpIjsKKwljYXNlIEJTMTFfVFJYX1BPV0VSX0RDU181MDBtVzoKKwkJcmV0dXJuICI1MDBtVyAoRENTKSI7CisJY2FzZSBCUzExX1RSWF9QT1dFUl9EQ1NfMTYwbVc6CisJCXJldHVybiAiMTYwbVcgKERDUykiOworCWRlZmF1bHQ6CisJCXJldHVybiAidW5rbm93biB2YWx1ZSI7CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqcGxsX21vZGVfbmFtZSh1X2ludDhfdCBtb2RlKQoreworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgQlMxMV9MSV9QTExfTE9DS0VEOgorCQlyZXR1cm4gIkUxIExvY2tlZCI7CisJY2FzZSBCUzExX0xJX1BMTF9TVEFOREFMT05FOgorCQlyZXR1cm4gIlN0YW5kYWxvbmUiOworCWRlZmF1bHQ6CisJCXJldHVybiAidW5rbm93biI7CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqY2Nsa19hY2NfbmFtZSh1X2ludDhfdCBhY2MpCit7CisJc3dpdGNoIChhY2MpIHsKKwljYXNlIDA6CisJCS8qIE91dCBvZiB0aGUgZGVtYW5kZWQgKy8tIDAuMDVwcG0gKi8KKwkJcmV0dXJuICJNZWRpdW0iOworCWNhc2UgMToKKwkJLyogU3luY2hyb25pemVkIHdpdGggQWJpcywgd2l0aGluIGRlbWFuZGVkIHRvbGVyYW5jZSArLy0gMC4wNXBwbSAqLworCQlyZXR1cm4gIkhpZ2giOworCWRlZmF1bHQ6CisJCXJldHVybiAidW5rbm93biI7CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqb2JqX25hbWUoc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oKQoreworCXN0YXRpYyBjaGFyIHJldGJ1ZlsyNTZdOworCisJcmV0YnVmWzBdID0gMDsKKworCXN3aXRjaCAoZm9oLT5vYmpfY2xhc3MpIHsKKwljYXNlIE5NX09DX0JTMTE6CisJCXN0cmNhdChyZXRidWYsICJCUzExICIpOworCQlzd2l0Y2ggKGZvaC0+b2JqX2luc3QuYnRzX25yKSB7CisJCWNhc2UgQlMxMV9PQkpfUEE6CisJCQlzcHJpbnRmKHJldGJ1ZitzdHJsZW4ocmV0YnVmKSwgIlBvd2VyIEFtcGxpZmllciAlZCAiLAorCQkJCWZvaC0+b2JqX2luc3QudHNfbnIpOworCQkJYnJlYWs7CisJCWNhc2UgQlMxMV9PQkpfTEk6CisJCQlzcHJpbnRmKHJldGJ1ZitzdHJsZW4ocmV0YnVmKSwgIkxpbmUgSW50ZXJmYWNlICIpOworCQkJYnJlYWs7CisJCWNhc2UgQlMxMV9PQkpfQ0NMSzoKKwkJCXNwcmludGYocmV0YnVmK3N0cmxlbihyZXRidWYpLCAiQ0NMSyAiKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgTk1fT0NfU0lURV9NQU5BR0VSOgorCQlzdHJjYXQocmV0YnVmLCAiU0lURSBNQU5BR0VSICIpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldGJ1ZjsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfc3RhdGUoc3RydWN0IHRsdl9wYXJzZWQgKnRwKQoreworCWlmIChUTFZQX1BSRVNFTlQodHAsIE5NX0FUVF9CUzExX0JUU19TVEFURSkpIHsKKwkJdV9pbnQ4X3QgcGhhc2UsIG1iY2N1OworCQlpZiAoVExWUF9MRU4odHAsIE5NX0FUVF9CUzExX0JUU19TVEFURSkgPj0gMSkgeworCQkJcGhhc2UgPSAqVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX0JUU19TVEFURSk7CisJCQlwcmludGYoIlBIQVNFOiAldSAlLTIwcyAiLCBwaGFzZSAmIDB4ZiwKKwkJCQlidHNfcGhhc2VfbmFtZShwaGFzZSkpOworCQl9CisJCWlmIChUTFZQX0xFTih0cCwgTk1fQVRUX0JTMTFfQlRTX1NUQVRFKSA+PSAyKSB7CisJCQltYmNjdSA9ICooVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX0JUU19TVEFURSkrMSk7CisJCQlwcmludGYoIk1CQ0NVMDogJS0xMXMgTUJDQ1UxOiAlLTExcyAiLAorCQkJCW1iY2N1X2xvYWRfbmFtZShtYmNjdSAmIDB4ZiksIG1iY2N1X2xvYWRfbmFtZShtYmNjdSA+PiA0KSk7CisJCX0KKwl9CisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0JTMTFfRTFfU1RBVEUpICYmCisJICAgIFRMVlBfTEVOKHRwLCBOTV9BVFRfQlMxMV9FMV9TVEFURSkgPj0gMSkgeworCQl1X2ludDhfdCBlMV9zdGF0ZSA9ICpUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfRTFfU1RBVEUpOworCQlwcmludGYoIkFiaXMtbGluazogJS05cyAiLCBsaW5rc3RhdGVfbmFtZShlMV9zdGF0ZSAmIDB4ZikpOworCX0KKwlwcmludGYoIlxuIik7Cit9CisKK3N0YXRpYyBpbnQgcHJpbnRfYXR0cihzdHJ1Y3QgdGx2X3BhcnNlZCAqdHApCit7CisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0JTMTFfRVNOX1BDQl9TRVJJQUwpKSB7CisJCXByaW50ZigiXHRCUy0xMSBFU04gUENCIFNlcmlhbCBOdW1iZXI6ICVzXG4iLAorCQkJVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX0VTTl9QQ0JfU0VSSUFMKSk7CisJfQorCWlmIChUTFZQX1BSRVNFTlQodHAsIE5NX0FUVF9CUzExX0VTTl9IV19DT0RFX05PKSkgeworCQlwcmludGYoIlx0QlMtMTEgRVNOIEhhcmR3YXJlIENvZGUgTnVtYmVyOiAlc1xuIiwKKwkJCVRMVlBfVkFMKHRwLCBOTV9BVFRfQlMxMV9FU05fSFdfQ09ERV9OTykrNik7CisJfQorCWlmIChUTFZQX1BSRVNFTlQodHAsIE5NX0FUVF9CUzExX0VTTl9GV19DT0RFX05PKSkgeworCQlwcmludGYoIlx0QlMtMTEgRVNOIEZpcm13YXJlIENvZGUgTnVtYmVyOiAlc1xuIiwKKwkJCVRMVlBfVkFMKHRwLCBOTV9BVFRfQlMxMV9FU05fRldfQ09ERV9OTykrNik7CisJfQorI2lmIDAKKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBOTV9BVFRfQlMxMV9CT09UX1NXX1ZFUlMpKSB7CisJCXByaW50ZigiQlMtMTEgQm9vdCBTb2Z0d2FyZSBWZXJzaW9uOiAlc1xuIiwKKwkJCVRMVlBfVkFMKHRwLCBOTV9BVFRfQlMxMV9CT09UX1NXX1ZFUlMpKzYpOworCX0KKyNlbmRpZgorCWlmIChUTFZQX1BSRVNFTlQodHAsIE5NX0FUVF9BQklTX0NIQU5ORUwpICYmCisJICAgIFRMVlBfTEVOKHRwLCBOTV9BVFRfQUJJU19DSEFOTkVMKSA+PSAzKSB7CisJCWNvbnN0IHVfaW50OF90ICpjaGFuID0gVExWUF9WQUwodHAsIE5NX0FUVF9BQklTX0NIQU5ORUwpOworCQlwcmludGYoIlx0RTEgQ2hhbm5lbDogUG9ydD0ldSBUaW1lc2xvdD0ldSAiLAorCQkJY2hhblswXSwgY2hhblsxXSk7CisJCWlmIChjaGFuWzJdID09IDB4ZmYpCisJCQlwcmludGYoIihGdWxsIFNsb3QpXG4iKTsKKwkJZWxzZQorCQkJcHJpbnRmKCJTdWJzbG90PSV1XG4iLCBjaGFuWzJdKTsKKwl9CisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX1RFSSkpCisJCXByaW50ZigiXHRURUk6ICVkXG4iLCAqVExWUF9WQUwodHAsIE5NX0FUVF9URUkpKTsKKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBOTV9BVFRfQlMxMV9UWFBXUikgJiYKKwkgICAgVExWUF9MRU4odHAsIE5NX0FUVF9CUzExX1RYUFdSKSA+PSAxKSB7CisJCXByaW50ZigiXHRUUlggUG93ZXI6ICVzXG4iLAorCQkJdHJ4X3Bvd2VyX25hbWUoKlRMVlBfVkFMKHRwLCBOTV9BVFRfQlMxMV9UWFBXUikpKTsKKwl9CisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0JTMTFfUExMX01PREUpICYmCisJICAgIFRMVlBfTEVOKHRwLCBOTV9BVFRfQlMxMV9QTExfTU9ERSkgPj0gMSkgeworCQlwcmludGYoIlx0UExMIE1vZGU6ICVzXG4iLAorCQkJcGxsX21vZGVfbmFtZSgqVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX1BMTF9NT0RFKSkpOworCX0KKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBOTV9BVFRfQlMxMV9QTEwpICYmCisJICAgIFRMVlBfTEVOKHRwLCBOTV9BVFRfQlMxMV9QTEwpID49IDQpIHsKKwkJY29uc3QgdV9pbnQ4X3QgKnZwID0gVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX1BMTCk7CisJCXByaW50ZigiXHRQTEwgU2V0IFZhbHVlPSVkLCBXb3JrIFZhbHVlPSVkXG4iLAorCQkJdnBbMF0gPDwgOCB8IHZwWzFdLCB2cFsyXSA8PCA4IHwgdnBbM10pOworCX0KKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBOTV9BVFRfQlMxMV9DQ0xLX0FDQ1VSQUNZKSAmJgorCSAgICBUTFZQX0xFTih0cCwgTk1fQVRUX0JTMTFfQ0NMS19BQ0NVUkFDWSkgPj0gMSkgeworCQljb25zdCB1X2ludDhfdCAqYWNjID0gVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX0NDTEtfQUNDVVJBQ1kpOworCQlwcmludGYoIlx0Q0NMSyBBY2N1cmFjeTogJXMgKCVkKVxuIiwgY2Nsa19hY2NfbmFtZSgqYWNjKSwgKmFjYyk7CisJfQorCWlmIChUTFZQX1BSRVNFTlQodHAsIE5NX0FUVF9CUzExX0NDTEtfVFlQRSkgJiYKKwkgICAgVExWUF9MRU4odHAsIE5NX0FUVF9CUzExX0NDTEtfVFlQRSkgPj0gMSkgeworCQljb25zdCB1X2ludDhfdCAqYWNjID0gVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX0NDTEtfVFlQRSk7CisJCXByaW50ZigiXHRDQ0xLIFR5cGU9JWRcbiIsICphY2MpOworCX0KKworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNtZF9xdWVyeSh2b2lkKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gZ19idHMtPmMwOworCisJYnMxMWNmZ19zdGF0ZSA9IFNUQVRFX1FVRVJZOworCWFiaXNfbm1fYnMxMV9nZXRfc2Vybm8oZ19idHMpOworCWFiaXNfbm1fYnMxMV9nZXRfb21sX3RlaV90cyhnX2J0cyk7CisJYWJpc19ubV9iczExX2dldF9wbGxfbW9kZShnX2J0cyk7CisJYWJpc19ubV9iczExX2dldF9jY2xrKGdfYnRzKTsKKwlhYmlzX25tX2JzMTFfZ2V0X3RyeF9wb3dlcih0cngpOworCXRyeCA9IGdzbV9idHNfdHJ4X251bShnX2J0cywgMSk7CisJaWYgKHRyeCkKKwkJYWJpc19ubV9iczExX2dldF90cnhfcG93ZXIodHJ4KTsKKwlzbGVlcCgxKTsKKwlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJY29tbWFuZCA9IE5VTEw7Cit9CisKKy8qIGhhbmRsZSBhIHJlc3BvbnNlIGZyb20gdGhlIEJUUyB0byBhIEdFVCBTVEFURSBjb21tYW5kICovCitzdGF0aWMgaW50IGhhbmRsZV9zdGF0ZV9yZXNwKGVudW0gYWJpc19iczExX3BoYXNlIHN0YXRlKQoreworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBCUzExX1NUQVRFX1dBUk1fVVA6CisJY2FzZSBCUzExX1NUQVRFX0xPQURfU01VX1NBRkVUWToKKwljYXNlIEJTMTFfU1RBVEVfTE9BRF9TTVVfSU5URU5ERUQ6CisJY2FzZSBCUzExX1NUQVRFX0xPQURfTUJDQ1U6CisJCWJyZWFrOworCWNhc2UgQlMxMV9TVEFURV9TT0ZUV0FSRV9SUUQ6CisJCWJzMTFjZmdfc3RhdGUgPSBTVEFURV9TV0xPQUQ7CisJCS8qIHNlbmQgc2FmZXR5IGxvYWQuIFVzZSBnX2J0cyBhcyBwcml2YXRlICdwYXJhbScKKwkJICogYXJndW1lbnQsIHNvIG91ciBzd2xvYWRfY2JmbiBjYW4gZGlzdGluZ3Vpc2gKKwkJICogYSBzYWZldHkgbG9hZCBmcm9tIGEgcmVndWxhciBzb2Z0d2FyZSAqLworCQlpZiAoZmlsZV9pc19yZWFkYWJsZShmbmFtZV9zYWZldHkpKQorCQkJcmMgPSBhYmlzX25tX3NvZnR3YXJlX2xvYWQoZ19idHMsIGZuYW1lX3NhZmV0eSwKKwkJCQkJCSAgIHdpbl9zaXplLCBwYXJhbV9mb3JjZWQsCisJCQkJCQkgICBzd2xvYWRfY2JmbiwgZ19idHMpOworCQllbHNlCisJCQlmcHJpbnRmKHN0ZGVyciwgIk5vIHZhbGlkIFNhZmV0eSBMb2FkIGZpbGUgXCIlc1wiXG4iLAorCQkJCWZuYW1lX3NhZmV0eSk7CisJCWJyZWFrOworCWNhc2UgQlMxMV9TVEFURV9XQUlUX01JTl9DRkc6CisJY2FzZSBCUzExX1NUQVRFX1dBSVRfTUlOX0NGR18yOgorCQliczExY2ZnX3N0YXRlID0gU1RBVEVfU1dMT0FEOworCQlyYyA9IGNyZWF0ZV9vYmplY3RzKGdfYnRzKTsKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX01BSU5URU5BTkNFOgorCQlpZiAoY29tbWFuZCkgeworCQkJaWYgKCFzdHJjbXAoY29tbWFuZCwgImRpc2Nvbm5lY3QiKSkKKwkJCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJCQllbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJyZWNvbm5lY3QiKSkKKwkJCQlyYyA9IGFiaXNfbm1fYnMxMV9ic2NfZGlzY29ubmVjdChnX2J0cywgMSk7CisJCQllbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJzb2Z0d2FyZSIpCisJCQkgICAgJiYgYnMxMWNmZ19zdGF0ZSAhPSBTVEFURV9TV0xPQUQpIHsKKwkJCQliczExY2ZnX3N0YXRlID0gU1RBVEVfU1dMT0FEOworCQkJCS8qIHNlbmQgc29mdHdhcmUgKEZJWE1FOiBvdmVyIEEtYmlzPykgKi8KKwkJCQlpZiAoZmlsZV9pc19yZWFkYWJsZShmbmFtZV9zb2Z0d2FyZSkpCisJCQkJCXJjID0gYWJpc19ubV9iczExX2xvYWRfc3dsKGdfYnRzLCBmbmFtZV9zb2Z0d2FyZSwKKwkJCQkJCQkJICAgd2luX3NpemUsIHBhcmFtX2ZvcmNlZCwKKwkJCQkJCQkJICAgc3dsb2FkX2NiZm4pOworCQkJCWVsc2UKKwkJCQkJZnByaW50ZihzdGRlcnIsICJObyB2YWxpZCBTb2Z0d2FyZSBmaWxlIFwiJXNcIlxuIiwKKwkJCQkJCWZuYW1lX3NvZnR3YXJlKTsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAiZGVsZXRlLXRyeDEiKSkgeworCQkJCXByaW50ZigiTG9jaW5nIEJCU0lHIGFuZCBQQSBvYmplY3RzIG9mIFRSWDFcbiIpOworCQkJCWFiaXNfbm1fY2hnX2FkbV9zdGF0ZShnX2J0cywgTk1fT0NfQlMxMSwKKwkJCQkJCSAgICAgIEJTMTFfT0JKX0JCU0lHLCAwLCAxLAorCQkJCQkJICAgICAgTk1fU1RBVEVfTE9DS0VEKTsKKwkJCQlhYmlzX25tX2NoZ19hZG1fc3RhdGUoZ19idHMsIE5NX09DX0JTMTEsCisJCQkJCQkgICAgICBCUzExX09CSl9QQSwgMCwgMSwKKwkJCQkJCSAgICAgIE5NX1NUQVRFX0xPQ0tFRCk7CisJCQkJc2xlZXAoMSk7CisJCQkJcHJpbnRmKCJEZWxldGluZyBCQlNJRyBhbmQgUEEgb2JqZWN0cyBvZiBUUlgxXG4iKTsKKwkJCQlhYmlzX25tX2JzMTFfZGVsZXRlX29iamVjdChnX2J0cywgQlMxMV9PQkpfQkJTSUcsIDEpOworCQkJCWFiaXNfbm1fYnMxMV9kZWxldGVfb2JqZWN0KGdfYnRzLCBCUzExX09CSl9QQSwgMSk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJjcmVhdGUtdHJ4MSIpKSB7CisJCQkJY3JlYXRlX3RyeDEoZ19idHMpOworCQkJCXNsZWVwKDEpOworCQkJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwkJCQljb21tYW5kID0gTlVMTDsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAicGxsLWUxLWxvY2tlZCIpKSB7CisJCQkJYWJpc19ubV9iczExX3NldF9wbGxfbG9ja2VkKGdfYnRzLCAxKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJCQkJY29tbWFuZCA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgInBsbC1zdGFuZGFsb25lIikpIHsKKwkJCQlhYmlzX25tX2JzMTFfc2V0X3BsbF9sb2NrZWQoZ19idHMsIDApOworCQkJCXNsZWVwKDEpOworCQkJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwkJCQljb21tYW5kID0gTlVMTDsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAicGxsLXNldHZhbHVlIikpIHsKKwkJCQlhYmlzX25tX2JzMTFfc2V0X3BsbChnX2J0cywgYXRvaSh2YWx1ZSkpOworCQkJCXNsZWVwKDEpOworCQkJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwkJCQljb21tYW5kID0gTlVMTDsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAicGxsLXdvcmt2YWx1ZSIpKSB7CisJCQkJLyogVG8gc2V0IHRoZSB3b3JrIHZhbHVlIHdlIG5lZWQgdG8gbG9naW4gYXMgRklFTEQgKi8KKwkJCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2luZmllbGRfbG9nb24oZ19idHMsIDEpOworCQkJCXNsZWVwKDEpOworCQkJCWFiaXNfbm1fYnMxMV9zZXRfcGxsKGdfYnRzLCBhdG9pKHZhbHVlKSk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2luZmllbGRfbG9nb24oZ19idHMsIDApOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJvbWwtdGVpIikpIHsKKwkJCQlhYmlzX25tX2JzMTFfY29ubl9vbWxfdGVpKGdfYnRzLCAwLCAxLCAweGZmLCBURUlfT01MKTsKKwkJCQljb21tYW5kID0gTlVMTDsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAicmVzdGFydCIpKSB7CisJCQkJYWJpc19ubV9iczExX3Jlc3RhcnQoZ19idHMpOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJxdWVyeSIpKSB7CisJCQkJY21kX3F1ZXJ5KCk7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgImNyZWF0ZS1icG9ydDEiKSkgeworCQkJCWFiaXNfbm1fYnMxMV9jcmVhdGVfYnBvcnQoZ19idHMsIDEpOworCQkJCXNsZWVwKDEpOworCQkJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwkJCQljb21tYW5kID0gTlVMTDsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAiZGVsZXRlLWJwb3J0MSIpKSB7CisJCQkJYWJpc19ubV9jaGdfYWRtX3N0YXRlKGdfYnRzLCBOTV9PQ19CUzExX0JQT1JULCAxLCAweGZmLCAweGZmLCBOTV9TVEFURV9MT0NLRUQpOworCQkJCXNsZWVwKDEpOworCQkJCWFiaXNfbm1fYnMxMV9kZWxldGVfYnBvcnQoZ19idHMsIDEpOworCQkJCXNsZWVwKDEpOworCQkJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwkJCQljb21tYW5kID0gTlVMTDsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAiYnBvcnQwLXN0YXIiKSkgeworCQkJCWFiaXNfbm1fYnMxMV9zZXRfYnBvcnRfbGluZV9jZmcoZ19idHMsIDAsIEJTMTFfTElORV9DRkdfU1RBUik7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJicG9ydDAtbXVsdGlkcm9wIikpIHsKKwkJCQlhYmlzX25tX2JzMTFfc2V0X2Jwb3J0X2xpbmVfY2ZnKGdfYnRzLCAwLCBCUzExX0xJTkVfQ0ZHX01VTFRJRFJPUCk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgQlMxMV9TVEFURV9OT1JNQUw6CisJCWlmIChjb21tYW5kKSB7CisJCQlpZiAoIXN0cmNtcChjb21tYW5kLCAicmVjb25uZWN0IikpCisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAiZGlzY29ubmVjdCIpKQorCQkJCWFiaXNfbm1fYnMxMV9ic2NfZGlzY29ubmVjdChnX2J0cywgMCk7CisJCQllbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJxdWVyeSIpKSB7CisJCQkJY21kX3F1ZXJ5KCk7CisJCQl9CisJCX0gZWxzZSBpZiAocGFyYW1fZGlzY29ubmVjdCkgeworCQkJcGFyYW1fZGlzY29ubmVjdCA9IDA7CisJCQlhYmlzX25tX2JzMTFfYnNjX2Rpc2Nvbm5lY3QoZ19idHMsIDApOworCQkJaWYgKHBhcmFtX3Jlc3RhcnQpIHsKKwkJCQlwYXJhbV9yZXN0YXJ0ID0gMDsKKwkJCQlhYmlzX25tX2JzMTFfcmVzdGFydChnX2J0cyk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiByYzsKK30KKworLyogaGFuZGxlIGEgZnVsbHktcmVjZWl2ZWQgbWVzc2FnZS9wYWNrZXQgZnJvbSB0aGUgUlMyMzIgcG9ydCAqLworaW50IGhhbmRsZV9zZXJpYWxfbXNnKHN0cnVjdCBtc2diICpyeF9tc2cpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2g7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJaW50IHJjID0gLTE7CisKKyNpZiAwCisJaWYgKHJ4X21zZy0+bGVuIDwgTEFQRF9IRFJfTEVOCisJCQkgICsgc2l6ZW9mKHN0cnVjdCBhYmlzX29tX2ZvbV9oZHIpCisJCQkgICsgc2l6ZW9mKHN0cnVjdCBhYmlzX29tX2hkcikpIHsKKwkJaWYgKCFtZW1jbXAocnhfbXNnLT5kYXRhICsgMiwgdG9vX2Zhc3QsCisJCQkgICAgc2l6ZW9mKHRvb19mYXN0KSkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQlMxMSB0ZWxscyB1cyB3ZSdyZSB0b28gIgorCQkJCSJmYXN0LCB0cnkgLS1kZWxheSBiaWdnZXIgdGhhbiAldVxuIiwKKwkJCQlkZWxheV9tcyk7CisJCQlyZXR1cm4gLUUyQklHOworCQl9IGVsc2UKKwkJCWZwcmludGYoc3RkZXJyLCAidW5rbm93biBCUzExIG1lc3NhZ2VcbiIpOworCX0KKyNlbmRpZgorCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfbDIocnhfbXNnKTsKKwlmb2ggPSAoc3RydWN0IGFiaXNfb21fZm9tX2hkciAqKSBvaC0+ZGF0YTsKKwlzd2l0Y2ggKGZvaC0+bXNnX3R5cGUpIHsKKwljYXNlIE5NX01UX0JTMTFfTE1UX0xPR09OX0FDSzoKKwkJcHJpbnRmKCJMTVQgTE9HT046IEFDS1xuXG4iKTsKKwkJaWYgKGJzMTFjZmdfc3RhdGUgPT0gU1RBVEVfTk9ORSkKKwkJCWJzMTFjZmdfc3RhdGUgPSBTVEFURV9MT0dPTl9BQ0s7CisJCXJjID0gYWJpc19ubV9iczExX2dldF9zdGF0ZShnX2J0cyk7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfQlMxMV9MTVRfTE9HT0ZGX0FDSzoKKwkJcHJpbnRmKCJMTVQgTE9HT0ZGOiBBQ0tcbiIpOworCQlleGl0KDApOworCQlicmVhazsKKwljYXNlIE5NX01UX0JTMTFfR0VUX1NUQVRFX0FDSzoKKwkJcmMgPSBhYmlzX25tX3Rsdl9wYXJzZSgmdHAsIGdfYnRzLCBmb2gtPmRhdGEsIG9oLT5sZW5ndGgtc2l6ZW9mKCpmb2gpKTsKKwkJcHJpbnRfc3RhdGUoJnRwKTsKKwkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9CUzExX0JUU19TVEFURSkgJiYKKwkJICAgIFRMVlBfTEVOKCZ0cCwgTk1fQVRUX0JTMTFfQlRTX1NUQVRFKSA+PSAxKQorCQkJcmMgPSBoYW5kbGVfc3RhdGVfcmVzcCgqVExWUF9WQUwoJnRwLCBOTV9BVFRfQlMxMV9CVFNfU1RBVEUpKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9HRVRfQVRUUl9SRVNQOgorCQlwcmludGYoIlxuJXNBVFRSSUJVVEVTOlxuIiwgb2JqX25hbWUoZm9oKSk7CisJCWFiaXNfbm1fdGx2X3BhcnNlKCZ0cCwgZ19idHMsIGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCQlyYyA9IHByaW50X2F0dHIoJnRwKTsKKwkJLy9oZXhkdW1wKGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCQlicmVhazsKKwljYXNlIE5NX01UX0JTMTFfU0VUX0FUVFJfQUNLOgorCQlwcmludGYoIlNFVCBBVFRSSUJVVEUgT2JqQ2xhc3M9MHglMDJ4IE9iakluc3Q9KCVkLCVkLCVkKSBBQ0tcbiIsCisJCQlmb2gtPm9ial9jbGFzcywgZm9oLT5vYmpfaW5zdC5idHNfbnIsCisJCQlmb2gtPm9ial9pbnN0LnRyeF9uciwgZm9oLT5vYmpfaW5zdC50c19ucik7CisJCXJjID0gMDsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9CUzExX1NFVF9BVFRSX05BQ0s6CisJCXByaW50ZigiU0VUIEFUVFJJQlVURSBPYmpDbGFzcz0weCUwMnggT2JqSW5zdD0oJWQsJWQsJWQpIE5BQ0tcbiIsCisJCQlmb2gtPm9ial9jbGFzcywgZm9oLT5vYmpfaW5zdC5idHNfbnIsCisJCQlmb2gtPm9ial9pbnN0LnRyeF9uciwgZm9oLT5vYmpfaW5zdC50c19ucik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJjID0gYWJpc19ubV9yY3Ztc2cocnhfbXNnKTsKKwl9CisJaWYgKHJjIDwgMCkgeworCQlwZXJyb3IoIkVSUk9SIGluIG1haW4gbG9vcCIpOworCQkvL2JyZWFrOworCX0KKwlpZiAocmMgPT0gMSkKKwkJcmV0dXJuIHJjOworCisJc3dpdGNoIChiczExY2ZnX3N0YXRlKSB7CisJY2FzZSBTVEFURV9OT05FOgorCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMSk7CisJCWJyZWFrOworCWNhc2UgU1RBVEVfTE9HT05fQUNLOgorCQlic2Nfc2NoZWR1bGVfdGltZXIoJnN0YXR1c190aW1lciwgNSwgMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworaW50IG5tX3N0YXRlX2V2ZW50KGVudW0gbm1fZXZ0IGV2dCwgdV9pbnQ4X3Qgb2JqX2NsYXNzLCB2b2lkICpvYmosCisJCSAgIHN0cnVjdCBnc21fbm1fc3RhdGUgKm9sZF9zdGF0ZSwgc3RydWN0IGdzbV9ubV9zdGF0ZSAqbmV3X3N0YXRlKQoreworCXJldHVybiAwOworfQorCit2b2lkIHN0YXR1c190aW1lcl9jYih2b2lkICpkYXRhKQoreworCWFiaXNfbm1fYnMxMV9nZXRfc3RhdGUoZ19idHMpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9iYW5uZXIodm9pZCkKK3sKKwlwcmludGYoImJzMTFfY29uZmlnIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSBhbmQgRGlldGVyIFNwYWFyXG4iKTsKKwlwcmludGYoIlRoaXMgaXMgRlJFRSBTT0ZUV0FSRSB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFlcblxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2hlbHAodm9pZCkKK3sKKwlwcmludGYoImJzMTFfY29uZmlnIFtvcHRpb25zXSBbY29tbWFuZF1cbiIpOworCXByaW50ZigiXG5TdXBwb3J0ZWQgb3B0aW9uczpcbiIpOworCXByaW50ZigiXHQtaCAtLWhlbHBcdFx0XHRQcmludCB0aGlzIGhlbHAgdGV4dFxuIik7CisJcHJpbnRmKCJcdC1wIC0tcG9ydCA8L2Rldi90dHlYWFg+XHRcdFNwZWNpZnkgc2VyaWFsIHBvcnRcbiIpOworCXByaW50ZigiXHQtcyAtLXNvZnR3YXJlIDxmaWxlPlx0XHRTcGVjaWZ5IFNvZnR3YXJlIGZpbGVcbiIpOworCXByaW50ZigiXHQtUyAtLXNhZmV0eSA8ZmlsZT5cdFx0U3BlY2lmeSBTYWZldHkgTG9hZCBmaWxlXG4iKTsKKwlwcmludGYoIlx0LWQgLS1kZWxheSA8bXM+XHRcdFx0U3BlY2lmeSBkZWxheSBpbiBtaWxsaXNlY29uZHNcbiIpOworCXByaW50ZigiXHQtRCAtLWRpc2Nvbm5lY3RcdFx0XHREaXNjb25uZWN0IEJUUyBmcm9tIEJTQ1xuIik7CisJcHJpbnRmKCJcdC13IC0td2luLXNpemUgPG51bT5cdFx0U3BlY2lmeSBXaW5kb3cgU2l6ZVxuIik7CisJcHJpbnRmKCJcdC1mIC0tZm9yY2VkXHRcdFx0Rm9yY2UgU29mdHdhcmUgTG9hZFxuIik7CisJcHJpbnRmKCJcblN1cHBvcnRlZCBjb21tYW5kczpcbiIpOworCXByaW50ZigiXHRxdWVyeVx0XHRcdFF1ZXJ5IHRoZSBCUy0xMSBhYm91dCBzZXJpYWwgbnVtYmVyIGFuZCBjb25maWd1cmF0aW9uXG4iKTsKKwlwcmludGYoIlx0ZGlzY29ubmVjdFx0XHREaXNjb25uZWN0IEEtYmlzIGxpbmsgKGdvIGludG8gYWRtaW5pc3RyYXRpdmUgc3RhdGUpXG4iKTsKKwlwcmludGYoIlx0cmVzY29ubmVjdFx0XHRSZWNvbm5lY3QgQS1iaXMgbGluayAoZ28gaW50byBub3JtYWwgc3RhdGUpXG4iKTsKKwlwcmludGYoIlx0cmVzdGFydFx0XHRcdFJlc3RhcnQgdGhlIEJUU1xuIik7CisJcHJpbnRmKCJcdHNvZnR3YXJlXHRcdERvd25sb2FkIFNvZnR3YXJlIChvbmx5IGluIGFkbWluaXN0cmF0aXZlIHN0YXRlKVxuIik7CisJcHJpbnRmKCJcdGNyZWF0ZS10cngxXHRcdENyZWF0ZSBvYmplY3RzIGZvciBUUlgxIChEYW5nZXI6IFlvdXIgQlMtMTEgbWlnaHQgb3ZlcmhlYXQpXG4iKTsKKwlwcmludGYoIlx0ZGVsZXRlLXRyeDFcdFx0RGVsZXRlIG9iamVjdHMgZm9yIFRSWDFcbiIpOworCXByaW50ZigiXHRwbGwtZTEtbG9ja2VkXHRcdFNldCB0aGUgUExMIHRvIGJlIGxvY2tlZCB0byBFMSBjbG9ja1xuIik7CisJcHJpbnRmKCJcdHBsbC1zdGFuZGFsb25lXHRcdFNldCB0aGUgUExMIHRvIGJlIGluIHN0YW5kYWxvbmUgbW9kZVxuIik7CisJcHJpbnRmKCJcdHBsbC1zZXR2YWx1ZSA8dmFsdWU+XHRTZXQgdGhlIFBMTCBzZXQgdmFsdWVcbiIpOworCXByaW50ZigiXHRwbGwtd29ya3ZhbHVlIDx2YWx1ZT5cdFNldCB0aGUgUExMIHdvcmsgdmFsdWVcbiIpOworCXByaW50ZigiXHRvbWwtdGVpXHRcdFx0U2V0IE9NTCBFMSBUUyBhbmQgVEVJXG4iKTsKKwlwcmludGYoIlx0YnBvcnQwLXN0YXJcdFx0U2V0IEJQT1JUMCBsaW5lIGNvbmZpZyB0byBzdGFyXG4iKTsKKwlwcmludGYoIlx0YnBvcnQwLW11bHRpcG9ydFx0U2V0IEJQT1JUMCBsaW5lIGNvbmZpZyB0byBtdWx0aXBvcnRcbiIpOworCXByaW50ZigiXHRjcmVhdGUtYnBvcnQxXHRcdENyZWF0ZSBCUE9SVDEgb2JqZWN0XG4iKTsKKwlwcmludGYoIlx0ZGVsZXRlLWJwb3J0MVx0XHREZWxldGUgQlBPUlQxIG9iamVjdFxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9vcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgb3B0aW9uX2luZGV4ID0gMDsKKwlwcmludF9iYW5uZXIoKTsKKworCXdoaWxlICgxKSB7CisJCWludCBjOworCQlzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsKKwkJCXsgImhlbHAiLCAwLCAwLCAnaCcgfSwKKwkJCXsgInBvcnQiLCAxLCAwLCAncCcgfSwKKwkJCXsgInNvZnR3YXJlIiwgMSwgMCwgJ3MnIH0sCisJCQl7ICJzYWZldHkiLCAxLCAwLCAnUycgfSwKKwkJCXsgImRlbGF5IiwgMSwgMCwgJ2QnIH0sCisJCQl7ICJkaXNjb25uZWN0IiwgMCwgMCwgJ0QnIH0sCisJCQl7ICJ3aW4tc2l6ZSIsIDEsIDAsICd3JyB9LAorCQkJeyAiZm9yY2VkIiwgMCwgMCwgJ2YnIH0sCisJCQl7ICJyZXN0YXJ0IiwgMCwgMCwgJ3InIH0sCisJCQl7ICJkZWJ1ZyIsIDEsIDAsICdiJ30sCisJCX07CisKKwkJYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJocDpzOlM6dGQ6RHc6ZnJhOiIsCisJCQkJbG9uZ19vcHRpb25zLCAmb3B0aW9uX2luZGV4KTsKKworCQlpZiAoYyA9PSAtMSkKKwkJCWJyZWFrOworCisJCXN3aXRjaCAoYykgeworCQljYXNlICdoJzoKKwkJCXByaW50X2hlbHAoKTsKKwkJCWV4aXQoMCk7CisJCWNhc2UgJ3AnOgorCQkJc2VyaWFsX3BvcnQgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAnYic6CisJCQlsb2dfcGFyc2VfY2F0ZWdvcnlfbWFzayhzdGRlcnJfdGFyZ2V0LCBvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ3MnOgorCQkJZm5hbWVfc29mdHdhcmUgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAnUyc6CisJCQlmbmFtZV9zYWZldHkgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAnZCc6CisJCQlkZWxheV9tcyA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICd3JzoKKwkJCXdpbl9zaXplID0gYXRvaShvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ0QnOgorCQkJcGFyYW1fZGlzY29ubmVjdCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnZic6CisJCQlwYXJhbV9mb3JjZWQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3InOgorCQkJcGFyYW1fZGlzY29ubmVjdCA9IDE7CisJCQlwYXJhbV9yZXN0YXJ0ID0gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKG9wdGluZCA8IGFyZ2MpCisJCWNvbW1hbmQgPSBhcmd2W29wdGluZF07CisJICAgICAgICBpZiAob3B0aW5kKzEgPCBhcmdjKQorCQkJdmFsdWUgPSBhcmd2W29wdGluZCsxXTsKKworfQorCitzdGF0aWMgaW50IG51bV9zaWdpbnQ7CisKK3N0YXRpYyB2b2lkIHNpZ25hbF9oYW5kbGVyKGludCBzaWduYWwpCit7CisJZnByaW50ZihzdGRvdXQsICJcbnNpZ25hbCAldSByZWNlaXZlZFxuIiwgc2lnbmFsKTsKKworCXN3aXRjaCAoc2lnbmFsKSB7CisJY2FzZSBTSUdJTlQ6CisJCW51bV9zaWdpbnQrKzsKKwkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQlpZiAobnVtX3NpZ2ludCA+PSAzKQorCQkJZXhpdCgwKTsKKwkJYnJlYWs7CisJfQorfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQ7CisJaW50IHJjOworCisJbG9nX2luaXQoJmxvZ19pbmZvKTsKKwlzdGRlcnJfdGFyZ2V0ID0gbG9nX3RhcmdldF9jcmVhdGVfc3RkZXJyKCk7CisJbG9nX2FkZF90YXJnZXQoc3RkZXJyX3RhcmdldCk7CisJbG9nX3NldF9hbGxfZmlsdGVyKHN0ZGVycl90YXJnZXQsIDEpOworCWhhbmRsZV9vcHRpb25zKGFyZ2MsIGFyZ3YpOworCWJ0c19tb2RlbF9iczExX2luaXQoKTsKKworCWdzbW5ldCA9IGdzbV9uZXR3b3JrX2luaXQoMSwgMSwgTlVMTCk7CisJaWYgKCFnc21uZXQpIHsKKwkJZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gYWxsb2NhdGUgZ3NtIG5ldHdvcmtcbiIpOworCQlleGl0KDEpOworCX0KKwlnX2J0cyA9IGdzbV9idHNfYWxsb2MoZ3NtbmV0LCBHU01fQlRTX1RZUEVfQlMxMSwgSEFSRENPREVEX1RTQywKKwkJCQlIQVJEQ09ERURfQlNJQyk7CisKKwlyYyA9IHJzMjMyX3NldHVwKHNlcmlhbF9wb3J0LCBkZWxheV9tcywgZ19idHMpOworCWlmIChyYyA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJQcm9ibGVtIHNldHRpbmcgdXAgc2VyaWFsIHBvcnRcbiIpOworCQlleGl0KDEpOworCX0KKworCXNpZ25hbChTSUdJTlQsICZzaWduYWxfaGFuZGxlcik7CisKKwlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMSk7CisJLy9hYmlzX25tX2JzMTFfZ2V0X3Nlcm5vKGdfYnRzKTsKKworCXN0YXR1c190aW1lci5jYiA9IHN0YXR1c190aW1lcl9jYjsKKworCXdoaWxlICgxKSB7CisJCWJzY19zZWxlY3RfbWFpbigwKTsKKwl9CisKKwlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisKKwlleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvYnNjX2FwaS5jIGIvb3BlbmJzYy9zcmMvYnNjX2FwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MDQ3NTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ic2NfYXBpLmMKQEAgLTAsMCArMSwzMyBAQAorLyogR1NNIDA4LjA4IGxpa2UgQVBJIGZvciBPcGVuQlNDLiBUaGUgYnJpZGdlIGZyb20gTVNDIHRvIEJTQyAqLworCisvKiAoQykgMjAxMCBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlcgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8b3BlbmJzYy9ic2NfYXBpLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorCisKK2ludCBnc20wODA4X3N1Ym1pdF9kdGFwKHN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uLAorCQkJc3RydWN0IG1zZ2IgKm1zZywgaW50IGxpbmtfaWQpCit7CisJbXNnLT5sY2hhbiA9IGNvbm4tPmxjaGFuOworCW1zZy0+dHJ4ID0gbXNnLT5sY2hhbi0+dHMtPnRyeDsKKwlyZXR1cm4gcnNsX2RhdGFfcmVxdWVzdChtc2csIGxpbmtfaWQpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvYnNjX2hhY2suYyBiL29wZW5ic2Mvc3JjL2JzY19oYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUwZDRhYgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2JzY19oYWNrLmMKQEAgLTAsMCArMSwyNjggQEAKKy8qIEEgaGFja2lzaCBtaW5pbWFsIEJTQyAoK01TQyArSExSKSBpbXBsZW1lbnRhdGlvbiAqLworCisvKiAoQykgMjAwOC0yMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2RlZmluZSBfR05VX1NPVVJDRQorI2luY2x1ZGUgPGdldG9wdC5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9kYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2UxX2lucHV0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKworLyogTUNDIGFuZCBNTkMgZm9yIHRoZSBMb2NhdGlvbiBBcmVhIElkZW50aWZpZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgbG9nX3RhcmdldCAqc3RkZXJyX3RhcmdldDsKK3N0cnVjdCBnc21fbmV0d29yayAqYnNjX2dzbW5ldCA9IDA7CitzdGF0aWMgY29uc3QgY2hhciAqZGF0YWJhc2VfbmFtZSA9ICJobHIuc3FsaXRlMyI7CitzdGF0aWMgY29uc3QgY2hhciAqY29uZmlnX2ZpbGUgPSAib3BlbmJzYy5jZmciOworZXh0ZXJuIGNvbnN0IGNoYXIgKm9wZW5ic2NfdmVyc2lvbjsKK2V4dGVybiBjb25zdCBjaGFyICpvcGVuYnNjX2NvcHlyaWdodDsKKworLyogdGltZXIgdG8gc3RvcmUgc3RhdGlzdGljcyAqLworI2RlZmluZSBEQl9TWU5DX0lOVEVSVkFMCTYwLCAwCitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgZGJfc3luY190aW1lcjsKKworZXh0ZXJuIGludCBic2NfYm9vdHN0cmFwX25ldHdvcmsoaW50ICgqbW1jX3Jldikoc3RydWN0IGdzbV9uZXR3b3JrICosIGludCwgdm9pZCAqKSwKKwkJCQkgY29uc3QgY2hhciAqY2ZnX2ZpbGUpOworZXh0ZXJuIGludCBic2Nfc2h1dGRvd25fbmV0KHN0cnVjdCBnc21fbmV0d29yayAqbmV0KTsKKworc3RhdGljIHZvaWQgY3JlYXRlX3BjYXBfZmlsZShjaGFyICpmaWxlKQoreworCW1vZGVfdCBtb2RlID0gU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JUk9USDsKKwlpbnQgZmQgPSBvcGVuKGZpbGUsIE9fV1JPTkxZfE9fVFJVTkN8T19DUkVBVCwgbW9kZSk7CisKKwlpZiAoZmQgPCAwKSB7CisJCXBlcnJvcigiRmFpbGVkIHRvIG9wZW4gZmlsZSBmb3IgcGNhcCIpOworCQlyZXR1cm47CisJfQorCisJZTFfc2V0X3BjYXBfZmQoZmQpOworfQorCitzdGF0aWMgdm9pZCBwcmludF91c2FnZSgpCit7CisJcHJpbnRmKCJVc2FnZTogYnNjX2hhY2tcbiIpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9oZWxwKCkKK3sKKwlwcmludGYoIiAgU29tZSB1c2VmdWwgaGVscC4uLlxuIik7CisJcHJpbnRmKCIgIC1oIC0taGVscCB0aGlzIHRleHRcbiIpOworCXByaW50ZigiICAtZCBvcHRpb24gLS1kZWJ1Zz1EUkxMOkRDQzpETU06RFJSOkRSU0w6RE5NIGVuYWJsZSBkZWJ1Z2dpbmdcbiIpOworCXByaW50ZigiICAtYyAtLWNvbmZpZy1maWxlIGZpbGVuYW1lIFRoZSBjb25maWcgZmlsZSB0byB1c2UuXG4iKTsKKwlwcmludGYoIiAgLXMgLS1kaXNhYmxlLWNvbG9yXG4iKTsKKwlwcmludGYoIiAgLWwgLS1kYXRhYmFzZSBkYi1uYW1lIFRoZSBkYXRhYmFzZSB0byB1c2VcbiIpOworCXByaW50ZigiICAtYSAtLWF1dGhvcml6ZS1ldmVyeW9uZS4gQXV0aG9yaXplIGV2ZXJ5IG5ldyBzdWJzY3JpYmVyLiBEYW5nZXJvdXMhLlxuIik7CisJcHJpbnRmKCIgIC1wIC0tcGNhcCBmaWxlICBUaGUgZmlsZW5hbWUgb2YgdGhlIHBjYXAgZmlsZVxuIik7CisJcHJpbnRmKCIgIC1UIC0tdGltZXN0YW1wIFByZWZpeCBldmVyeSBsb2cgbGluZSB3aXRoIGEgdGltZXN0YW1wXG4iKTsKKwlwcmludGYoIiAgLVYgLS12ZXJzaW9uLiBQcmludCB0aGUgdmVyc2lvbiBvZiBPcGVuQlNDLlxuIik7CisJcHJpbnRmKCIgIC1QIC0tcnRwLXByb3h5IEVuYWJsZSB0aGUgUlRQIFByb3h5IGNvZGUgaW5zaWRlIE9wZW5CU0NcbiIpOworCXByaW50ZigiICAtZSAtLWxvZy1sZXZlbCBudW1iZXIuIFNldCBhIGdsb2JhbCBsb2dsZXZlbC5cbiIpOworfQorCitzdGF0aWMgdm9pZCBwcmludF92ZXJzaW9uKCkKK3sKKwlwcmludGYoIiVzXG4iLCBvcGVuYnNjX3ZlcnNpb24pOworfQorCitzdGF0aWMgdm9pZCBwcmludF9jb3B5cmlnaHQoKQoreworCXB1dHMob3BlbmJzY19jb3B5cmlnaHQpOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfb3B0aW9ucyhpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisJd2hpbGUgKDEpIHsKKwkJaW50IG9wdGlvbl9pbmRleCA9IDAsIGM7CisJCXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0geworCQkJeyJoZWxwIiwgMCwgMCwgJ2gnfSwKKwkJCXsiZGVidWciLCAxLCAwLCAnZCd9LAorCQkJeyJjb25maWctZmlsZSIsIDEsIDAsICdjJ30sCisJCQl7ImRpc2FibGUtY29sb3IiLCAwLCAwLCAncyd9LAorCQkJeyJkYXRhYmFzZSIsIDEsIDAsICdsJ30sCisJCQl7ImF1dGhvcml6ZS1ldmVyeW9uZSIsIDAsIDAsICdhJ30sCisJCQl7InBjYXAiLCAxLCAwLCAncCd9LAorCQkJeyJ0aW1lc3RhbXAiLCAwLCAwLCAnVCd9LAorCQkJeyJ2ZXJzaW9uIiwgMCwgMCwgJ1YnIH0sCisJCQl7InJ0cC1wcm94eSIsIDAsIDAsICdQJ30sCisJCQl7ImxvZy1sZXZlbCIsIDEsIDAsICdlJ30sCisJCQl7MCwgMCwgMCwgMH0KKwkJfTsKKworCQljID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgImhkOnNsOmFyOnA6VFBWYzplOiIsCisJCQkJbG9uZ19vcHRpb25zLCAmb3B0aW9uX2luZGV4KTsKKwkJaWYgKGMgPT0gLTEpCisJCQlicmVhazsKKworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnaCc6CisJCQlwcmludF91c2FnZSgpOworCQkJcHJpbnRfaGVscCgpOworCQkJZXhpdCgwKTsKKwkJY2FzZSAncyc6CisJCQlsb2dfc2V0X3VzZV9jb2xvcihzdGRlcnJfdGFyZ2V0LCAwKTsKKwkJCWJyZWFrOworCQljYXNlICdkJzoKKwkJCWxvZ19wYXJzZV9jYXRlZ29yeV9tYXNrKHN0ZGVycl90YXJnZXQsIG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnbCc6CisJCQlkYXRhYmFzZV9uYW1lID0gc3RyZHVwKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnYyc6CisJCQljb25maWdfZmlsZSA9IHN0cmR1cChvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ3AnOgorCQkJY3JlYXRlX3BjYXBfZmlsZShvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ1QnOgorCQkJbG9nX3NldF9wcmludF90aW1lc3RhbXAoc3RkZXJyX3RhcmdldCwgMSk7CisJCQlicmVhazsKKwkJY2FzZSAnUCc6CisJCQlpcGFjY19ydHBfZGlyZWN0ID0gMDsKKwkJCWJyZWFrOworCQljYXNlICdlJzoKKwkJCWxvZ19zZXRfbG9nX2xldmVsKHN0ZGVycl90YXJnZXQsIGF0b2kob3B0YXJnKSk7CisJCQlicmVhazsKKwkJY2FzZSAnVic6CisJCQlwcmludF92ZXJzaW9uKCk7CisJCQlwcmludGYoIlxuIik7CisJCQlwcmludF9jb3B5cmlnaHQoKTsKKwkJCWV4aXQoMCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIGlnbm9yZSAqLworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK2V4dGVybiB2b2lkICp0YWxsX3Z0eV9jdHg7CitzdGF0aWMgdm9pZCBzaWduYWxfaGFuZGxlcihpbnQgc2lnbmFsKQoreworCWZwcmludGYoc3Rkb3V0LCAic2lnbmFsICV1IHJlY2VpdmVkXG4iLCBzaWduYWwpOworCisJc3dpdGNoIChzaWduYWwpIHsKKwljYXNlIFNJR0lOVDoKKwkJYnNjX3NodXRkb3duX25ldChic2NfZ3NtbmV0KTsKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX0dMT0JBTCwgU19HTE9CQUxfU0hVVERPV04sIE5VTEwpOworCQlzbGVlcCgzKTsKKwkJZXhpdCgwKTsKKwkJYnJlYWs7CisJY2FzZSBTSUdBQlJUOgorCQkvKiBpbiBjYXNlIG9mIGFib3J0LCB3ZSB3YW50IHRvIG9idGFpbiBhIHRhbGxvYyByZXBvcnQKKwkJICogYW5kIHRoZW4gcmV0dXJuIHRvIHRoZSBjYWxsZXIsIHdobyB3aWxsIGFib3J0IHRoZSBwcm9jZXNzICovCisJY2FzZSBTSUdVU1IxOgorCQl0YWxsb2NfcmVwb3J0KHRhbGxfdnR5X2N0eCwgc3RkZXJyKTsKKwkJdGFsbG9jX3JlcG9ydF9mdWxsKHRhbGxfYnNjX2N0eCwgc3RkZXJyKTsKKwkJYnJlYWs7CisJY2FzZSBTSUdVU1IyOgorCQl0YWxsb2NfcmVwb3J0X2Z1bGwodGFsbF92dHlfY3R4LCBzdGRlcnIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKKy8qIHRpbWVyIGhhbmRsaW5nICovCitzdGF0aWMgaW50IF9kYl9zdG9yZV9jb3VudGVyKHN0cnVjdCBjb3VudGVyICpjb3VudGVyLCB2b2lkICpkYXRhKQoreworCXJldHVybiBkYl9zdG9yZV9jb3VudGVyKGNvdW50ZXIpOworfQorCitzdGF0aWMgdm9pZCBkYl9zeW5jX3RpbWVyX2NiKHZvaWQgKmRhdGEpCit7CisJLyogc3RvcmUgY291bnRlcnMgdG8gZGF0YWJhc2UgYW5kIHJlLXNjaGVkdWxlICovCisJY291bnRlcnNfZm9yX2VhY2goX2RiX3N0b3JlX2NvdW50ZXIsIE5VTEwpOworCWJzY19zY2hlZHVsZV90aW1lcigmZGJfc3luY190aW1lciwgREJfU1lOQ19JTlRFUlZBTCk7Cit9CisKK2V4dGVybiBpbnQgYnRzX21vZGVsX3Vua25vd25faW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgYnRzX21vZGVsX2JzMTFfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgYnRzX21vZGVsX25hbm9idHNfaW5pdCh2b2lkKTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCByYzsKKworCWxvZ19pbml0KCZsb2dfaW5mbyk7CisJdGFsbF9ic2NfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KE5VTEwsIDEsICJvcGVuYnNjIik7CisJdGFsbG9jX2N0eF9pbml0KCk7CisJb25fZHNvX2xvYWRfdG9rZW4oKTsKKwlvbl9kc29fbG9hZF9ycmxwKCk7CisJb25fZHNvX2xvYWRfaG9fZGVjKCk7CisJc3RkZXJyX3RhcmdldCA9IGxvZ190YXJnZXRfY3JlYXRlX3N0ZGVycigpOworCWxvZ19hZGRfdGFyZ2V0KHN0ZGVycl90YXJnZXQpOworCisJYnRzX21vZGVsX3Vua25vd25faW5pdCgpOworCWJ0c19tb2RlbF9iczExX2luaXQoKTsKKwlidHNfbW9kZWxfbmFub2J0c19pbml0KCk7CisKKwkvKiBlbmFibGUgZmlsdGVycyAqLworCWxvZ19zZXRfYWxsX2ZpbHRlcihzdGRlcnJfdGFyZ2V0LCAxKTsKKworCS8qIHBhcnNlIG9wdGlvbnMgKi8KKwloYW5kbGVfb3B0aW9ucyhhcmdjLCBhcmd2KTsKKworCS8qIHNlZWQgdGhlIFBSTkcgKi8KKwlzcmFuZCh0aW1lKE5VTEwpKTsKKworCWlmIChkYl9pbml0KGRhdGFiYXNlX25hbWUpKSB7CisJCXByaW50ZigiREI6IEZhaWxlZCB0byBpbml0IGRhdGFiYXNlLiBQbGVhc2UgY2hlY2sgdGhlIG9wdGlvbiBzZXR0aW5ncy5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXByaW50ZigiREI6IERhdGFiYXNlIGluaXRpYWxpemVkLlxuIik7CisKKwlpZiAoZGJfcHJlcGFyZSgpKSB7CisJCXByaW50ZigiREI6IEZhaWxlZCB0byBwcmVwYXJlIGRhdGFiYXNlLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisJcHJpbnRmKCJEQjogRGF0YWJhc2UgcHJlcGFyZWQuXG4iKTsKKworCS8qIHNldHVwIHRoZSB0aW1lciAqLworCWRiX3N5bmNfdGltZXIuY2IgPSBkYl9zeW5jX3RpbWVyX2NiOworCWRiX3N5bmNfdGltZXIuZGF0YSA9IE5VTEw7CisJYnNjX3NjaGVkdWxlX3RpbWVyKCZkYl9zeW5jX3RpbWVyLCBEQl9TWU5DX0lOVEVSVkFMKTsKKworCXJjID0gYnNjX2Jvb3RzdHJhcF9uZXR3b3JrKG1uY2NfcmVjdiwgY29uZmlnX2ZpbGUpOworCWlmIChyYyA8IDApCisJCWV4aXQoMSk7CisKKwlzaWduYWwoU0lHSU5ULCAmc2lnbmFsX2hhbmRsZXIpOworCXNpZ25hbChTSUdBQlJULCAmc2lnbmFsX2hhbmRsZXIpOworCXNpZ25hbChTSUdVU1IxLCAmc2lnbmFsX2hhbmRsZXIpOworCXNpZ25hbChTSUdVU1IyLCAmc2lnbmFsX2hhbmRsZXIpOworCXNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKKworCXdoaWxlICgxKSB7CisJCWJzY191cHF1ZXVlKGJzY19nc21uZXQpOworCQlsb2dfcmVzZXRfY29udGV4dCgpOworCQlic2Nfc2VsZWN0X21haW4oMCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvYnNjX2luaXQuYyBiL29wZW5ic2Mvc3JjL2JzY19pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJjMDJjNAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2JzY19pbml0LmMKQEAgLTAsMCArMSwxMDkzIEBACisvKiBBIGhhY2tpc2ggbWluaW1hbCBCU0MgKCtNU0MgK0hMUikgaW1wbGVtZW50YXRpb24gKi8KKworLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtX3V0aWxzLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWlzZG4uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RlbG5ldF9pbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3N5c3RlbV9pbmZvcm1hdGlvbi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcGFnaW5nLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2NoYW5fYWxsb2MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKworLyogZ2xvYmFsIHBvaW50ZXIgdG8gdGhlIGdzbSBuZXR3b3JrIGRhdGEgc3RydWN0dXJlICovCitleHRlcm4gc3RydWN0IGdzbV9uZXR3b3JrICpic2NfZ3NtbmV0OworCitzdGF0aWMgdm9pZCBwYXRjaF9ubV90YWJsZXMoc3RydWN0IGdzbV9idHMgKmJ0cyk7CisKKy8qIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgYXJlIGZvciBPTSBhbmQgTk0gcGFja2V0cyB0aGF0IHdlIGNhbm5vdCB5ZXQKKyAqIGdlbmVyYXRlIGJ5IGNvZGUgYnV0IHdlIGp1c3QgcGFzcyBvbiAqLworCisvLyBCVFMgU2l0ZSBNYW5hZ2VyLCBTRVQgQVRUUklCVVRFUworCisvKgorICBPYmplY3QgQ2xhc3M6IEJUUyBTaXRlIE1hbmFnZXIKKyAgSW5zdGFuY2UgMTogRkYKKyAgSW5zdGFuY2UgMjogRkYKKyAgSW5zdGFuY2UgMzogRkYKK1NFVCBBVFRSSUJVVEVTCisgIHNBYmlzRXh0ZXJuYWxUaW1lOiAyMDA3LzA5LzA4ICAgMTQ6MzY6MTEKKyAgb21MQVBEUmVsVGltZXI6IDMwc2VjCisgIHNob3J0TEFQREludFRpbWVyOiA1c2VjCisgIGVtZXJnZW5jeVRpbWVyMTogMTAgbWludXRlcworICBlbWVyZ2VuY3lUaW1lcjI6IDAgbWludXRlcworKi8KKwordW5zaWduZWQgY2hhciBtc2dfMVtdID0KK3sKKwlOTV9NVF9CUzExX1NFVF9BVFRSLCBOTV9PQ19TSVRFX01BTkFHRVIsIDB4RkYsIDB4RkYsIDB4RkYsCisJCU5NX0FUVF9CUzExX0FCSVNfRVhUX1RJTUUsIDB4MDcsCisJCQkweEQ3LCAweDA5LCAweDA4LCAweDBFLCAweDI0LCAweDBCLCAweENFLAorCQkweDAyLAorCQkJMHgwMCwgMHgxRSwKKwkJTk1fQVRUX0JTMTFfU0hfTEFQRF9JTlRfVElNRVIsCisJCQkweDAxLCAweDA1LAorCQkweDQyLCAweDAyLCAweDAwLCAweDBBLAorCQkweDQ0LCAweDAyLCAweDAwLCAweDAwCit9OworCisvLyBCVFMsIFNFVCBCVFMgQVRUUklCVVRFUworCisvKgorICBPYmplY3QgQ2xhc3M6IEJUUworICBCVFMgcmVsYXQuIE51bWJlcjogMAorICBJbnN0YW5jZSAyOiBGRgorICBJbnN0YW5jZSAzOiBGRgorU0VUIEJUUyBBVFRSSUJVVEVTCisgIGJzSWRlbnRpdHlDb2RlIC8gQlNJQzoKKyAgICBQTE1OX2NvbG91cl9jb2RlOiA3aAorICAgIEJTX2NvbG91cl9jb2RlOiAgIDdoCisgIEJUUyBBaXIgVGltZXIgVDMxMDU6IDQgICx1bml0IDEwIG1zCisgIGJ0c0lzSG9wcGluZzogRkFMU0UKKyAgcGVyaW9kQ0NDSExvYWRJbmRpY2F0aW9uOiAxc2VjCisgIHRocmVzaG9sZENDQ0hMb2FkSW5kaWNhdGlvbjogMCUKKyAgY2VsbEFsbG9jYXRpb25OdW1iZXI6IDAwaCA9IEdTTSA5MDAKKyAgZW5hYmxlSW50ZXJmZXJlbmNlQ2xhc3M6IDAwaCA9ICBEaXNhYmxlZAorICBmQUNDSFF1YWw6IDYgKEZBQ0NIIHN0ZWFsaW5nIGZsYWdzIG1pbnVzIDEpCisgIGludGF2ZVBhcmFtZXRlcjogMzEgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgaW50ZXJmZXJlbmNlTGV2ZWxCb3VuZGFyaWVzOgorICAgIEludGVyZmVyZW5jZSBCb3VuZGFyeSAxOiAwQWgKKyAgICBJbnRlcmZlcmVuY2UgQm91bmRhcnkgMjogMEZoCisgICAgSW50ZXJmZXJlbmNlIEJvdW5kYXJ5IDM6IDE0aAorICAgIEludGVyZmVyZW5jZSBCb3VuZGFyeSA0OiAxOWgKKyAgICBJbnRlcmZlcmVuY2UgQm91bmRhcnkgNTogMUVoCisgIG1TVHhQd3JNYXg6IDExCisgICAgICBHU00gcmFuZ2U6ICAgICAyPTM5ZEJtLCAxNT0xM2RCbSwgc3RlcHNpemUgMiBkQm0KKyAgICAgIERDUzE4MDAgcmFuZ2U6IDA9MzBkQm0sIDE1PTBkQm0sIHN0ZXBzaXplIDIgZEJtCisgICAgICBQQ1MxOTAwIHJhbmdlOiAwPTMwZEJtLCAxNT0wZEJtLCBzdGVwc2l6ZSAyIGRCbQorICAgICAgICAgICAgICAgICAgICAzMD0zM2RCbSwgMzE9MzJkQm0KKyAgbnkxOgorICAgIE1heGltdW0gbnVtYmVyIG9mIHJlcGV0aXRpb25zIGZvciBQSFlTSUNBTCBJTkZPUk1BVElPTiBtZXNzYWdlIChHU00gMDQuMDgpOiAyMAorICBwb3dlck91dHB1dFRocmVzaG9sZHM6CisgICAgT3V0IFBvd2VyIEZhdWx0IFRocmVzaG9sZDogICAgIC0xMCBkQgorICAgIFJlZCBPdXQgUG93ZXIgVGhyZXNob2xkOiAgICAgICAtIDYgZEIKKyAgICBFeGNlc3NpdmUgT3V0IFBvd2VyIFRocmVzaG9sZDogICA1IGRCCisgIHJBQ0hCdXN5VGhyZXNob2xkOiAtMTI3IGRCbQorICByQUNITG9hZEF2ZXJhZ2luZ1Nsb3RzOiAyNTAgLG51bWJlciBvZiBSQUNIIGJ1cnN0IHBlcmlvZHMKKyAgcmZSZXNvdXJjZUluZGljYXRpb25QZXJpb2Q6IDEyNSAgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgVDIwMDoKKyAgICBTRENDSDogICAgICAgICAgICAgICAgMDQ0IGluICA1IG1zCisgICAgRkFDQ0gvRnVsbCByYXRlOiAgICAgIDAzMSBpbiAgNSBtcworICAgIEZBQ0NIL0hhbGYgcmF0ZTogICAgICAwNDEgaW4gIDUgbXMKKyAgICBTQUNDSCB3aXRoIFRDSCBTQVBJMDogMDkwIGluIDEwIG1zCisgICAgU0FDQ0ggd2l0aCBTRENDSDogICAgIDA5MCBpbiAxMCBtcworICAgIFNEQ0NIIHdpdGggU0FQSTM6ICAgICAwOTAgaW4gIDUgbXMKKyAgICBTQUNDSCB3aXRoIFRDSCBTQVBJMzogMTM1IGluIDEwIG1zCisgIHRTeW5jOiA5MDAwIHVuaXRzIG9mIDEwIG1zZWMKKyAgdFRyYXU6IDkwMDAgdW5pdHMgb2YgMTAgbXNlYworICBlbmFibGVVbUxvb3BUZXN0OiAwMGggPSAgZGlzYWJsZWQKKyAgZW5hYmxlRXhjZXNzaXZlRGlzdGFuY2U6IDAwaCA9ICBEaXNhYmxlZAorICBleGNlc3NpdmVEaXN0YW5jZTogNjRrbQorICBob3BwaW5nTW9kZTogMDBoID0gYmFzZWJhbmQgaG9wcGluZworICBjZWxsVHlwZTogMDBoID0gIFN0YW5kYXJkIENlbGwKKyAgQkNDSCBBUkZDTiAvIGJDQ0hGcmVxdWVuY3k6IDEKKyovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGJzMTFfYXR0cl9idHNbXSA9Cit7CisJCU5NX0FUVF9CU0lDLCBIQVJEQ09ERURfQlNJQywKKwkJTk1fQVRUX0JUU19BSVJfVElNRVIsIDB4MDQsCisJCU5NX0FUVF9CUzExX0JUU0xTX0hPUFBJTkcsIDB4MDAsCisJCU5NX0FUVF9DQ0NIX0xfSV9QLCAweDAxLAorCQlOTV9BVFRfQ0NDSF9MX1QsIDB4MDAsCisJCU5NX0FUVF9CUzExX0NFTExfQUxMT0NfTlIsIE5NX0JTMTFfQ0FOUl9HU00sCisJCU5NX0FUVF9CUzExX0VOQV9JTlRFUkZfQ0xBU1MsIDB4MDEsCisJCU5NX0FUVF9CUzExX0ZBQ0NIX1FVQUwsIDB4MDYsCisJCS8qIGludGVyZmVyZW5jZSBhdmcuIHBlcmlvZCBpbiBudW1iZXJzIG9mIFNBQ0NIIG11bHRpZnIgKi8KKwkJTk1fQVRUX0lOVEFWRV9QQVJBTSwgMHgxRiwKKwkJTk1fQVRUX0lOVEVSRl9CT1VORCwgMHgwQSwgMHgwRiwgMHgxNCwgMHgxOSwgMHgxRSwgMHg3QiwKKwkJTk1fQVRUX0NDQ0hfTF9ULCAweDIzLAorCQlOTV9BVFRfR1NNX1RJTUUsIDB4MjgsIDB4MDAsCisJCU5NX0FUVF9BRE1fU1RBVEUsIDB4MDMsCisJCU5NX0FUVF9SQUNIX0JfVEhSRVNILCAweDdGLAorCQlOTV9BVFRfTERBVkdfU0xPVFMsIDB4MDAsIDB4RkEsCisJCU5NX0FUVF9CUzExX1JGX1JFU19JTkRfUEVSLCAweDdELAorCQlOTV9BVFRfVDIwMCwgMHgyQywgMHgxRiwgMHgyOSwgMHg1QSwgMHg1QSwgMHg1QSwgMHg4NywKKwkJTk1fQVRUX0JTMTFfVFNZTkMsIDB4MjMsIDB4MjgsCisJCU5NX0FUVF9CUzExX1RUUkFVLCAweDIzLCAweDI4LAorCQlOTV9BVFRfVEVTVF9EVVIsIDB4MDEsIDB4MDAsCisJCU5NX0FUVF9PVVRTVF9BTEFSTSwgMHgwMSwgMHgwMCwKKwkJTk1fQVRUX0JTMTFfRVhDRVNTSVZFX0RJU1RBTkNFLCAweDAxLCAweDQwLAorCQlOTV9BVFRfQlMxMV9IT1BQSU5HX01PREUsIDB4MDEsIDB4MDAsCisJCU5NX0FUVF9CUzExX1BMTCwgMHgwMSwgMHgwMCwKKwkJTk1fQVRUX0JDQ0hfQVJGQ04sIDB4MDAsIEhBUkRDT0RFRF9BUkZDTi8qMHgwMSovLAorfTsKKworLy8gSGFuZG92ZXIgUmVjb2duaXRpb24sIFNFVCBBVFRSSUJVVEVTCisKKy8qCitJbGxlZ2FsIENvbnRlbnRzIEdTTSBGb3JtYXR0ZWQgTyZNIE1zZworICBPYmplY3QgQ2xhc3M6IEhhbmRvdmVyIFJlY29nbml0aW9uCisgIEJUUyByZWxhdC4gTnVtYmVyOiAwCisgIEluc3RhbmNlIDI6IEZGCisgIEluc3RhbmNlIDM6IEZGCitTRVQgQVRUUklCVVRFUworICBlbmFibGVEZWxheVBvd2VyQnVkZ2V0SE86IDAwaCA9IERpc2FibGVkCisgIGVuYWJsZURpc3RhbmNlSE86IDAwaCA9ICBEaXNhYmxlZAorICBlbmFibGVJbnRlcm5hbEludGVyQ2VsbEhhbmRvdmVyOiAwMGggPSBEaXNhYmxlZAorICBlbmFibGVJbnRlcm5hbEludHJhQ2VsbEhhbmRvdmVyOiAwMGggPSAgRGlzYWJsZWQKKyAgZW5hYmxlUG93ZXJCdWRnZXRITzogMDBoID0gRGlzYWJsZWQKKyAgZW5hYmxlUlhMRVZITzogMDBoID0gIERpc2FibGVkCisgIGVuYWJsZVJYUVVBTEhPOiAwMGggPSAgRGlzYWJsZWQKKyAgaG9BdmVyYWdpbmdEaXN0YW5jZTogOCAgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgaG9BdmVyYWdpbmdMZXY6CisgICAgQV9MRVZfSE86IDggIFNBQ0NIIG11bHRpZnJhbWVzCisgICAgV19MRVZfSE86IDEgIFNBQ0NIIG11bHRpZnJhbWVzCisgIGhvQXZlcmFnaW5nUG93ZXJCdWRnZXQ6ICAxNiAgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgaG9BdmVyYWdpbmdRdWFsOgorICAgIEFfUVVBTF9ITzogOCAgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgICBXX1FVQUxfSE86IDIgIFNBQ0NIIG11bHRpZnJhbWVzCisgIGhvTG93ZXJUaHJlc2hvbGRMZXZETDogKDEwIC0gMTEwKSBkQm0KKyAgaG9Mb3dlclRocmVzaG9sZExldlVMOiAoNSAtIDExMCkgZEJtCisgIGhvTG93ZXJUaHJlc2hvbGRRdWFsREw6IDA2aCA9ICAgNi40JSA8IEJFUiA8IDEyLjglCisgIGhvTG93ZXJUaHJlc2hvbGRRdWFsVUw6IDA2aCA9ICAgNi40JSA8IEJFUiA8IDEyLjglCisgIGhvVGhyZXNob2xkTGV2RExpbnRyYSA6ICgyMCAtIDExMCkgZEJtCisgIGhvVGhyZXNob2xkTGV2VUxpbnRyYTogKDIwIC0gMTEwKSBkQm0KKyAgaG9UaHJlc2hvbGRNc1JhbmdlTWF4OiAyMCBrbQorICBuQ2VsbDogMDZoCisgIHRpbWVySE9SZXF1ZXN0OiAzICAsdW5pdCAyIFNBQ0NIIG11bHRpZnJhbWVzCisqLworCit1bnNpZ25lZCBjaGFyIG1zZ18zW10gPQoreworCU5NX01UX0JTMTFfU0VUX0FUVFIsIE5NX09DX0JTMTFfSEFORE9WRVIsIDB4MDAsIDB4RkYsIDB4RkYsCisJCTB4RDAsIDB4MDAsCQkvKiBlbmFibGVEZWxheVBvd2VyQnVkZ2V0SE8gKi8KKwkJMHg2NCwgMHgwMCwJCS8qIGVuYWJsZURpc3RhbmNlSE8gKi8KKwkJMHg2NywgMHgwMCwJCS8qIGVuYWJsZUludGVybmFsSW50ZXJDZWxsSGFuZG92ZXIgKi8KKwkJMHg2OCwgMHgwMCwJCS8qIGVuYWJsZUludGVybmFsSW50ZXJDZWxsSGFuZG92ZXIgKi8KKwkJMHg2QSwgMHgwMCwJCS8qIGVuYWJsZVBvd2VyQnVkZ2V0SE8gKi8KKwkJMHg2QywgMHgwMCwJCS8qIGVuYWJsZVJYTEVWSE8gKi8KKwkJMHg2RCwgMHgwMCwJCS8qIGVuYWJsZVJYUVVBTEhPICovCisJCTB4NkYsIDB4MDgsCQkvKiBob0F2ZXJhZ2luZ0Rpc3RhbmNlICovCisJCTB4NzAsIDB4MDgsIDB4MDEsCS8qIGhvQXZlcmFnaW5nTGV2ICovCisJCTB4NzEsIDB4MTAsIDB4MTAsIDB4MTAsCisJCTB4NzIsIDB4MDgsIDB4MDIsCS8qIGhvQXZlcmFnaW5nUXVhbCAqLworCQkweDczLCAweDBBLAkJLyogaG9Mb3dlclRocmVzaG9sZExldkRMICovCisJCTB4NzQsIDB4MDUsCQkvKiBob0xvd2VyVGhyZXNob2xkTGV2VUwgKi8KKwkJMHg3NSwgMHgwNiwJCS8qIGhvTG93ZXJUaHJlc2hvbGRRdWFsREwgKi8KKwkJMHg3NiwgMHgwNiwJCS8qIGhvTG93ZXJUaHJlc2hvbGRRdWFsVUwgKi8KKwkJMHg3OCwgMHgxNCwJCS8qIGhvVGhyZXNob2xkTGV2RExpbnRyYSAqLworCQkweDc5LCAweDE0LAkJLyogaG9UaHJlc2hvbGRMZXZVTGludHJhICovCisJCTB4N0EsIDB4MTQsCQkvKiBob1RocmVzaG9sZE1zUmFuZ2VNYXggKi8KKwkJMHg3RCwgMHgwNiwJCS8qIG5DZWxsICovCisJCU5NX0FUVF9CUzExX1RJTUVSX0hPX1JFUVVFU1QsIDB4MDMsCisJCTB4MjAsIDB4MDEsIDB4MDAsCisJCTB4NDUsIDB4MDEsIDB4MDAsCisJCTB4NDgsIDB4MDEsIDB4MDAsCisJCTB4NUEsIDB4MDEsIDB4MDAsCisJCTB4NUIsIDB4MDEsIDB4MDUsCisJCTB4NUUsIDB4MDEsIDB4MUEsCisJCTB4NUYsIDB4MDEsIDB4MjAsCisJCTB4OUQsIDB4MDEsIDB4MDAsCisJCTB4NDcsIDB4MDEsIDB4MDAsCisJCTB4NUMsIDB4MDEsIDB4NjQsCisJCTB4NUQsIDB4MDEsIDB4MUUsCisJCTB4OTcsIDB4MDEsIDB4MjAsCisJCTB4RjcsIDB4MDEsIDB4M0MsCit9OworCisvLyBQb3dlciBDb250cm9sLCBTRVQgQVRUUklCVVRFUworCisvKgorICBPYmplY3QgQ2xhc3M6IFBvd2VyIENvbnRyb2wKKyAgQlRTIHJlbGF0LiBOdW1iZXI6IDAKKyAgSW5zdGFuY2UgMjogRkYKKyAgSW5zdGFuY2UgMzogRkYKK1NFVCBBVFRSSUJVVEVTCisgIGVuYWJsZU1zUG93ZXJDb250cm9sOiAwMGggPSAgRGlzYWJsZWQKKyAgZW5hYmxlUG93ZXJDb250cm9sUkxGVzogMDBoID0gIERpc2FibGVkCisgIHBjQXZlcmFnaW5nTGV2OgorICAgIEFfTEVWX1BDOiA0ICBTQUNDSCBtdWx0aWZyYW1lcworICAgIFdfTEVWX1BDOiAxICBTQUNDSCBtdWx0aWZyYW1lcworICBwY0F2ZXJhZ2luZ1F1YWw6CisgICAgQV9RVUFMX1BDOiA0ICBTQUNDSCBtdWx0aWZyYW1lcworICAgIFdfUVVBTF9QQzogMiAgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgcGNMb3dlclRocmVzaG9sZExldkRMOiAwRmgKKyAgcGNMb3dlclRocmVzaG9sZExldlVMOiAwQWgKKyAgcGNMb3dlclRocmVzaG9sZFF1YWxETDogMDVoID0gICAzLjIlIDwgQkVSIDwgIDYuNCUKKyAgcGNMb3dlclRocmVzaG9sZFF1YWxVTDogMDVoID0gICAzLjIlIDwgQkVSIDwgIDYuNCUKKyAgcGNSTEZUaHJlc2hvbGQ6IDBDaAorICBwY1VwcGVyVGhyZXNob2xkTGV2REw6IDE0aAorICBwY1VwcGVyVGhyZXNob2xkTGV2VUw6IDBGaAorICBwY1VwcGVyVGhyZXNob2xkUXVhbERMOiAwNGggPSAgIDEuNiUgPCBCRVIgPCAgMy4yJQorICBwY1VwcGVyVGhyZXNob2xkUXVhbFVMOiAwNGggPSAgIDEuNiUgPCBCRVIgPCAgMy4yJQorICBwb3dlckNvbmZpcm06IDIgICx1bml0IDIgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgcG93ZXJDb250cm9sSW50ZXJ2YWw6IDIgICx1bml0IDIgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgcG93ZXJJbmNyU3RlcFNpemU6IDAyaCA9IDQgZEIKKyAgcG93ZXJSZWRTdGVwU2l6ZTogMDFoID0gMiBkQgorICByYWRpb0xpbmtUaW1lb3V0QnM6IDY0ICBTQUNDSCBtdWx0aWZyYW1lcworICBlbmFibGVCU1Bvd2VyQ29udHJvbDogMDBoID0gIGRpc2FibGVkCisqLworCit1bnNpZ25lZCBjaGFyIG1zZ180W10gPQoreworCU5NX01UX0JTMTFfU0VUX0FUVFIsIE5NX09DX0JTMTFfUFdSX0NUUkwsIDB4MDAsIDB4RkYsIDB4RkYsCisJCU5NX0FUVF9CUzExX0VOQV9NU19QV1JfQ1RSTCwgMHgwMCwKKwkJTk1fQVRUX0JTMTFfRU5BX1BXUl9DVFJMX1JMRlcsIDB4MDAsCisJCTB4N0UsIDB4MDQsIDB4MDEsCS8qIHBjQXZlcmFnaW5nTGV2ICovCisJCTB4N0YsIDB4MDQsIDB4MDIsCS8qIHBjQXZlcmFnaW5nUXVhbCAqLworCQkweDgwLCAweDBGLAkJLyogcGNMb3dlclRocmVzaG9sZExldkRMICovCisJCTB4ODEsIDB4MEEsCQkvKiBwY0xvd2VyVGhyZXNob2xkTGV2VUwgKi8KKwkJMHg4MiwgMHgwNSwJCS8qIHBjTG93ZXJUaHJlc2hvbGRRdWFsREwgKi8KKwkJMHg4MywgMHgwNSwJCS8qIHBjTG93ZXJUaHJlc2hvbGRRdWFsVUwgKi8KKwkJMHg4NCwgMHgwQywgCQkvKiBwY1JMRlRocmVzaG9sZCAqLworCQkweDg1LCAweDE0LCAJCS8qIHBjVXBwZXJUaHJlc2hvbGRMZXZETCAqLworCQkweDg2LCAweDBGLCAJCS8qIHBjVXBwZXJUaHJlc2hvbGRMZXZVTCAqLworCQkweDg3LCAweDA0LAkJLyogcGNVcHBlclRocmVzaG9sZFF1YWxETCAqLworCQkweDg4LCAweDA0LAkJLyogcGNVcHBlclRocmVzaG9sZFF1YWxVTCAqLworCQkweDg5LCAweDAyLAkJLyogcG93ZXJDb25maXJtICovCisJCTB4OEEsIDB4MDIsCQkvKiBwb3dlckNvbmZpcm1JbnRlcnZhbCAqLworCQkweDhCLCAweDAyLAkJLyogcG93ZXJJbmNyU3RlcFNpemUgKi8KKwkJMHg4QywgMHgwMSwJCS8qIHBvd2VyUmVkU3RlcFNpemUgKi8KKwkJMHg4RCwgMHg0MCwJCS8qIHJhZGlvTGlua1RpbWVvdXRCcyAqLworCQkweDY1LCAweDAxLCAweDAwIC8vIHNldCB0byAweDAxIHRvIGVuYWJsZSBCU1Bvd2VyQ29udHJvbAorfTsKKworCisvLyBUcmFuc2NlaXZlciwgU0VUIFRSWCBBVFRSSUJVVEVTIChUUlggMCkKKworLyoKKyAgT2JqZWN0IENsYXNzOiBUcmFuc2NlaXZlcgorICBCVFMgcmVsYXQuIE51bWJlcjogMAorICBUcmFuY2VpdmVyIG51bWJlcjogMAorICBJbnN0YW5jZSAzOiBGRgorU0VUIFRSWCBBVFRSSUJVVEVTCisgIGFSRkNOTGlzdCAoSEVYKTogIDAwMDEKKyAgdHhQd3JNYXhSZWR1Y3Rpb246IDAwaCA9ICAgMzBkQgorICByYWRpb01lYXNHcmFuOiAyNTQgIFNBQ0NIIG11bHRpZnJhbWVzCisgIHJhZGlvTWVhc1JlcDogMDFoID0gIGVuYWJsZWQKKyAgbWVtYmVyT2ZFbWVyZ2VuY3lDb25maWc6IDAxaCA9ICBUUlVFCisgIHRyeEFyZWE6IDAwaCA9IFRSWCBkb2Vzbid0IGJlbG9uZyB0byBhIGNvbmNlbnRyaWMgY2VsbAorKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYnMxMV9hdHRyX3JhZGlvW10gPQoreworCQlOTV9BVFRfQVJGQ05fTElTVCwgMHgwMSwgMHgwMCwgSEFSRENPREVEX0FSRkNOIC8qMHgwMSovLAorCQlOTV9BVFRfUkZfTUFYUE9XUl9SLCAweDAwLAorCQlOTV9BVFRfQlMxMV9SQURJT19NRUFTX0dSQU4sIDB4MDEsIDB4MDUsCisJCU5NX0FUVF9CUzExX1JBRElPX01FQVNfUkVQLCAweDAxLCAweDAxLAorCQlOTV9BVFRfQlMxMV9FTVJHX0NGR19NRU1CRVIsIDB4MDEsIDB4MDEsCisJCU5NX0FUVF9CUzExX1RSWF9BUkVBLCAweDAxLCAweDAwLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgbmFub2J0c19hdHRyX2J0c1tdID0geworCU5NX0FUVF9JTlRFUkZfQk9VTkQsIDB4NTUsIDB4NWIsIDB4NjEsIDB4NjcsIDB4NmQsIDB4NzMsCisJLyogaW50ZXJmZXJlbmNlIGF2Zy4gcGVyaW9kIGluIG51bWJlcnMgb2YgU0FDQ0ggbXVsdGlmciAqLworCU5NX0FUVF9JTlRBVkVfUEFSQU0sIDB4MDYsCisJLyogY29ubiBmYWlsIGJhc2VkIG9uIFNBQ0NIIGVycm9yIHJhdGUgKi8KKwlOTV9BVFRfQ09OTl9GQUlMX0NSSVQsIDB4MDAsIDB4MDIsIDB4MDEsIDB4MTAsCisJTk1fQVRUX1QyMDAsIDB4MWUsIDB4MjQsIDB4MjQsIDB4YTgsIDB4MzQsIDB4MjEsIDB4YTgsCisJTk1fQVRUX01BWF9UQSwgMHgzZiwKKwlOTV9BVFRfT1ZFUkxfUEVSSU9ELCAweDAwLCAweDAxLCAxMCwgLyogc2Vjb25kcyAqLworCU5NX0FUVF9DQ0NIX0xfVCwgMTAsIC8qIHBlcmNlbnQgKi8KKwlOTV9BVFRfQ0NDSF9MX0lfUCwgMSwgLyogc2Vjb25kcyAqLworCU5NX0FUVF9SQUNIX0JfVEhSRVNILCAxMCwgLyogYnVzeSB0aHJlc2hvbGQgaW4gLSBkQm0gKi8KKwlOTV9BVFRfTERBVkdfU0xPVFMsIDB4MDMsIDB4ZTgsIC8qIHJhY2ggbG9hZCBhdmVyYWdpbmcgMTAwMCBzbG90cyAqLworCU5NX0FUVF9CVFNfQUlSX1RJTUVSLCAxMjgsIC8qIG1pbGlzZWNvbmRzICovCisJTk1fQVRUX05ZMSwgMTAsIC8qIDEwIHJldHJhbnNtaXNzaW9ucyBvZiBwaHlzaWNhbCBjb25maWcgKi8KKwlOTV9BVFRfQkNDSF9BUkZDTiwgSEFSRENPREVEX0FSRkNOID4+IDgsIEhBUkRDT0RFRF9BUkZDTiAmIDB4ZmYsCisJTk1fQVRUX0JTSUMsIEhBUkRDT0RFRF9CU0lDLAorCU5NX0FUVF9JUEFDQ19DR0ksIDAsIDcsICAweDAwLCAweGYxLCAweDEwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgbmFub2J0c19hdHRyX3JhZGlvW10gPSB7CisJTk1fQVRUX1JGX01BWFBPV1JfUiwgMHgwYywgLyogbnVtYmVyIG9mIC0yZEIgcmVkdWN0aW9uIHN0ZXBzIC8gUG4gKi8KKwlOTV9BVFRfQVJGQ05fTElTVCwgMHgwMCwgMHgwMiwgSEFSRENPREVEX0FSRkNOID4+IDgsIEhBUkRDT0RFRF9BUkZDTiAmIDB4ZmYsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBuYW5vYnRzX2F0dHJfbnNlW10gPSB7CisJTk1fQVRUX0lQQUNDX05TRUksIDAsIDIsICAweDAzLCAweDlkLCAvKiBOU0VJIDkyNSAqLworCU5NX0FUVF9JUEFDQ19OU19DRkcsIDAsIDcsICAzLCAgLyogKHVuKWJsb2NraW5nIHRpbWVyIChUbnMtYmxvY2spICovCisJCQkJICAgIDMsICAvKiAodW4pYmxvY2tpbmcgcmV0cmllcyAqLworCQkJCSAgICAzLCAgLyogcmVzZXQgdGltZXIgKFRucy1yZXNldCkgKi8KKwkJCQkgICAgMywgIC8qIHJlc2V0IHJldHJpZXMgKi8KKwkJCQkgICAgMzAsICAvKiB0ZXN0IHRpbWVyIChUbnMtdGVzdCkgKi8KKwkJCQkgICAgMywgIC8qIGFsaXZlIHRpbWVyIChUbnMtYWxpdmUpICovCisJCQkJICAgIDEwLCAvKiBhbGl2ZSByZXRyaXJlcyAqLworCU5NX0FUVF9JUEFDQ19CU1NHUF9DRkcsIDAsIDExLAorCQkJCSAgICAzLCAgLyogYmxvY2tpbWcgdGltZXIgKFQxKSAqLworCQkJCSAgICAzLCAgLyogYmxvY2tpbmcgcmV0cmllcyAqLworCQkJCSAgICAzLCAgLyogdW5ibG9ja2luZyByZXRyaWVzICovCisJCQkJICAgIDMsICAvKiByZXNldCB0aW1lciAqLworCQkJCSAgICAzLCAgLyogcmVzZXQgcmV0cmllcyAqLworCQkJCSAgICAxMCwgLyogc3VzcGVuZCB0aW1lciAoVDMpIGluIDEwMG1zICovCisJCQkJICAgIDMsICAvKiBzdXNwZW5kIHJldHJpZXMgKi8KKwkJCQkgICAgMTAsIC8qIHJlc3VtZSB0aW1lciAoVDQpIGluIDEwMG1zICovCisJCQkJICAgIDMsICAvKiByZXN1bWUgcmV0cmllcyAqLworCQkJCSAgICAxMCwgLyogY2FwYWJpbGl0eSB1cGRhdGUgdGltZXIgKFQ1KSAqLworCQkJCSAgICAzLCAgLyogY2FwYWJpbGl0eSB1cGRhdGUgcmV0cmllcyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgbmFub2J0c19hdHRyX2NlbGxbXSA9IHsKKwlOTV9BVFRfSVBBQ0NfUkFDLCAwLCAxLCAgMSwgLyogcm91dGluZyBhcmVhIGNvZGUgKi8KKwlOTV9BVFRfSVBBQ0NfR1BSU19QQUdJTkdfQ0ZHLCAwLCAyLAorCQk1LAkvKiByZXBlYXQgdGltZSAoNTBtcykgKi8KKwkJMywJLyogcmVwZWF0IGNvdW50ICovCisJTk1fQVRUX0lQQUNDX0JWQ0ksIDAsIDIsICAweDAzLCAweDlkLCAvKiBCVkNJIDkyNSAqLworCU5NX0FUVF9JUEFDQ19STENfQ0ZHLCAwLCA5LAorCQkyMCwgCS8qIFQzMTQyICovCisJCTUsIAkvKiBUMzE2OSAqLworCQk1LAkvKiBUMzE5MSAqLworCQkyMDAsCS8qIFQzMTkzICovCisJCTUsCS8qIFQzMTk1ICovCisJCTEwLAkvKiBOMzEwMSAqLworCQk0LAkvKiBOMzEwMyAqLworCQk4LAkvKiBOMzEwNSAqLworCQkxNSwJLyogUkxDIENWIGNvdW50ZG93biAqLworCU5NX0FUVF9JUEFDQ19DT0RJTkdfU0NIRU1FUywgMCwgMiwgIDB4MGYsIDB4MDAsCS8qIENTMS4uQ1M0ICovCisJTk1fQVRUX0lQQUNDX1JMQ19DRkdfMiwgMCwgNSwKKwkJMHgwMCwgMjUwLAkvKiBUIGRvd25saW5rIFRCRiBleHRlbnNpb24gKDAuLjUwMCkgKi8KKwkJMHgwMCwgMjUwLAkvKiBUIHVwbGluayBUQkYgZXh0ZW5zaW9uICgwLi41MDApICovCisJCTIsCS8qIENTMiAqLworI2lmIDAKKwkvKiBFREdFIG1vZGVsIG9ubHksIGJyZWFrcyBvbGRlciBtb2RlbHMuCisJICogU2hvdWxkIGlucXVpcmUgdGhlIEJUUyBjYXBhYmlsaXRpZXMgKi8KKwlOTV9BVFRfSVBBQ0NfUkxDX0NGR18zLCAwLCAxLAorCQkyLAkvKiBNQ1MyICovCisjZW5kaWYKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG5hbm9idHNfYXR0cl9uc3ZjMFtdID0geworCU5NX0FUVF9JUEFDQ19OU1ZDSSwgMCwgMiwgIDB4MDMsIDB4OWQsIC8qIDkyNSAqLworCU5NX0FUVF9JUEFDQ19OU19MSU5LX0NGRywgMCwgOCwKKwkJMHg1OSwgMHhkOCwgLyogcmVtb3RlIHVkcCBwb3J0ICgyMzAwMCkgKi8KKwkJMTkyLCAxNjgsIDEwMCwgMTEsIC8qIHJlbW90ZSBpcCBhZGRyZXNzICovCisJCTB4NTksIDB4ZDgsIC8qIGxvY2FsIHVkcCBwb3J0ICgyMzAwMCkgKi8KK307CisKKy8qIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuZXZlciB3ZSBnZXQgYSBHU00gMTIuMjEgc3RhdGUgY2hhbmdlIGV2ZW50ICovCitpbnQgbm1fc3RhdGVfZXZlbnQoZW51bSBubV9ldnQgZXZ0LCB1X2ludDhfdCBvYmpfY2xhc3MsIHZvaWQgKm9iaiwKKwkJICAgc3RydWN0IGdzbV9ubV9zdGF0ZSAqb2xkX3N0YXRlLCBzdHJ1Y3QgZ3NtX25tX3N0YXRlICpuZXdfc3RhdGUpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzOworCXN0cnVjdCBnc21fYnRzX2dwcnNfbnN2YyAqbnN2YzsKKworCS8qIFRoaXMgZXZlbnQtZHJpdmVuIEJUUyBzZXR1cCBpcyBjdXJyZW50bHkgb25seSByZXF1aXJlZCBvbiBuYW5vQlRTICovCisKKwkvKiBFVlRfU1RBVEVDSEdfQURNIGlzIGNhbGxlZCBhZnRlciB3ZSBjYWxsIGNoZ19hZG1fc3RhdGUoKSBhbmQgd291bGQgY3JlYXRlCisJICogZW5kbGVzcyBsb29wICovCisJaWYgKGV2dCAhPSBFVlRfU1RBVEVDSEdfT1BFUikKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKG9ial9jbGFzcykgeworCWNhc2UgTk1fT0NfU0lURV9NQU5BR0VSOgorCQlidHMgPSBjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgZ3NtX2J0cywgc2l0ZV9tZ3IpOworCQlpZiAoKG5ld19zdGF0ZS0+b3BlcmF0aW9uYWwgPT0gMiAmJgorCQkgICAgIG5ld19zdGF0ZS0+YXZhaWxhYmlsaXR5ID09IE5NX0FWU1RBVEVfT0spIHx8CisJCSAgICAobmV3X3N0YXRlLT5vcGVyYXRpb25hbCA9PSAxICYmCisJCSAgICAgbmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gTk1fQVZTVEFURV9PRkZfTElORSkpCisJCQlhYmlzX25tX29wc3RhcnQoYnRzLCBvYmpfY2xhc3MsIDB4ZmYsIDB4ZmYsIDB4ZmYpOworCQlicmVhazsKKwljYXNlIE5NX09DX0JUUzoKKwkJYnRzID0gb2JqOworCQlpZiAobmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gTk1fQVZTVEFURV9ERVBFTkRFTkNZKSB7CisJCQlwYXRjaF9ubV90YWJsZXMoYnRzKTsKKwkJCWFiaXNfbm1fc2V0X2J0c19hdHRyKGJ0cywgbmFub2J0c19hdHRyX2J0cywKKwkJCQkJICAgICBzaXplb2YobmFub2J0c19hdHRyX2J0cykpOworCQkJYWJpc19ubV9jaGdfYWRtX3N0YXRlKGJ0cywgb2JqX2NsYXNzLAorCQkJCQkgICAgICBidHMtPmJ0c19uciwgMHhmZiwgMHhmZiwKKwkJCQkJICAgICAgTk1fU1RBVEVfVU5MT0NLRUQpOworCQkJYWJpc19ubV9vcHN0YXJ0KGJ0cywgb2JqX2NsYXNzLAorCQkJCQlidHMtPmJ0c19uciwgMHhmZiwgMHhmZik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19DSEFOTkVMOgorCQl0cyA9IG9iajsKKwkJdHJ4ID0gdHMtPnRyeDsKKwkJaWYgKG5ld19zdGF0ZS0+b3BlcmF0aW9uYWwgPT0gMSAmJgorCQkgICAgbmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gTk1fQVZTVEFURV9ERVBFTkRFTkNZKSB7CisJCQlwYXRjaF9ubV90YWJsZXModHJ4LT5idHMpOworCQkJZW51bSBhYmlzX25tX2NoYW5fY29tYiBjY29tYiA9CisJCQkJCQlhYmlzX25tX2NoY29tYjRwY2hhbih0cy0+cGNoYW4pOworCQkJYWJpc19ubV9zZXRfY2hhbm5lbF9hdHRyKHRzLCBjY29tYik7CisJCQlhYmlzX25tX2NoZ19hZG1fc3RhdGUodHJ4LT5idHMsIG9ial9jbGFzcywKKwkJCQkJICAgICAgdHJ4LT5idHMtPmJ0c19uciwgdHJ4LT5uciwgdHMtPm5yLAorCQkJCQkgICAgICBOTV9TVEFURV9VTkxPQ0tFRCk7CisJCQlhYmlzX25tX29wc3RhcnQodHJ4LT5idHMsIG9ial9jbGFzcywKKwkJCQkJdHJ4LT5idHMtPmJ0c19uciwgdHJ4LT5uciwgdHMtPm5yKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5NX09DX1JBRElPX0NBUlJJRVI6CisJCXRyeCA9IG9iajsKKwkJaWYgKG5ld19zdGF0ZS0+b3BlcmF0aW9uYWwgPT0gMSAmJgorCQkgICAgbmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gTk1fQVZTVEFURV9PSykKKwkJCWFiaXNfbm1fb3BzdGFydCh0cngtPmJ0cywgb2JqX2NsYXNzLCB0cngtPmJ0cy0+YnRzX25yLAorCQkJCQl0cngtPm5yLCAweGZmKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19HUFJTX05TRToKKwkJYnRzID0gY29udGFpbmVyX29mKG9iaiwgc3RydWN0IGdzbV9idHMsIGdwcnMubnNlKTsKKwkJaWYgKGJ0cy0+Z3Bycy5tb2RlID09IEJUU19HUFJTX05PTkUpCisJCQlicmVhazsKKwkJaWYgKG5ld19zdGF0ZS0+YXZhaWxhYmlsaXR5ID09IDUpIHsKKwkJCWFiaXNfbm1faXBhY2Nlc3Nfc2V0X2F0dHIoYnRzLCBvYmpfY2xhc3MsIGJ0cy0+YnRzX25yLAorCQkJCQkJICAweGZmLCAweGZmLCBuYW5vYnRzX2F0dHJfbnNlLAorCQkJCQkJICBzaXplb2YobmFub2J0c19hdHRyX25zZSkpOworCQkJYWJpc19ubV9vcHN0YXJ0KGJ0cywgb2JqX2NsYXNzLCBidHMtPmJ0c19uciwKKwkJCQkJMHhmZiwgMHhmZik7CisJCQlhYmlzX25tX2NoZ19hZG1fc3RhdGUoYnRzLCBvYmpfY2xhc3MsIGJ0cy0+YnRzX25yLAorCQkJCQkgICAgICAweGZmLCAweGZmLCBOTV9TVEFURV9VTkxPQ0tFRCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19HUFJTX0NFTEw6CisJCWJ0cyA9IGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBnc21fYnRzLCBncHJzLmNlbGwpOworCQlpZiAoYnRzLT5ncHJzLm1vZGUgPT0gQlRTX0dQUlNfTk9ORSkKKwkJCWJyZWFrOworCQlpZiAobmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gNSkgeworCQkJYWJpc19ubV9pcGFjY2Vzc19zZXRfYXR0cihidHMsIG9ial9jbGFzcywgYnRzLT5idHNfbnIsCisJCQkJCQkgIDAsIDB4ZmYsIG5hbm9idHNfYXR0cl9jZWxsLAorCQkJCQkJICBzaXplb2YobmFub2J0c19hdHRyX2NlbGwpKTsKKwkJCWFiaXNfbm1fb3BzdGFydChidHMsIG9ial9jbGFzcywgYnRzLT5idHNfbnIsCisJCQkJCTAsIDB4ZmYpOworCQkJYWJpc19ubV9jaGdfYWRtX3N0YXRlKGJ0cywgb2JqX2NsYXNzLCBidHMtPmJ0c19uciwKKwkJCQkJICAgICAgMCwgMHhmZiwgTk1fU1RBVEVfVU5MT0NLRUQpOworCQl9CisJCWJyZWFrOworCWNhc2UgTk1fT0NfR1BSU19OU1ZDOgorCQluc3ZjID0gb2JqOworCQlidHMgPSBuc3ZjLT5idHM7CisJCWlmIChidHMtPmdwcnMubW9kZSA9PSBCVFNfR1BSU19OT05FKQorCQkJYnJlYWs7CisJCS8qIFdlIHNraXAgTlNWQzEgc2luY2Ugd2Ugb25seSB1c2UgTlNWQzAgKi8KKwkJaWYgKG5zdmMtPmlkID09IDEpCisJCQlicmVhazsKKwkJaWYgKG5ld19zdGF0ZS0+YXZhaWxhYmlsaXR5ID09IE5NX0FWU1RBVEVfT0ZGX0xJTkUpIHsKKwkJCWFiaXNfbm1faXBhY2Nlc3Nfc2V0X2F0dHIoYnRzLCBvYmpfY2xhc3MsIGJ0cy0+YnRzX25yLAorCQkJCQkJICBuc3ZjLT5pZCwgMHhmZiwKKwkJCQkJCSAgbmFub2J0c19hdHRyX25zdmMwLAorCQkJCQkJICBzaXplb2YobmFub2J0c19hdHRyX25zdmMwKSk7CisJCQlhYmlzX25tX29wc3RhcnQoYnRzLCBvYmpfY2xhc3MsIGJ0cy0+YnRzX25yLAorCQkJCQluc3ZjLT5pZCwgMHhmZik7CisJCQlhYmlzX25tX2NoZ19hZG1fc3RhdGUoYnRzLCBvYmpfY2xhc3MsIGJ0cy0+YnRzX25yLAorCQkJCQkgICAgICBuc3ZjLT5pZCwgMHhmZiwKKwkJCQkJICAgICAgTk1fU1RBVEVfVU5MT0NLRUQpOworCQl9CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCisvKiBDYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgZXZlcnkgdGltZSB3ZSByZWNlaXZlIGEgMTIuMjEgU1cgYWN0aXZhdGVkIHJlcG9ydCAqLworc3RhdGljIGludCBzd19hY3Rpdl9yZXAoc3RydWN0IG1zZ2IgKm1iKQoreworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaCA9IG1zZ2JfbDMobWIpOworCXN0cnVjdCBnc21fYnRzICpidHMgPSBtYi0+dHJ4LT5idHM7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCBmb2gtPm9ial9pbnN0LnRyeF9ucik7CisKKwlpZiAoIXRyeCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKGZvaC0+b2JqX2NsYXNzKSB7CisJY2FzZSBOTV9PQ19CQVNFQl9UUkFOU0M6CisJCWFiaXNfbm1fY2hnX2FkbV9zdGF0ZSh0cngtPmJ0cywgZm9oLT5vYmpfY2xhc3MsCisJCQkJICAgICAgdHJ4LT5idHMtPmJ0c19uciwgdHJ4LT5uciwgMHhmZiwKKwkJCQkgICAgICBOTV9TVEFURV9VTkxPQ0tFRCk7CisJCWFiaXNfbm1fb3BzdGFydCh0cngtPmJ0cywgZm9oLT5vYmpfY2xhc3MsCisJCQkJdHJ4LT5idHMtPmJ0c19uciwgdHJ4LT5uciwgMHhmZik7CisJCS8qIFRSWCBzb2Z0d2FyZSBpcyBhY3RpdmUsIHRlbGwgaXQgdG8gaW5pdGlhdGUgUlNMIExpbmsgKi8KKwkJYWJpc19ubV9pcGFjY2Vzc19yc2xfY29ubmVjdCh0cngsIDAsIDMwMDMsIHRyeC0+cnNsX3RlaSk7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfUkFESU9fQ0FSUklFUjogeworCQkvKgorCQkgKiBMb2NraW5nIHRoZSByYWRpbyBjYXJyaWVyIHdpbGwgbWFrZSBpdCBnbworCQkgKiBvZmZsaW5lIGFnYWluIGFuZCB3ZSB3b3VsZCBjb21lIGhlcmUuIFRoZQorCQkgKiBmcmFtZXdvcmsgc2hvdWxkIGRldGVybWluZSB0aGF0IHRoZXJlIHdhcworCQkgKiBubyBjaGFuZ2UgYW5kIGF2b2lkIHJlY3Vyc2lvbi4KKwkJICoKKwkJICogVGhpcyBjb2RlIGlzIGhlcmUgdG8gbWFrZSBzdXJlIHRoYXQgb24gc3RhcnQKKwkJICogYSBUUlggcmVtYWlucyBsb2NrZWQuCisJCSAqLworCQlpbnQgcmNfc3RhdGUgPSB0cngtPm5tX3N0YXRlLmFkbWluaXN0cmF0aXZlOworCQkvKiBQYXRjaCBBUkZDTiBpbnRvIHJhZGlvIGF0dHJpYnV0ZSAqLworCQluYW5vYnRzX2F0dHJfcmFkaW9bNV0gJj0gMHhmMDsKKwkJbmFub2J0c19hdHRyX3JhZGlvWzVdIHw9IHRyeC0+YXJmY24gPj4gODsKKwkJbmFub2J0c19hdHRyX3JhZGlvWzZdID0gdHJ4LT5hcmZjbiAmIDB4ZmY7CisJCWFiaXNfbm1fc2V0X3JhZGlvX2F0dHIodHJ4LCBuYW5vYnRzX2F0dHJfcmFkaW8sCisJCQkJICAgICAgIHNpemVvZihuYW5vYnRzX2F0dHJfcmFkaW8pKTsKKwkJYWJpc19ubV9jaGdfYWRtX3N0YXRlKHRyeC0+YnRzLCBmb2gtPm9ial9jbGFzcywKKwkJCQkgICAgICB0cngtPmJ0cy0+YnRzX25yLCB0cngtPm5yLCAweGZmLAorCQkJCSAgICAgIHJjX3N0YXRlKTsKKwkJYWJpc19ubV9vcHN0YXJ0KHRyeC0+YnRzLCBmb2gtPm9ial9jbGFzcywgdHJ4LT5idHMtPmJ0c19uciwKKwkJCQl0cngtPm5yLCAweGZmKTsKKwkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBOQUNLIG9uIHRoZSBPTUwgTk0gKi8KK3N0YXRpYyBpbnQgb21sX21zZ19uYWNrKHVfaW50OF90IG10KQoreworCWlmIChtdCA9PSBOTV9NVF9TRVRfQlRTX0FUVFJfTkFDSykgeworCQlMT0dQKEROTSwgTE9HTF9GQVRBTCwgIkZhaWxlZCB0byBzZXQgQlRTIGF0dHJpYnV0ZXMuIFRoYXQgaXMgZmF0YWwuICIKKwkJCQkiV2FzIHRoZSBidHMgdHlwZSBhbmQgZnJlcXVlbmN5IHByb3Blcmx5IHNwZWNpZmllZD9cbiIpOworCQlleGl0KC0xKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgd2UgcmVjZWl2ZSBhIHNpZ25hbCBmcm9tIE5NICovCitzdGF0aWMgaW50IG5tX3NpZ19jYih1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgc2lnbmFsLAorCQkgICAgIHZvaWQgKmhhbmRsZXJfZGF0YSwgdm9pZCAqc2lnbmFsX2RhdGEpCit7CisJdV9pbnQ4X3QgKm1zZ190eXBlOworCisJc3dpdGNoIChzaWduYWwpIHsKKwljYXNlIFNfTk1fU1dfQUNUSVZfUkVQOgorCQlyZXR1cm4gc3dfYWN0aXZfcmVwKHNpZ25hbF9kYXRhKTsKKwljYXNlIFNfTk1fTkFDSzoKKwkJbXNnX3R5cGUgPSBzaWduYWxfZGF0YTsKKwkJcmV0dXJuIG9tbF9tc2dfbmFjaygqbXNnX3R5cGUpOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYm9vdHN0cmFwX29tX25hbm9idHMoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwkvKiBXZSBkb24ndCBkbyBjYWxsYmFjayBiYXNlZCBib290c3RyYXBwaW5nLCBidXQgZXZlbnQgZHJpdmVuIChzZWUgYWJvdmUpICovCit9CisKK3N0YXRpYyB2b2lkIG5tX3JlY29uZmlnX3RzKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMpCit7CisJZW51bSBhYmlzX25tX2NoYW5fY29tYiBjY29tYiA9IGFiaXNfbm1fY2hjb21iNHBjaGFuKHRzLT5wY2hhbik7CisJc3RydWN0IGdzbV9lMV9zdWJzbG90ICplMWwgPSAmdHMtPmUxX2xpbms7CisKKwlhYmlzX25tX3NldF9jaGFubmVsX2F0dHIodHMsIGNjb21iKTsKKworCWlmIChpc19pcGFjY2Vzc19idHModHMtPnRyeC0+YnRzKSkKKwkJcmV0dXJuOworCisJc3dpdGNoICh0cy0+cGNoYW4pIHsKKwljYXNlIEdTTV9QQ0hBTl9UQ0hfRjoKKwljYXNlIEdTTV9QQ0hBTl9UQ0hfSDoKKwkJYWJpc19ubV9jb25uX3RlcnJfdHJhZih0cywgZTFsLT5lMV9uciwgZTFsLT5lMV90cywKKwkJCQkJZTFsLT5lMV90c19zcyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgbm1fcmVjb25maWdfdHJ4KHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KQoreworCXN0cnVjdCBnc21fZTFfc3Vic2xvdCAqZTFsID0gJnRyeC0+cnNsX2UxX2xpbms7CisJaW50IGk7CisKKwlwYXRjaF9ubV90YWJsZXModHJ4LT5idHMpOworCisJc3dpdGNoICh0cngtPmJ0cy0+dHlwZSkgeworCWNhc2UgR1NNX0JUU19UWVBFX0JTMTE6CisJCS8qIEZJWE1FOiBkaXNjb3ZlciB0aGlzIGJ5IGZldGNoaW5nIGFuIGF0dHJpYnV0ZSAqLworI2lmIDAKKwkJdHJ4LT5ub21pbmFsX3Bvd2VyID0gMTU7IC8qIDE1ZEJtID09IDMwbVcgUEEgY29uZmlndXJhdGlvbiAqLworI2Vsc2UKKwkJdHJ4LT5ub21pbmFsX3Bvd2VyID0gMjQ7IC8qIDI0ZEJtID09IDI1MG1XIFBBIGNvbmZpZ3VyYXRpb24gKi8KKyNlbmRpZgorCQlhYmlzX25tX2Nvbm5fdGVycl9zaWduKHRyeCwgZTFsLT5lMV9uciwgZTFsLT5lMV90cywKKwkJCQkJZTFsLT5lMV90c19zcyk7CisJCWFiaXNfbm1fZXN0YWJsaXNoX3RlaSh0cngtPmJ0cywgdHJ4LT5uciwgZTFsLT5lMV9uciwKKwkJCQkgICAgICBlMWwtPmUxX3RzLCBlMWwtPmUxX3RzX3NzLCB0cngtPnJzbF90ZWkpOworCisJCS8qIFNldCBSYWRpbyBBdHRyaWJ1dGVzICovCisJCWlmICh0cnggPT0gdHJ4LT5idHMtPmMwKQorCQkJYWJpc19ubV9zZXRfcmFkaW9fYXR0cih0cngsIGJzMTFfYXR0cl9yYWRpbywKKwkJCQkJICAgICAgIHNpemVvZihiczExX2F0dHJfcmFkaW8pKTsKKwkJZWxzZSB7CisJCQl1X2ludDhfdCB0cngxX2F0dHJfcmFkaW9bc2l6ZW9mKGJzMTFfYXR0cl9yYWRpbyldOworCQkJdV9pbnQ4X3QgYXJmY25fbG93ID0gdHJ4LT5hcmZjbiAmIDB4ZmY7CisJCQl1X2ludDhfdCBhcmZjbl9oaWdoID0gKHRyeC0+YXJmY24gPj4gOCkgJiAweDBmOworCQkJbWVtY3B5KHRyeDFfYXR0cl9yYWRpbywgYnMxMV9hdHRyX3JhZGlvLAorCQkJCXNpemVvZih0cngxX2F0dHJfcmFkaW8pKTsKKworCQkJLyogcGF0Y2ggQVJGQ04gaW50byBUUlggQXR0cmlidXRlcyAqLworCQkJdHJ4MV9hdHRyX3JhZGlvWzJdICY9IDB4ZjA7CisJCQl0cngxX2F0dHJfcmFkaW9bMl0gfD0gYXJmY25faGlnaDsKKwkJCXRyeDFfYXR0cl9yYWRpb1szXSA9IGFyZmNuX2xvdzsKKworCQkJYWJpc19ubV9zZXRfcmFkaW9fYXR0cih0cngsIHRyeDFfYXR0cl9yYWRpbywKKwkJCQkJICAgICAgIHNpemVvZih0cngxX2F0dHJfcmFkaW8pKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEdTTV9CVFNfVFlQRV9OQU5PQlRTOgorCQlzd2l0Y2ggKHRyeC0+YnRzLT5iYW5kKSB7CisJCWNhc2UgR1NNX0JBTkRfODUwOgorCQljYXNlIEdTTV9CQU5EXzkwMDoKKwkJCXRyeC0+bm9taW5hbF9wb3dlciA9IDIwOworCQkJYnJlYWs7CisJCWNhc2UgR1NNX0JBTkRfMTgwMDoKKwkJY2FzZSBHU01fQkFORF8xOTAwOgorCQkJdHJ4LT5ub21pbmFsX3Bvd2VyID0gMjM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiVW5zdXBwb3J0ZWQgbmFub0JUUyBHU00gYmFuZCAlc1xuIiwKKwkJCQlnc21fYmFuZF9uYW1lKHRyeC0+YnRzLT5iYW5kKSk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgVFJYX05SX1RTOyBpKyspCisJCW5tX3JlY29uZmlnX3RzKCZ0cngtPnRzW2ldKTsKK30KKworc3RhdGljIHZvaWQgbm1fcmVjb25maWdfYnRzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisKKwlzd2l0Y2ggKGJ0cy0+dHlwZSkgeworCWNhc2UgR1NNX0JUU19UWVBFX0JTMTE6CisJCXBhdGNoX25tX3RhYmxlcyhidHMpOworCQlhYmlzX25tX3Jhd19tc2coYnRzLCBzaXplb2YobXNnXzEpLCBtc2dfMSk7IC8qIHNldCBCVFMgU2l0ZU1nciBhdHRyKi8KKwkJYWJpc19ubV9zZXRfYnRzX2F0dHIoYnRzLCBiczExX2F0dHJfYnRzLCBzaXplb2YoYnMxMV9hdHRyX2J0cykpOworCQlhYmlzX25tX3Jhd19tc2coYnRzLCBzaXplb2YobXNnXzMpLCBtc2dfMyk7IC8qIHNldCBCVFMgaGFuZG92ZXIgYXR0ciAqLworCQlhYmlzX25tX3Jhd19tc2coYnRzLCBzaXplb2YobXNnXzQpLCBtc2dfNCk7IC8qIHNldCBCVFMgcG93ZXIgY29udHJvbCBhdHRyICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyeCwgJmJ0cy0+dHJ4X2xpc3QsIGxpc3QpCisJCW5tX3JlY29uZmlnX3RyeCh0cngpOworfQorCitzdGF0aWMgdm9pZCBib290c3RyYXBfb21fYnMxMShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCS8qIHN0b3Agc2VuZGluZyBldmVudCByZXBvcnRzICovCisJYWJpc19ubV9ldmVudF9yZXBvcnRzKGJ0cywgMCk7CisKKwkvKiBiZWdpbiBEQiB0cmFuc21pc3Npb24gKi8KKwlhYmlzX25tX2JzMTFfZGJfdHJhbnNtaXNzaW9uKGJ0cywgMSk7CisKKwkvKiBlbmQgREIgdHJhbnNtaXNzaW9uICovCisJYWJpc19ubV9iczExX2RiX3RyYW5zbWlzc2lvbihidHMsIDApOworCisJLyogUmVzZXQgQlRTIFNpdGUgbWFuYWdlciByZXNvdXJjZSAqLworCWFiaXNfbm1fYnMxMV9yZXNldF9yZXNvdXJjZShidHMpOworCisJLyogYmVnaW4gREIgdHJhbnNtaXNzaW9uICovCisJYWJpc19ubV9iczExX2RiX3RyYW5zbWlzc2lvbihidHMsIDEpOworCisJLyogcmVjb25maWd1cmUgQlRTIHdpdGggYWxsIFRSWCBhbmQgYWxsIFRTICovCisJbm1fcmVjb25maWdfYnRzKGJ0cyk7CisKKwkvKiBlbmQgREIgdHJhbnNtaXNzaW9uICovCisJYWJpc19ubV9iczExX2RiX3RyYW5zbWlzc2lvbihidHMsIDApOworCisJLyogUmVzZXQgQlRTIFNpdGUgbWFuYWdlciByZXNvdXJjZSAqLworCWFiaXNfbm1fYnMxMV9yZXNldF9yZXNvdXJjZShidHMpOworCisJLyogcmVzdGFydCBzZW5kaW5nIGV2ZW50IHJlcG9ydHMgKi8KKwlhYmlzX25tX2V2ZW50X3JlcG9ydHMoYnRzLCAxKTsKK30KKworc3RhdGljIHZvaWQgYm9vdHN0cmFwX29tKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJTE9HUChETk0sIExPR0xfTk9USUNFLCAiYm9vdHN0cmFwcGluZyBPTUwgZm9yIEJUUyAldVxuIiwgYnRzLT5ucik7CisKKwlzd2l0Y2ggKGJ0cy0+dHlwZSkgeworCWNhc2UgR1NNX0JUU19UWVBFX0JTMTE6CisJCWJvb3RzdHJhcF9vbV9iczExKGJ0cyk7CisJCWJyZWFrOworCWNhc2UgR1NNX0JUU19UWVBFX05BTk9CVFM6CisJCWJvb3RzdHJhcF9vbV9uYW5vYnRzKGJ0cyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiVW5hYmxlIHRvIGJvb3RzdHJhcCBPTUw6IFVua25vd24gQlRTIHR5cGUgJWRcbiIsIGJ0cy0+dHlwZSk7CisJfQorfQorCitzdGF0aWMgaW50IHNodXRkb3duX29tKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJTE9HUChETk0sIExPR0xfTk9USUNFLCAic2h1dHRpbmcgZG93biBPTUwgZm9yIEJUUyAldVxuIiwgYnRzLT5ucik7CisKKwkvKiBzdG9wIHNlbmRpbmcgZXZlbnQgcmVwb3J0cyAqLworCWFiaXNfbm1fZXZlbnRfcmVwb3J0cyhidHMsIDApOworCisJLyogYmVnaW4gREIgdHJhbnNtaXNzaW9uICovCisJYWJpc19ubV9iczExX2RiX3RyYW5zbWlzc2lvbihidHMsIDEpOworCisJLyogZW5kIERCIHRyYW5zbWlzc2lvbiAqLworCWFiaXNfbm1fYnMxMV9kYl90cmFuc21pc3Npb24oYnRzLCAwKTsKKworCS8qIFJlc2V0IEJUUyBTaXRlIG1hbmFnZXIgcmVzb3VyY2UgKi8KKwlhYmlzX25tX2JzMTFfcmVzZXRfcmVzb3VyY2UoYnRzKTsKKworCXJldHVybiAwOworfQorCitpbnQgYnNjX3NodXRkb3duX25ldChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCkKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoYnRzLCAmbmV0LT5idHNfbGlzdCwgbGlzdCkgeworCQlpbnQgcmM7CisJCXJjID0gc2h1dGRvd25fb20oYnRzKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogc2V0IGFsbCBzeXN0ZW0gaW5mb3JtYXRpb24gdHlwZXMgKi8KK3N0YXRpYyBpbnQgc2V0X3N5c3RlbV9pbmZvcyhzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwlpbnQgaSwgcmM7CisJdV9pbnQ4X3Qgc2lfdG1wWzIzXTsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdHJ4LT5idHM7CisKKwlidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIubXNfdHhwd3JfbWF4X2NjY2ggPQorCQkJbXNfcHdyX2N0bF9sdmwoYnRzLT5iYW5kLCBidHMtPm1zX21heF9wb3dlcik7CisJYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyLm5lY2kgPSBidHMtPm5ldHdvcmstPm5lY2k7CisKKwlpZiAodHJ4ID09IHRyeC0+YnRzLT5jMCkgeworCQlmb3IgKGkgPSAxOyBpIDw9IDQ7IGkrKykgeworCQkJcmMgPSBnc21fZ2VuZXJhdGVfc2koc2lfdG1wLCB0cngtPmJ0cywgaSk7CisJCQlpZiAocmMgPCAwKQorCQkJCWdvdG8gZXJyX291dDsKKwkJCURFQlVHUChEUlIsICJTSSUydTogJXNcbiIsIGksIGhleGR1bXAoc2lfdG1wLCByYykpOworCQkJcnNsX2JjY2hfaW5mbyh0cngsIGksIHNpX3RtcCwgc2l6ZW9mKHNpX3RtcCkpOworCQl9CisJCWlmIChidHMtPmdwcnMubW9kZSAhPSBCVFNfR1BSU19OT05FKSB7CisJCQlpID0gMTM7CisJCQlyYyA9IGdzbV9nZW5lcmF0ZV9zaShzaV90bXAsIHRyeC0+YnRzLCBSU0xfU1lTVEVNX0lORk9fMTMpOworCQkJaWYgKHJjIDwgMCkKKwkJCQlnb3RvIGVycl9vdXQ7CisJCQlERUJVR1AoRFJSLCAiU0klMnU6ICVzXG4iLCBpLCBoZXhkdW1wKHNpX3RtcCwgcmMpKTsKKwkJCXJzbF9iY2NoX2luZm8odHJ4LCBSU0xfU1lTVEVNX0lORk9fMTMsIHNpX3RtcCwgcmMpOworCQl9CisJfQorCisJaSA9IDU7CisJcmMgPSBnc21fZ2VuZXJhdGVfc2koc2lfdG1wLCB0cngtPmJ0cywgUlNMX1NZU1RFTV9JTkZPXzUpOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyX291dDsKKwlERUJVR1AoRFJSLCAiU0klMnU6ICVzXG4iLCBpLCBoZXhkdW1wKHNpX3RtcCwgcmMpKTsKKwlyc2xfc2FjY2hfZmlsbGluZyh0cngsIFJTTF9TWVNURU1fSU5GT181LCBzaV90bXAsIHJjKTsKKworCWkgPSA2OworCXJjID0gZ3NtX2dlbmVyYXRlX3NpKHNpX3RtcCwgdHJ4LT5idHMsIFJTTF9TWVNURU1fSU5GT182KTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGVycl9vdXQ7CisJREVCVUdQKERSUiwgIlNJJTJ1OiAlc1xuIiwgaSwgaGV4ZHVtcChzaV90bXAsIHJjKSk7CisJcnNsX3NhY2NoX2ZpbGxpbmcodHJ4LCBSU0xfU1lTVEVNX0lORk9fNiwgc2lfdG1wLCByYyk7CisKKwlyZXR1cm4gMDsKK2Vycl9vdXQ6CisJTE9HUChEUlIsIExPR0xfRVJST1IsICJDYW5ub3QgZ2VuZXJhdGUgU0kgJXUgZm9yIEJUUyAldSwgbW9zdCBsaWtlbHkgIgorCQkiYSBwcm9ibGVtIHdpdGggbmVpZ2hib3IgY2VsbCBsaXN0IGdlbmVyYXRpb25cbiIsCisJCWksIHRyeC0+YnRzLT5ucik7CisJcmV0dXJuIHJjOworfQorCisvKgorICogUGF0Y2ggdGhlIHZhcmlvdXMgU1lTVEVNIElORk9STUFUSU9OIHRhYmxlcyB0byB1cGRhdGUKKyAqIHRoZSBMQUkKKyAqLworc3RhdGljIHZvaWQgcGF0Y2hfbm1fdGFibGVzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJdV9pbnQ4X3QgYXJmY25fbG93ID0gYnRzLT5jMC0+YXJmY24gJiAweGZmOworCXVfaW50OF90IGFyZmNuX2hpZ2ggPSAoYnRzLT5jMC0+YXJmY24gPj4gOCkgJiAweDBmOworCisJLyogcGF0Y2ggQVJGQ04gaW50byBCVFMgQXR0cmlidXRlcyAqLworCWJzMTFfYXR0cl9idHNbNjldICY9IDB4ZjA7CisJYnMxMV9hdHRyX2J0c1s2OV0gfD0gYXJmY25faGlnaDsKKwliczExX2F0dHJfYnRzWzcwXSA9IGFyZmNuX2xvdzsKKwluYW5vYnRzX2F0dHJfYnRzWzQyXSAmPSAweGYwOworCW5hbm9idHNfYXR0cl9idHNbNDJdIHw9IGFyZmNuX2hpZ2g7CisJbmFub2J0c19hdHRyX2J0c1s0M10gPSBhcmZjbl9sb3c7CisKKwkvKiBwYXRjaCBBUkZDTiBpbnRvIFRSWCBBdHRyaWJ1dGVzICovCisJYnMxMV9hdHRyX3JhZGlvWzJdICY9IDB4ZjA7CisJYnMxMV9hdHRyX3JhZGlvWzJdIHw9IGFyZmNuX2hpZ2g7CisJYnMxMV9hdHRyX3JhZGlvWzNdID0gYXJmY25fbG93OworCisJLyogcGF0Y2ggdGhlIFJBQ0ggYXR0cmlidXRlcyAqLworCWlmIChidHMtPnJhY2hfYl90aHJlc2ggIT0gLTEpIHsKKwkJbmFub2J0c19hdHRyX2J0c1szM10gPSBidHMtPnJhY2hfYl90aHJlc2ggJiAweGZmOworCQliczExX2F0dHJfYnRzWzMzXSA9IGJ0cy0+cmFjaF9iX3RocmVzaCAmIDB4ZmY7CisJfQorCisJaWYgKGJ0cy0+cmFjaF9sZGF2Z19zbG90cyAhPSAtMSkgeworCQl1X2ludDhfdCBhdmdfaGlnaCA9IGJ0cy0+cmFjaF9sZGF2Z19zbG90cyAmIDB4ZmY7CisJCXVfaW50OF90IGF2Z19sb3cgPSAoYnRzLT5yYWNoX2xkYXZnX3Nsb3RzID4+IDgpICYgMHgwZjsKKworCQluYW5vYnRzX2F0dHJfYnRzWzM1XSA9IGF2Z19oaWdoOworCQluYW5vYnRzX2F0dHJfYnRzWzM2XSA9IGF2Z19sb3c7CisJCWJzMTFfYXR0cl9idHNbMzVdID0gYXZnX2hpZ2g7CisJCWJzMTFfYXR0cl9idHNbMzZdID0gYXZnX2xvdzsKKwl9CisKKwkvKiBwYXRjaCBCU0lDICovCisJYnMxMV9hdHRyX2J0c1sxXSA9IGJ0cy0+YnNpYzsKKwluYW5vYnRzX2F0dHJfYnRzW3NpemVvZihuYW5vYnRzX2F0dHJfYnRzKS0xMV0gPSBidHMtPmJzaWM7CisKKwkvKiBwYXRjaCBDR0kgKi8KKwlhYmlzX25tX2lwYWNjZXNzX2NnaShuYW5vYnRzX2F0dHJfYnRzK3NpemVvZihuYW5vYnRzX2F0dHJfYnRzKS03LCBidHMpOworCisJLyogcGF0Y2ggdGhlIHBvd2VyIHJlZHVjdGlvbiAqLworCWJzMTFfYXR0cl9yYWRpb1s1XSA9IGJ0cy0+YzAtPm1heF9wb3dlcl9yZWQgLyAyOworCW5hbm9idHNfYXR0cl9yYWRpb1sxXSA9IGJ0cy0+YzAtPm1heF9wb3dlcl9yZWQgLyAyOworCisJLyogcGF0Y2ggTlNFSSAqLworCW5hbm9idHNfYXR0cl9uc2VbM10gPSBidHMtPmdwcnMubnNlLm5zZWkgPj4gODsKKwluYW5vYnRzX2F0dHJfbnNlWzRdID0gYnRzLT5ncHJzLm5zZS5uc2VpICYgMHhmZjsKKworCS8qIHBhdGNoIE5TVkNJICovCisJbmFub2J0c19hdHRyX25zdmMwWzNdID0gYnRzLT5ncHJzLm5zdmNbMF0ubnN2Y2kgPj4gODsKKwluYW5vYnRzX2F0dHJfbnN2YzBbNF0gPSBidHMtPmdwcnMubnN2Y1swXS5uc3ZjaSAmIDB4ZmY7CisKKwkvKiBwYXRjaCBJUCBhZGRyZXNzIGFzIFNHU04gSVAgKi8KKwkqKHVfaW50MTZfdCAqKShuYW5vYnRzX2F0dHJfbnN2YzArOCkgPQorCQkJCWh0b25zKGJ0cy0+Z3Bycy5uc3ZjWzBdLnJlbW90ZV9wb3J0KTsKKwkqKHVfaW50MzJfdCAqKShuYW5vYnRzX2F0dHJfbnN2YzArMTApID0KKwkJCQlodG9ubChidHMtPmdwcnMubnN2Y1swXS5yZW1vdGVfaXApOworCSoodV9pbnQxNl90ICopKG5hbm9idHNfYXR0cl9uc3ZjMCsxNCkgPQorCQkJCWh0b25zKGJ0cy0+Z3Bycy5uc3ZjWzBdLmxvY2FsX3BvcnQpOworCisJLyogcGF0Y2ggQlZDSSAqLworCW5hbm9idHNfYXR0cl9jZWxsWzEyXSA9IGJ0cy0+Z3Bycy5jZWxsLmJ2Y2kgPj4gODsKKwluYW5vYnRzX2F0dHJfY2VsbFsxM10gPSBidHMtPmdwcnMuY2VsbC5idmNpICYgMHhmZjsKKwkvKiBwYXRjaCBSQUMgKi8KKwluYW5vYnRzX2F0dHJfY2VsbFszXSA9IGJ0cy0+Z3Bycy5yYWM7CisKKwlpZiAoYnRzLT5ncHJzLm1vZGUgPT0gQlRTX0dQUlNfRUdQUlMpIHsKKwkJLyogcGF0Y2ggRUdQUlMgY29kaW5nIHNjaGVtZXMgTUNTIDEuLjkgKi8KKwkJbmFub2J0c19hdHRyX2NlbGxbMjldID0gMHg4ZjsKKwkJbmFub2J0c19hdHRyX2NlbGxbMzBdID0gMHhmZjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJvb3RzdHJhcF9yc2woc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgImJvb3RzdHJhcHBpbmcgUlNMIGZvciBCVFMvVFJYICgldS8ldSkgIgorCQkib24gQVJGQ04gJXUgdXNpbmcgTUNDPSV1IE1OQz0ldSBMQUM9JXUgQ0lEPSV1IEJTSUM9JXUgVFNDPSV1XG4iLAorCQl0cngtPmJ0cy0+bnIsIHRyeC0+bnIsIHRyeC0+YXJmY24sIGJzY19nc21uZXQtPmNvdW50cnlfY29kZSwKKwkJYnNjX2dzbW5ldC0+bmV0d29ya19jb2RlLCB0cngtPmJ0cy0+bG9jYXRpb25fYXJlYV9jb2RlLAorCQl0cngtPmJ0cy0+Y2VsbF9pZGVudGl0eSwgdHJ4LT5idHMtPmJzaWMsIHRyeC0+YnRzLT50c2MpOworCXNldF9zeXN0ZW1faW5mb3ModHJ4KTsKK30KKwordm9pZCBpbnB1dF9ldmVudChpbnQgZXZlbnQsIGVudW0gZTFpbnBfc2lnbl90eXBlIHR5cGUsIHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KQoreworCWludCB0c19ubywgbGNoYW5fbm87CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBFVlRfRTFfVEVJX1VQOgorCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBFMUlOUF9TSUdOX09NTDoKKwkJCWJvb3RzdHJhcF9vbSh0cngtPmJ0cyk7CisJCQlicmVhazsKKwkJY2FzZSBFMUlOUF9TSUdOX1JTTDoKKwkJCWJvb3RzdHJhcF9yc2wodHJ4KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBFVlRfRTFfVEVJX0ROOgorCQlMT0dQKERNSSwgTE9HTF9FUlJPUiwgIkxvc3Qgc29tZSBFMSBURUkgbGluazogJWQgJXBcbiIsIHR5cGUsIHRyeCk7CisKKwkJaWYgKHR5cGUgPT0gRTFJTlBfU0lHTl9PTUwpCisJCQljb3VudGVyX2luYyh0cngtPmJ0cy0+bmV0d29yay0+c3RhdHMuYnRzLm9tbF9mYWlsKTsKKwkJZWxzZSBpZiAodHlwZSA9PSBFMUlOUF9TSUdOX1JTTCkKKwkJCWNvdW50ZXJfaW5jKHRyeC0+YnRzLT5uZXR3b3JrLT5zdGF0cy5idHMucnNsX2ZhaWwpOworCisJCS8qCisJCSAqIGZyZWUgYWxsIGFsbG9jYXRlZCBjaGFubmVscy4gY2hhbmdlIHRoZSBubV9zdGF0ZSBzbyB0aGUKKwkJICogdHJ4IGFuZCB0cnhfdHMgYmVjb21lcyB1bnVzYWJsZSBhbmQgY2hhbl9hbGxvYy5jIGNhbiBub3QKKwkJICogYWxsb2NhdGUgZnJvbSBpdC4KKwkJICovCisJCWZvciAodHNfbm8gPSAwOyB0c19ubyA8IEFSUkFZX1NJWkUodHJ4LT50cyk7ICsrdHNfbm8pIHsKKwkJCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMgPSAmdHJ4LT50c1t0c19ub107CisKKwkJCWZvciAobGNoYW5fbm8gPSAwOyBsY2hhbl9ubyA8IEFSUkFZX1NJWkUodHMtPmxjaGFuKTsgKytsY2hhbl9ubykgeworCQkJCWlmICh0cy0+bGNoYW5bbGNoYW5fbm9dLnN0YXRlICE9IEdTTV9MQ0hBTl9OT05FKQorCQkJCQlsY2hhbl9mcmVlKCZ0cy0+bGNoYW5bbGNoYW5fbm9dKTsKKwkJCQlsY2hhbl9yZXNldCgmdHMtPmxjaGFuW2xjaGFuX25vXSk7CisJCQl9CisKKwkJCXRzLT5ubV9zdGF0ZS5vcGVyYXRpb25hbCA9IDA7CisJCQl0cy0+bm1fc3RhdGUuYXZhaWxhYmlsaXR5ID0gMDsKKwkJfQorCisJCXRyeC0+bm1fc3RhdGUub3BlcmF0aW9uYWwgPSAwOworCQl0cngtPm5tX3N0YXRlLmF2YWlsYWJpbGl0eSA9IDA7CisJCXRyeC0+YmJfdHJhbnNjLm5tX3N0YXRlLm9wZXJhdGlvbmFsID0gMDsKKwkJdHJ4LT5iYl90cmFuc2Mubm1fc3RhdGUuYXZhaWxhYmlsaXR5ID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IGJvb3RzdHJhcF9idHMoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlpbnQgaSwgbjsKKworCXN3aXRjaCAoYnRzLT5iYW5kKSB7CisJY2FzZSBHU01fQkFORF8xODAwOgorCQlpZiAoYnRzLT5jMC0+YXJmY24gPCA1MTIgfHwgYnRzLT5jMC0+YXJmY24gPiA4ODUpIHsKKwkJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiR1NNMTgwMCBjaGFubmVsIG11c3QgYmUgYmV0d2VlbiA1MTItODg1LlxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwljYXNlIEdTTV9CQU5EXzE5MDA6CisJCWlmIChidHMtPmMwLT5hcmZjbiA8IDUxMiB8fCBidHMtPmMwLT5hcmZjbiA+IDgxMCkgeworCQkJTE9HUChETk0sIExPR0xfRVJST1IsICJHU00xOTAwIGNoYW5uZWwgbXVzdCBiZSBiZXR3ZWVuIDUxMi04MTAuXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWNhc2UgR1NNX0JBTkRfOTAwOgorCQlpZiAoYnRzLT5jMC0+YXJmY24gPCAxIHx8CisJCSAgIChidHMtPmMwLT5hcmZjbiA+IDEyNCAmJiBidHMtPmMwLT5hcmZjbiA8IDk1NSkgfHwKKwkJICAgIGJ0cy0+YzAtPmFyZmNuID4gMTAyMykgIHsKKwkJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiR1NNOTAwIGNoYW5uZWwgbXVzdCBiZSBiZXR3ZWVuIDEtMTI0LCA5NTUtMTAyMy5cbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJVbnN1cHBvcnRlZCBmcmVxdWVuY3kgYmFuZC5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoYnRzLT5uZXR3b3JrLT5hdXRoX3BvbGljeSA9PSBHU01fQVVUSF9QT0xJQ1lfQUNDRVBUX0FMTCAmJgorCSAgICAhYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLmNlbGxfYmFyKQorCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlxuV0FSTklORzogWW91IGFyZSBydW5uaW5nIGFuICdhY2NlcHQtYWxsJyAiCisJCQkibmV0d29yayBvbiBhIEJUUyB0aGF0IGlzIG5vdCBiYXJyZWQuICBUaGlzICIKKwkJCSJjb25maWd1cmF0aW9uIGlzIGxpa2VseSB0byBpbnRlcmZlcmUgd2l0aCBwcm9kdWN0aW9uICIKKwkJCSJHU00gbmV0d29ya3MgYW5kIHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gYSBSRiAiCisJCQkic2hpZWxkZWQgZW52aXJvbm1lbnQgc3VjaCBhcyBhIGZhcmFkYXkgY2FnZSFcblxuIik7CisKKwkvKiBDb250cm9sIENoYW5uZWwgRGVzY3JpcHRpb24gKi8KKwlidHMtPnNpX2NvbW1vbi5jaGFuX2Rlc2MuYXR0ID0gMTsKKwlidHMtPnNpX2NvbW1vbi5jaGFuX2Rlc2MuYnNfcGFfbWZybXMgPSBSU0xfQlNfUEFfTUZSTVNfNTsKKwkvKiBUMzIxMiBpcyBzZXQgZnJvbSB2dHkvY29uZmlnICovCisKKwkvKiBTZXQgY2NjaCBjb25maWcgYnkgbG9va2luZyBhdCB0cyBjb25maWcgKi8KKwlmb3IgKG49MCwgaT0wOyBpPDg7IGkrKykKKwkJbiArPSBidHMtPmMwLT50c1tpXS5wY2hhbiA9PSBHU01fUENIQU5fQ0NDSCA/IDEgOiAwOworCisJc3dpdGNoIChuKSB7CisJY2FzZSAwOgorCQlidHMtPnNpX2NvbW1vbi5jaGFuX2Rlc2MuY2NjaF9jb25mID0gUlNMX0JDQ0hfQ0NDSF9DT05GXzFfQzsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlidHMtPnNpX2NvbW1vbi5jaGFuX2Rlc2MuY2NjaF9jb25mID0gUlNMX0JDQ0hfQ0NDSF9DT05GXzFfTkM7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLmNjY2hfY29uZiA9IFJTTF9CQ0NIX0NDQ0hfQ09ORl8yX05DOworCQlicmVhazsKKwljYXNlIDM6CisJCWJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5jY2NoX2NvbmYgPSBSU0xfQkNDSF9DQ0NIX0NPTkZfM19OQzsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlidHMtPnNpX2NvbW1vbi5jaGFuX2Rlc2MuY2NjaF9jb25mID0gUlNMX0JDQ0hfQ0NDSF9DT05GXzRfTkM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiVW5zdXBwb3J0ZWQgQ0NDSCB0aW1lc2xvdCBjb25maWd1cmF0aW9uXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogc29tZSBkZWZhdWx0cyBmb3Igb3VyIHN5c3RlbSBpbmZvcm1hdGlvbiAqLworCWJ0cy0+c2lfY29tbW9uLmNlbGxfb3B0aW9ucy5yYWRpb19saW5rX3RpbWVvdXQgPSAyOyAvKiAxMiAqLworCWJ0cy0+c2lfY29tbW9uLmNlbGxfb3B0aW9ucy5kdHggPSAyOyAvKiBNUyBzaGFsbCBub3QgdXNlIHVwcGxpbmsgRFRYICovCisJYnRzLT5zaV9jb21tb24uY2VsbF9vcHRpb25zLnB3cmMgPSAwOyAvKiBQV1JDIG5vdCBzZXQgKi8KKworCWJ0cy0+c2lfY29tbW9uLmNlbGxfc2VsX3Bhci5hY3MgPSAwOworCisJYnRzLT5zaV9jb21tb24ubmNjX3Blcm1pdHRlZCA9IDB4ZmY7CisKKwlwYWdpbmdfaW5pdChidHMpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBic2NfYm9vdHN0cmFwX25ldHdvcmsoaW50ICgqbW5jY19yZWN2KShzdHJ1Y3QgZ3NtX25ldHdvcmsgKiwgaW50LCB2b2lkICopLAorCQkJICBjb25zdCBjaGFyICpjb25maWdfZmlsZSkKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCWludCByYzsKKworCS8qIGluaXRpYWxpemUgb3VyIGRhdGEgc3RydWN0dXJlcyAqLworCWJzY19nc21uZXQgPSBnc21fbmV0d29ya19pbml0KDEsIDEsIG1uY2NfcmVjdik7CisJaWYgKCFic2NfZ3NtbmV0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWJzY19nc21uZXQtPm5hbWVfbG9uZyA9IHRhbGxvY19zdHJkdXAoYnNjX2dzbW5ldCwgIk9wZW5CU0MiKTsKKwlic2NfZ3NtbmV0LT5uYW1lX3Nob3J0ID0gdGFsbG9jX3N0cmR1cChic2NfZ3NtbmV0LCAiT3BlbkJTQyIpOworCisJdGVsbmV0X2luaXQoYnNjX2dzbW5ldCwgNDI0Mik7CisJcmMgPSB2dHlfcmVhZF9jb25maWdfZmlsZShjb25maWdfZmlsZSk7CisJaWYgKHJjIDwgMCkgeworCQlMT0dQKEROTSwgTE9HTF9GQVRBTCwgIkZhaWxlZCB0byBwYXJzZSB0aGUgY29uZmlnIGZpbGU6ICclcydcbiIsIGNvbmZpZ19maWxlKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX05NLCBubV9zaWdfY2IsIE5VTEwpOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoYnRzLCAmYnNjX2dzbW5ldC0+YnRzX2xpc3QsIGxpc3QpIHsKKwkJYm9vdHN0cmFwX2J0cyhidHMpOworCQlpZiAoIWlzX2lwYWNjZXNzX2J0cyhidHMpKQorCQkJcmMgPSBlMV9yZWNvbmZpZ19idHMoYnRzKTsKKworCQlpZiAocmMgPCAwKQorCQkJZXhpdCAoMSk7CisJfQorCisJLyogaW5pdGlhbGl6ZSBuYW5vQlRTIHN1cHBvcnQgb21jZSAqLworCXJjID0gaXBhY2Nlc3Nfc2V0dXAoYnNjX2dzbW5ldCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2JzY19ybGwuYyBiL29wZW5ic2Mvc3JjL2JzY19ybGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTRmNWFhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvYnNjX3JsbC5jCkBAIC0wLDAgKzEsMTIyIEBACisvKiBHU00gQlNDIFJhZGlvIExpbmsgTGF5ZXIgQVBJCisgKiAzR1BQIFRTIDA4LjU4IHZlcnNpb24gOC42LjAgUmVsZWFzZSAxOTk5IC8gRVRTSSBUUyAxMDAgNTk2IFY4LjYuMCAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90aW1lci5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYnNjX3JsbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2NoYW5fYWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisKK3N0cnVjdCBic2NfcmxsX3JlcSB7CisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCXVfaW50OF90IGxpbmtfaWQ7CisKKwl2b2lkICgqY2IpKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBsaW5rX2lkLAorCQkgICB2b2lkICpkYXRhLCBlbnVtIGJzY19ybGxyX2luZCk7CisJdm9pZCAqZGF0YTsKK307CisKKy8qIHdlIG9ubHkgY29tcGFyZSBDMSwgQzIgYW5kIFNBUEkgKi8KKyNkZWZpbmUgTElOS0lEX01BU0sJMHhDNworCitzdGF0aWMgTExJU1RfSEVBRChic2NfcmxsX3JlcXMpOworCitzdGF0aWMgdm9pZCBjb21wbGV0ZV9ybGxyKHN0cnVjdCBic2NfcmxsX3JlcSAqcmxsciwgZW51bSBic2Nfcmxscl9pbmQgdHlwZSkKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubjsKKworCWNvbm4gPSAmcmxsci0+bGNoYW4tPmNvbm47CisJbGxpc3RfZGVsKCZybGxyLT5saXN0KTsKKwlwdXRfc3Vic2NyX2Nvbihjb25uKTsKKwlybGxyLT5jYihybGxyLT5sY2hhbiwgcmxsci0+bGlua19pZCwgcmxsci0+ZGF0YSwgdHlwZSk7CisJdGFsbG9jX2ZyZWUocmxscik7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVyX2NiKHZvaWQgKl9ybGxyKQoreworCXN0cnVjdCBic2NfcmxsX3JlcSAqcmxsciA9IF9ybGxyOworCisJY29tcGxldGVfcmxscihybGxyLCBCU0NfUkxMUl9JTkRfVElNRU9VVCk7Cit9CisKKy8qIGVzdGFibGlzaCBhIFJMTCBjb25uZWN0aW9uIHdpdGggZ2l2ZW4gU0FQSSAvIHByaW9yaXR5ICovCitpbnQgcmxsX2VzdGFibGlzaChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3Qgc2FwaSwKKwkJICB2b2lkICgqY2IpKHN0cnVjdCBnc21fbGNoYW4gKiwgdV9pbnQ4X3QsIHZvaWQgKiwKKwkJCSAgICAgZW51bSBic2Nfcmxscl9pbmQpLAorCQkgIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm47CisJc3RydWN0IGJzY19ybGxfcmVxICpybGxyID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3QgYnNjX3JsbF9yZXEpOworCXVfaW50OF90IGxpbmtfaWQ7CisJaWYgKCFybGxyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxpbmtfaWQgPSBzYXBpOworCisJLyogSWYgd2UgYXJlIGEgVENIIGFuZCBub3QgaW4gc2lnbmFsbGluZyBtb2RlLCB3ZSBuZWVkIHRvCisJICogaW5kaWNhdGUgdGhhdCB0aGUgbmV3IFJMTCBjb25uZWN0aW9uIGlzIHRvIGJlIG1hZGUgb24gdGhlIFNBQ0NIICovCisJaWYgKChsY2hhbi0+dHlwZSA9PSBHU01fTENIQU5fVENIX0YgfHwKKwkgICAgIGxjaGFuLT50eXBlID09IEdTTV9MQ0hBTl9UQ0hfSCkgJiYgc2FwaSAhPSAwKQorCQlsaW5rX2lkIHw9IDB4NDA7CisKKwljb25uID0gJmxjaGFuLT5jb25uOworCXVzZV9zdWJzY3JfY29uKGNvbm4pOworCXJsbHItPmxjaGFuID0gbGNoYW47CisJcmxsci0+bGlua19pZCA9IGxpbmtfaWQ7CisJcmxsci0+Y2IgPSBjYjsKKwlybGxyLT5kYXRhID0gZGF0YTsKKworCWxsaXN0X2FkZCgmcmxsci0+bGlzdCwgJmJzY19ybGxfcmVxcyk7CisKKwlybGxyLT50aW1lci5jYiA9ICZ0aW1lcl9jYjsKKwlybGxyLT50aW1lci5kYXRhID0gcmxscjsKKworCWJzY19zY2hlZHVsZV90aW1lcigmcmxsci0+dGltZXIsIDEwLCAwKTsKKworCS8qIHNlbmQgdGhlIFJTTCBSTEwgRVNUYWJsaXNoIFJFUXVlc3QgKi8KKwlyZXR1cm4gcnNsX2VzdGFibGlzaF9yZXF1ZXN0KHJsbHItPmxjaGFuLCBybGxyLT5saW5rX2lkKTsKK30KKworLyogQ2FsbGVkIGZyb20gUlNMIGNvZGUgaW4gY2FzZSB3ZSBoYXZlIHJlY2VpdmVkIGFuIGluZGljYXRpb24gcmVnYXJkaW5nCisgKiBhbnkgUkxMIGxpbmsgKi8KK3ZvaWQgcmxsX2luZGljYXRpb24oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGxpbmtfaWQsIHVfaW50OF90IHR5cGUpCit7CisJc3RydWN0IGJzY19ybGxfcmVxICpybGxyLCAqcmxscjI7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJsbHIsIHJsbHIyLCAmYnNjX3JsbF9yZXFzLCBsaXN0KSB7CisJCWlmIChybGxyLT5sY2hhbiA9PSBsY2hhbiAmJgorCQkgICAgKHJsbHItPmxpbmtfaWQgJiBMSU5LSURfTUFTSykgPT0gKGxpbmtfaWQgJiBMSU5LSURfTUFTSykpIHsKKwkJCWJzY19kZWxfdGltZXIoJnJsbHItPnRpbWVyKTsKKwkJCWNvbXBsZXRlX3JsbHIocmxsciwgdHlwZSk7CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ic2NfdmVyc2lvbi5jIGIvb3BlbmJzYy9zcmMvYnNjX3ZlcnNpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjY2MTk0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvYnNjX3ZlcnNpb24uYwpAQCAtMCwwICsxLDMyIEBACisvKiBIb2xkIHRoZSBjb3B5cmlnaHQgYW5kIHZlcnNpb24gc3RyaW5nICovCisvKiAoQykgMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlICJic2Njb25maWcuaCIKKworY29uc3QgY2hhciAqb3BlbmJzY192ZXJzaW9uID0gIk9wZW5CU0MgIiBQQUNLQUdFX1ZFUlNJT047Citjb25zdCBjaGFyICpvcGVuYnNjX2NvcHlyaWdodCA9CisJIkNvcHlyaWdodCAoQykgMjAwOC0yMDEwIEhhcmFsZCBXZWx0ZSwgSG9sZ2VyIEZyZXl0aGVyXG4iCisJIkNvbnRyaWJ1dGlvbnMgYnkgRGFuaWVsIFdpbGxtYW5uLCBKYW4gTMO8YmJlLFN0ZWZhbiBTY2htaWR0XG4iCisJIkRpZXRlciBTcGFhciwgQW5kcmVhcyBFdmVyc2JlcmdcblxuIgorCSJMaWNlbnNlIEdQTHYyKzogR05VIEdQTCB2ZXJzaW9uIDIgb3IgbGF0ZXIgPGh0dHA6Ly9nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sPlxuIgorCSJUaGlzIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBhcmUgZnJlZSB0byBjaGFuZ2UgYW5kIHJlZGlzdHJpYnV0ZSBpdC5cbiIKKwkiVGhlcmUgaXMgTk8gV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdy5cbiI7CisKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvYnRzX2lwYWNjZXNzX25hbm9idHMuYyBiL29wZW5ic2Mvc3JjL2J0c19pcGFjY2Vzc19uYW5vYnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I0OGVhOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2J0c19pcGFjY2Vzc19uYW5vYnRzLmMKQEAgLTAsMCArMSw4NCBAQAorLyogaXAuYWNjZXNzIG5hbm9CVFMgc3BlY2lmaWMgY29kZSAqLworCisvKiAoQykgMjAwOS0yMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfbm0uaD4KKworc3RhdGljIHN0cnVjdCBnc21fYnRzX21vZGVsIG1vZGVsX25hbm9idHMgPSB7CisJLnR5cGUgPSBHU01fQlRTX1RZUEVfTkFOT0JUUywKKwkubm1fYXR0X3RsdmRlZiA9IHsKKwkJLmRlZiA9IHsKKwkJCS8qIGlwLmFjY2VzcyBzcGVjaWZpY3MgKi8KKwkJCVtOTV9BVFRfSVBBQ0NfRFNUX0lQXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCA0IH0sCisJCQlbTk1fQVRUX0lQQUNDX0RTVF9JUF9QT1JUXSA9CXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfU1RSRUFNX0lEXSA9CXsgVExWX1RZUEVfVFYsIH0sCisJCQlbTk1fQVRUX0lQQUNDX0ZSRVFfQ1RSTF0gPQl7IFRMVl9UWVBFX1RWLCB9LAorCQkJW05NX0FUVF9JUEFDQ19TRUNfT01MX0NGR10gPQl7IFRMVl9UWVBFX0ZJWEVELCA2IH0sCisJCQlbTk1fQVRUX0lQQUNDX0lQX0lGX0NGR10gPQl7IFRMVl9UWVBFX0ZJWEVELCA4IH0sCisJCQlbTk1fQVRUX0lQQUNDX0lQX0dXX0NGR10gPQl7IFRMVl9UWVBFX0ZJWEVELCAxMiB9LAorCQkJW05NX0FUVF9JUEFDQ19JTl9TRVJWX1RJTUVdID0JeyBUTFZfVFlQRV9GSVhFRCwgNCB9LAorCQkJW05NX0FUVF9JUEFDQ19MT0NBVElPTl0gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1BBR0lOR19DRkddID0JeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQkJW05NX0FUVF9JUEFDQ19VTklUX0lEXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfVU5JVF9OQU1FXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfU05NUF9DRkddID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19QUklNX09NTF9DRkdfTElTVF0gPSB7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX05WX0ZMQUdTXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfRlJFUV9DVFJMXSA9CXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfUFJJTV9PTUxfRkJfVE9VVF0gPSB7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX0NVUl9TV19DRkddID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19USU1JTkdfQlVTXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfQ0dJXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1JBQ10gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19PQkpfVkVSU0lPTl0gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX0dQUlNfUEFHSU5HX0NGR109IHsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfTlNFSV0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19CVkNJXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX05TVkNJXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX05TX0NGR10gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19CU1NHUF9DRkddID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19OU19MSU5LX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1JMQ19DRkddID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19BTE1fVEhSRVNIX0xJU1RdPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX01PTklUX1ZBTF9MSVNUXSA9IHsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfVElCX0NPTlRST0xdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19TVVBQX0ZFQVRVUkVTXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfQ09ESU5HX1NDSEVNRVNdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19STENfQ0ZHXzJdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19IRUFSVEJfVE9VVF0gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1VQVElNRV0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19STENfQ0ZHXzNdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19TU0xfQ0ZHXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfU0VDX1BPU1NJQkxFXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfSU1MX1NTTF9TVEFURV0gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1JFVk9DX0RBVEVdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQl9LAorCX0sCit9OworCitpbnQgYnRzX21vZGVsX25hbm9idHNfaW5pdCh2b2lkKQoreworCXJldHVybiBnc21fYnRzX21vZGVsX3JlZ2lzdGVyKCZtb2RlbF9uYW5vYnRzKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2J0c19zaWVtZW5zX2JzMTEuYyBiL29wZW5ic2Mvc3JjL2J0c19zaWVtZW5zX2JzMTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTY2ODI1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvYnRzX3NpZW1lbnNfYnMxMS5jCkBAIC0wLDAgKzEsNjYgQEAKKy8qIFNpZW1lbnMgQlMtMTEgc3BlY2lmaWMgY29kZSAqLworCisvKiAoQykgMjAwOS0yMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfbm0uaD4KKworc3RhdGljIHN0cnVjdCBnc21fYnRzX21vZGVsIG1vZGVsX2JzMTEgPSB7CisJLnR5cGUgPSBHU01fQlRTX1RZUEVfQlMxMSwKKwkubm1fYXR0X3RsdmRlZiA9IHsKKwkJLmRlZiA9IHsKKwkJCVtOTV9BVFRfQVZBSUxfU1RBVFVTXSA9CQl7IFRMVl9UWVBFX1RMViB9LAorCQkJLyogQlMxMSBzcGVjaWZpY3MgKi8KKwkJCVtOTV9BVFRfQlMxMV9FU05fRldfQ09ERV9OT10gPQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX0VTTl9IV19DT0RFX05PXSA9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfRVNOX1BDQl9TRVJJQUxdID0JeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9CT09UX1NXX1ZFUlNdID0JeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVsweGQ1XSA9CQkJeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVsweGE4XSA9CQkJeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9QQVNTV09SRF0gPQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX1RYUFdSXSA9CQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX1JTU0lfT0ZGU10gPQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX0xJTkVfQ0ZHXSA9IAl7IFRMVl9UWVBFX1RWIH0sCisJCQlbTk1fQVRUX0JTMTFfTDFfUFJPVF9UWVBFXSA9CXsgVExWX1RZUEVfVFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9CSVRfRVJSX1RIRVNIXSA9CXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKwkJCVtOTV9BVFRfQlMxMV9ESVZFUlNJVFldID0JeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9MTVRfTE9HT05fU0VTU0lPTl09eyBUTFZfVFlQRV9UTFYgfSwJCisJCQlbTk1fQVRUX0JTMTFfTE1UX0xPR0lOX1RJTUVdID0JeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9MTVRfVVNFUl9BQ0NfTEVWXSA9eyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9MTVRfVVNFUl9OQU1FXSA9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfQlRTX1NUQVRFXQk9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfRTFfU1RBVEVdCT0JeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9QTExfTU9ERV0JPQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX1BMTF0JPQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX0NDTEtfQUNDVVJBQ1ldID0JeyBUTFZfVFlQRV9UViB9LAorCQkJW05NX0FUVF9CUzExX0NDTEtfVFlQRV0gPQl7IFRMVl9UWVBFX1RWIH0sCisJCQlbMHg5NV0gPQkJCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKwkJfSwKKwl9LAorfTsKKworaW50IGJ0c19tb2RlbF9iczExX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gZ3NtX2J0c19tb2RlbF9yZWdpc3RlcigmbW9kZWxfYnMxMSk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9idHNfdW5rbm93bi5jIGIvb3BlbmJzYy9zcmMvYnRzX3Vua25vd24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWM1ZDk5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvYnRzX3Vua25vd24uYwpAQCAtMCwwICsxLDQwIEBACisvKiBHZW5lcmljIEJUUyAtIFZUWSBjb2RlIHRyaWVzIHRvIGFsbG9jYXRlIHRoaXMgQlRTIGJlZm9yZSB0eXBlIGlzIGtub3duICovCisKKy8qIChDKSAyMDEwIGJ5IERhbmllbCBXaWxsbWFubiA8ZGFuaWVsQHRvdGFsdWViZXJ3YWNodW5nLmRlPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtX2J0c19tb2RlbCBtb2RlbF91bmtub3duID0geworCS50eXBlID0gR1NNX0JUU19UWVBFX1VOS05PV04sCisJLm5tX2F0dF90bHZkZWYgPSB7CisJCS5kZWYgPSB7CisJCX0sCisJfSwKK307CisKK2ludCBidHNfbW9kZWxfdW5rbm93bl9pbml0KHZvaWQpCit7CisJcmV0dXJuIGdzbV9idHNfbW9kZWxfcmVnaXN0ZXIoJm1vZGVsX3Vua25vd24pOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvY2hhbl9hbGxvYy5jIGIvb3BlbmJzYy9zcmMvY2hhbl9hbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwN2FiZGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9jaGFuX2FsbG9jLmMKQEAgLTAsMCArMSw0NTggQEAKKy8qIEdTTSBDaGFubmVsIGFsbG9jYXRpb24gcm91dGluZXMKKyAqCisgKiAoQykgMjAwOCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDgsIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvY2hhbl9hbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKworc3RhdGljIHZvaWQgYXV0b19yZWxlYXNlX2NoYW5uZWwodm9pZCAqX2xjaGFuKTsKKworc3RhdGljIGludCB0c19pc191c2FibGUoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cykKK3sKKwkvKiBGSVhNRTogSG93IGRvZXMgdGhpcyBiZWhhdmUgZm9yIEJTLTExID8gKi8KKwlpZiAoaXNfaXBhY2Nlc3NfYnRzKHRzLT50cngtPmJ0cykpIHsKKwkJaWYgKCFubV9pc19ydW5uaW5nKCZ0cy0+bm1fc3RhdGUpKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2ludCB0cnhfaXNfdXNhYmxlKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KQoreworCS8qIEZJWE1FOiBIb3cgZG9lcyB0aGlzIGJlaGF2ZSBmb3IgQlMtMTEgPyAqLworCWlmIChpc19pcGFjY2Vzc19idHModHJ4LT5idHMpKSB7CisJCWlmICghbm1faXNfcnVubmluZygmdHJ4LT5ubV9zdGF0ZSkgfHwKKwkJICAgICFubV9pc19ydW5uaW5nKCZ0cngtPmJiX3RyYW5zYy5ubV9zdGF0ZSkpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0c19jMF9hbGxvYyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLAorCQkJCSAgIGVudW0gZ3NtX3BoeXNfY2hhbl9jb25maWcgcGNoYW4pCit7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSBidHMtPmMwOworCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMgPSAmdHJ4LT50c1swXTsKKworCWlmIChwY2hhbiAhPSBHU01fUENIQU5fQ0NDSCAmJgorCSAgICBwY2hhbiAhPSBHU01fUENIQU5fQ0NDSF9TRENDSDQpCisJCXJldHVybiBOVUxMOworCisJaWYgKHRzLT5wY2hhbiAhPSBHU01fUENIQU5fTk9ORSkKKwkJcmV0dXJuIE5VTEw7CisKKwl0cy0+cGNoYW4gPSBwY2hhbjsKKworCXJldHVybiB0czsKK30KKworLyogQWxsb2NhdGUgYSBwaHlzaWNhbCBjaGFubmVsIChUUykgKi8KK3N0cnVjdCBnc21fYnRzX3RyeF90cyAqdHNfYWxsb2Moc3RydWN0IGdzbV9idHMgKmJ0cywKKwkJCQllbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIHBjaGFuKQoreworCWludCBqOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJ4LCAmYnRzLT50cnhfbGlzdCwgbGlzdCkgeworCQlpbnQgZnJvbSwgdG87CisKKwkJaWYgKCF0cnhfaXNfdXNhYmxlKHRyeCkpCisJCQljb250aW51ZTsKKworCQkvKiB0aGUgZm9sbG93aW5nIGNvbnN0cmFpbnRzIGFyZSBwdXJlIHBvbGljeSwKKwkJICogbm8gcmVxdWlyZW1lbnQgdG8gcHV0IHRoaXMgcmVzdHJpY3Rpb24gaW4gcGxhY2UgKi8KKwkJaWYgKHRyeCA9PSBidHMtPmMwKSB7CisJCQkvKiBPbiB0aGUgZmlyc3QgVFJYIHdlIHJ1biBvbmUgQ0NDSCBhbmQgb25lIFNEQ0NIOCAqLworCQkJc3dpdGNoIChwY2hhbikgeworCQkJY2FzZSBHU01fUENIQU5fQ0NDSDoKKwkJCWNhc2UgR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0OgorCQkJCWZyb20gPSAwOyB0byA9IDA7CisJCQkJYnJlYWs7CisJCQljYXNlIEdTTV9QQ0hBTl9UQ0hfRjoKKwkJCWNhc2UgR1NNX1BDSEFOX1RDSF9IOgorCQkJCWZyb20gPSAxOyB0byA9IDc7CisJCQkJYnJlYWs7CisJCQljYXNlIEdTTV9QQ0hBTl9TRENDSDhfU0FDQ0g4QzoKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBFdmVyeSBzZWNvbmRhcnkgVFJYIGlzIGNvbmZpZ3VyZWQgZm9yIFRDSC9GCisJCQkgKiBhbmQgVENIL0ggb25seSAqLworCQkJc3dpdGNoIChwY2hhbikgeworCQkJY2FzZSBHU01fUENIQU5fU0RDQ0g4X1NBQ0NIOEM6CisJCQkJZnJvbSA9IDE7IHRvID0gMTsKKwkJCWNhc2UgR1NNX1BDSEFOX1RDSF9GOgorCQkJY2FzZSBHU01fUENIQU5fVENIX0g6CisJCQkJZnJvbSA9IDE7IHRvID0gNzsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKworCQlmb3IgKGogPSBmcm9tOyBqIDw9IHRvOyBqKyspIHsKKwkJCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMgPSAmdHJ4LT50c1tqXTsKKworCQkJaWYgKCF0c19pc191c2FibGUodHMpKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAodHMtPnBjaGFuID09IEdTTV9QQ0hBTl9OT05FKSB7CisJCQkJdHMtPnBjaGFuID0gcGNoYW47CisJCQkJLyogc2V0IGNoYW5uZWwgYXR0cmlidXRlIG9uIE9NTCAqLworCQkJCWFiaXNfbm1fc2V0X2NoYW5uZWxfYXR0cih0cywgYWJpc19ubV9jaGNvbWI0cGNoYW4ocGNoYW4pKTsKKwkJCQlyZXR1cm4gdHM7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIEZyZWUgYSBwaHlzaWNhbCBjaGFubmVsIChUUykgKi8KK3ZvaWQgdHNfZnJlZShzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzKQoreworCXRzLT5wY2hhbiA9IEdTTV9QQ0hBTl9OT05FOworfQorCitzdGF0aWMgY29uc3QgdV9pbnQ4X3Qgc3Vic2xvdHNfcGVyX3BjaGFuW10gPSB7CisJW0dTTV9QQ0hBTl9OT05FXSA9IDAsCisJW0dTTV9QQ0hBTl9DQ0NIXSA9IDAsCisJW0dTTV9QQ0hBTl9DQ0NIX1NEQ0NINF0gPSA0LAorCVtHU01fUENIQU5fVENIX0ZdID0gMSwKKwlbR1NNX1BDSEFOX1RDSF9IXSA9IDIsCisJW0dTTV9QQ0hBTl9TRENDSDhfU0FDQ0g4Q10gPSA4LAorCS8qIEZJWE1FOiB3aGF0IGFib3V0IGR5bmFtaWMgVENIX0ZfVENIX0ggPyAqLworCVtHU01fUENIQU5fVENIX0ZfUERDSF0gPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBnc21fbGNoYW4gKgorX2xjX2ZpbmRfdHJ4KHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCBlbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIHBjaGFuKQoreworCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHM7CisJaW50IGosIHNzOworCisJaWYgKCF0cnhfaXNfdXNhYmxlKHRyeCkpCisJCXJldHVybiBOVUxMOworCisJZm9yIChqID0gMDsgaiA8IDg7IGorKykgeworCQl0cyA9ICZ0cngtPnRzW2pdOworCQlpZiAoIXRzX2lzX3VzYWJsZSh0cykpCisJCQljb250aW51ZTsKKwkJLyogaXAuYWNjZXNzIGR5bmFtaWMgVENIL0YgKyBQRENIIGNvbWJpbmF0aW9uICovCisJCWlmICh0cy0+cGNoYW4gPT0gR1NNX1BDSEFOX1RDSF9GX1BEQ0ggJiYKKwkJICAgIHBjaGFuID09IEdTTV9QQ0hBTl9UQ0hfRikgeworCQkJLyogd2UgY2FuIG9ubHkgY29uc2lkZXIgc3VjaCBhIGR5bmFtaWMgY2hhbm5lbAorCQkJICogaWYgdGhlIFBEQ0ggaXMgY3VycmVudGx5IGluYWN0aXZlICovCisJCQlpZiAodHMtPmZsYWdzICYgVFNfRl9QRENIX01PREUpCisJCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAodHMtPnBjaGFuICE9IHBjaGFuKQorCQkJY29udGludWU7CisJCS8qIGNoZWNrIGlmIGFsbCBzdWItc2xvdHMgYXJlIGFsbG9jYXRlZCB5ZXQgKi8KKwkJZm9yIChzcyA9IDA7IHNzIDwgc3Vic2xvdHNfcGVyX3BjaGFuW3BjaGFuXTsgc3MrKykgeworCQkJc3RydWN0IGdzbV9sY2hhbiAqbGMgPSAmdHMtPmxjaGFuW3NzXTsKKwkJCWlmIChsYy0+dHlwZSA9PSBHU01fTENIQU5fTk9ORSAmJgorCQkJICAgIGxjLT5zdGF0ZSA9PSBMQ0hBTl9TX05PTkUpCisJCQkJcmV0dXJuIGxjOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtX2xjaGFuICoKK19sY19maW5kX2J0cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBlbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIHBjaGFuKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHM7CisJc3RydWN0IGdzbV9sY2hhbiAqbGM7CisKKwlpZiAoYnRzLT5jaGFuX2FsbG9jX3JldmVyc2UpIHsKKwkJbGxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZSh0cngsICZidHMtPnRyeF9saXN0LCBsaXN0KSB7CisJCQlsYyA9IF9sY19maW5kX3RyeCh0cngsIHBjaGFuKTsKKwkJCWlmIChsYykKKwkJCQlyZXR1cm4gbGM7CisJCX0KKwl9IGVsc2UgeworCQlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cngsICZidHMtPnRyeF9saXN0LCBsaXN0KSB7CisJCQlsYyA9IF9sY19maW5kX3RyeCh0cngsIHBjaGFuKTsKKwkJCWlmIChsYykKKwkJCQlyZXR1cm4gbGM7CisJCX0KKwl9CisKKwkvKiB3ZSBjYW5ub3QgYWxsb2NhdGUgbW9yZSBvZiB0aGVzZSAqLworCWlmIChwY2hhbiA9PSBHU01fUENIQU5fQ0NDSF9TRENDSDQpCisJCXJldHVybiBOVUxMOworCisJLyogaWYgd2UndmUgcmVhY2hlZCBoZXJlLCB3ZSBuZWVkIHRvIGFsbG9jYXRlIGEgbmV3IHBoeXNpY2FsCisJICogY2hhbm5lbCBmb3IgdGhlIGxvZ2ljYWwgY2hhbm5lbCB0eXBlIHJlcXVlc3RlZCAqLworCXRzID0gdHNfYWxsb2MoYnRzLCBwY2hhbik7CisJaWYgKCF0cykgeworCQkvKiBubyBtb3JlIHJhZGlvIHJlc291cmNlcyAqLworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuICZ0cy0+bGNoYW5bMF07Cit9CisKKy8qIEFsbG9jYXRlIGEgbG9naWNhbCBjaGFubmVsICovCitzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbl9hbGxvYyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBlbnVtIGdzbV9jaGFuX3QgdHlwZSkKK3sKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IE5VTEw7CisJZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBmaXJzdCwgc2Vjb25kOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBHU01fTENIQU5fU0RDQ0g6CisJCWlmIChidHMtPmNoYW5fYWxsb2NfcmV2ZXJzZSkgeworCQkJZmlyc3QgPSBHU01fUENIQU5fU0RDQ0g4X1NBQ0NIOEM7CisJCQlzZWNvbmQgPSBHU01fUENIQU5fQ0NDSF9TRENDSDQ7CisJCX0gZWxzZSB7CisJCQlmaXJzdCA9IEdTTV9QQ0hBTl9DQ0NIX1NEQ0NINDsKKwkJCXNlY29uZCA9IEdTTV9QQ0hBTl9TRENDSDhfU0FDQ0g4QzsKKwkJfQorCisJCWxjaGFuID0gX2xjX2ZpbmRfYnRzKGJ0cywgZmlyc3QpOworCQlpZiAobGNoYW4gPT0gTlVMTCkKKwkJCWxjaGFuID0gX2xjX2ZpbmRfYnRzKGJ0cywgc2Vjb25kKTsKKwkJYnJlYWs7CisJY2FzZSBHU01fTENIQU5fVENIX0Y6CisJCWxjaGFuID0gX2xjX2ZpbmRfYnRzKGJ0cywgR1NNX1BDSEFOX1RDSF9GKTsKKwkJYnJlYWs7CisJY2FzZSBHU01fTENIQU5fVENIX0g6CisJCWxjaGFuID1fbGNfZmluZF9idHMoYnRzLCBHU01fUENIQU5fVENIX0gpOworCQkvKiBJZiB3ZSBkb24ndCBoYXZlIFRDSC9IIGF2YWlsYWJsZSwgZmFsbC1iYWNrIHRvIFRDSC9GICovCisJCWlmICghbGNoYW4pIHsKKwkJCWxjaGFuID0gX2xjX2ZpbmRfYnRzKGJ0cywgR1NNX1BDSEFOX1RDSF9GKTsKKwkJCXR5cGUgPSBHU01fTENIQU5fVENIX0Y7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEUkxMLCBMT0dMX0VSUk9SLCAiVW5rbm93biBnc21fY2hhbl90ICV1XG4iLCB0eXBlKTsKKwl9CisKKwlpZiAobGNoYW4pIHsKKwkJbGNoYW4tPnR5cGUgPSB0eXBlOworCisJCS8qIGNsZWFyIHNhcGlzICovCisJCW1lbXNldChsY2hhbi0+c2FwaXMsIDAsIEFSUkFZX1NJWkUobGNoYW4tPnNhcGlzKSk7CisKKwkJLyogY2xlYXIgbXVsdGkgcmF0ZSBjb25maWcgKi8KKwkJbWVtc2V0KCZsY2hhbi0+bXJfY29uZiwgMCwgc2l6ZW9mKGxjaGFuLT5tcl9jb25mKSk7CisKKwkJLyogY2xlYXIgcGVyIE1TQy9CU0MgZGF0YSAqLworCQltZW1zZXQoJmxjaGFuLT5jb25uLCAwLCBzaXplb2YobGNoYW4tPmNvbm4pKTsKKworCQkvKiBDb25maWd1cmUgdGhlIHRpbWUgYW5kIHN0YXJ0IGl0IHNvIGl0IHdpbGwgYmUgY2xvc2VkICovCisJCWxjaGFuLT5jb25uLmxjaGFuID0gbGNoYW47CisJCWxjaGFuLT5jb25uLmJ0cyA9IGxjaGFuLT50cy0+dHJ4LT5idHM7CisJCWxjaGFuLT5jb25uLnJlbGVhc2VfdGltZXIuY2IgPSBhdXRvX3JlbGVhc2VfY2hhbm5lbDsKKwkJbGNoYW4tPmNvbm4ucmVsZWFzZV90aW1lci5kYXRhID0gbGNoYW47CisJCWJzY19zY2hlZHVsZV90aW1lcigmbGNoYW4tPmNvbm4ucmVsZWFzZV90aW1lciwgTENIQU5fUkVMRUFTRV9USU1FT1VUKTsKKworCX0gZWxzZSB7CisJCXN0cnVjdCBjaGFsbG9jX3NpZ25hbF9kYXRhIHNpZzsKKwkJc2lnLmJ0cyA9IGJ0czsKKwkJc2lnLnR5cGUgPSB0eXBlOworCQlkaXNwYXRjaF9zaWduYWwoU1NfQ0hBTExPQywgU19DSEFMTE9DX0FMTE9DX0ZBSUwsICZzaWcpOworCX0KKworCXJldHVybiBsY2hhbjsKK30KKworLyogRnJlZSBhIGxvZ2ljYWwgY2hhbm5lbCAqLwordm9pZCBsY2hhbl9mcmVlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN0cnVjdCBjaGFsbG9jX3NpZ25hbF9kYXRhIHNpZzsKKwlpbnQgaTsKKworCXNpZy50eXBlID0gbGNoYW4tPnR5cGU7CisJbGNoYW4tPnR5cGUgPSBHU01fTENIQU5fTk9ORTsKKwlpZiAobGNoYW4tPmNvbm4uc3Vic2NyKSB7CisJCXN1YnNjcl9wdXQobGNoYW4tPmNvbm4uc3Vic2NyKTsKKwkJbGNoYW4tPmNvbm4uc3Vic2NyID0gTlVMTDsKKwl9CisKKwkvKiBXZSBtaWdodCBraWxsIGFuIGFjdGl2ZSBjaGFubmVsLi4uICovCisJaWYgKGxjaGFuLT5jb25uLnVzZV9jb3VudCAhPSAwKSB7CisJCWRpc3BhdGNoX3NpZ25hbChTU19MQ0hBTiwgU19MQ0hBTl9VTkVYUEVDVEVEX1JFTEVBU0UsIGxjaGFuKTsKKwkJbGNoYW4tPmNvbm4udXNlX2NvdW50ID0gMDsKKwl9CisKKwkvKiBzdG9wIHRoZSB0aW1lciAqLworCWJzY19kZWxfdGltZXIoJmxjaGFuLT5jb25uLnJlbGVhc2VfdGltZXIpOworCWJzY19kZWxfdGltZXIoJmxjaGFuLT5UMzEwMSk7CisKKwkvKiBjbGVhciBjYWNoZWQgbWVhc3VlbWVudCByZXBvcnRzICovCisJbGNoYW4tPm1lYXNfcmVwX2lkeCA9IDA7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobGNoYW4tPm1lYXNfcmVwKTsgaSsrKSB7CisJCWxjaGFuLT5tZWFzX3JlcFtpXS5mbGFncyA9IDA7CisJCWxjaGFuLT5tZWFzX3JlcFtpXS5uciA9IDA7CisJfQorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxjaGFuLT5uZWlnaF9tZWFzKTsgaSsrKQorCQlsY2hhbi0+bmVpZ2hfbWVhc1tpXS5hcmZjbiA9IDA7CisKKwlsY2hhbi0+Y29ubi5zaWxlbnRfY2FsbCA9IDA7CisKKwlzaWcubGNoYW4gPSBsY2hhbjsKKwlzaWcuYnRzID0gbGNoYW4tPnRzLT50cngtPmJ0czsKKwlkaXNwYXRjaF9zaWduYWwoU1NfQ0hBTExPQywgU19DSEFMTE9DX0ZSRUVELCAmc2lnKTsKKworCS8qIEZJWE1FOiB0c19mcmVlKCkgdGhlIHRpbWVzbG90LCBpZiB3ZSdyZSB0aGUgbGFzdCBsb2dpY2FsCisJICogY2hhbm5lbCB1c2luZyBpdCAqLworfQorCisvKgorICogVGhlcmUgd2FzIGFuIGVycm9yIHdpdGggdGhlIFRSWCBhbmQgd2UgbmVlZCB0byBmb3JnZXQKKyAqIGFueSBzdGF0ZSBzbyB0aGF0IGEgbGNoYW4gY2FuIGJlIGFsbG9jYXRlZCBhZ2FpbiBhZnRlcgorICogdGhlIHRyeCBpcyBmdWxseSB1c2FibGUuCisgKi8KK3ZvaWQgbGNoYW5fcmVzZXQoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJYnNjX2RlbF90aW1lcigmbGNoYW4tPlQzMTAxKTsKKworCWxjaGFuLT50eXBlID0gR1NNX0xDSEFOX05PTkU7CisJbGNoYW4tPnN0YXRlID0gTENIQU5fU19OT05FOworfQorCisKKy8qIENvbnNpZGVyIHJlbGVhc2luZyB0aGUgY2hhbm5lbCBub3cgKi8KK2ludCBsY2hhbl9hdXRvX3JlbGVhc2Uoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJaWYgKGxjaGFuLT5jb25uLnVzZV9jb3VudCA+IDApIHsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQXNzdW1lIHdlIGhhdmUgR1NNMDQuMDggcnVubmluZyBhbmQgc2VuZCBhIHJlbGVhc2UgKi8KKwlpZiAobGNoYW4tPmNvbm4uc3Vic2NyKSB7CisJCWdzbTQ4X3NlbmRfcnJfcmVsZWFzZShsY2hhbik7CisJfQorCisJLyogc3Bvb2ZlZD8gbWVzc2FnZSAqLworCWlmIChsY2hhbi0+Y29ubi51c2VfY291bnQgPCAwKQorCQlMT0dQKERSTEwsIExPR0xfRVJST1IsICJDaGFubmVsIGNvdW50IGlzIG5lZ2F0aXZlOiAlZFxuIiwKKwkJCWxjaGFuLT5jb25uLnVzZV9jb3VudCk7CisKKwlERUJVR1AoRFJMTCwgIiVzIFJlY3ljbGluZyBDaGFubmVsXG4iLCBnc21fbGNoYW5fbmFtZShsY2hhbikpOworCXJzbF9sY2hhbl9zZXRfc3RhdGUobGNoYW4sIExDSEFOX1NfUkVMX1JFUSk7CisJcnNsX3JlbGVhc2VfcmVxdWVzdChsY2hhbiwgMCk7CisJcmV0dXJuIDE7Cit9CisKKy8qIEF1dG8gcmVsZWFzZSB0aGUgY2hhbm5lbCB3aGVuIHRoZSB1c2UgY291bnQgaXMgemVybyAqLworc3RhdGljIHZvaWQgYXV0b19yZWxlYXNlX2NoYW5uZWwodm9pZCAqX2xjaGFuKQoreworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gX2xjaGFuOworCisJaWYgKCFsY2hhbl9hdXRvX3JlbGVhc2UobGNoYW4pKQorCQlic2Nfc2NoZWR1bGVfdGltZXIoJmxjaGFuLT5jb25uLnJlbGVhc2VfdGltZXIsIExDSEFOX1JFTEVBU0VfVElNRU9VVCk7Cit9CisKK3N0cnVjdCBnc21fbGNoYW4qIGxjaGFuX2ZpbmQoc3RydWN0IGdzbV9idHMgKmJ0cywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpIHsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwlpbnQgdHNfbm8sIGxjaGFuX25vOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJ4LCAmYnRzLT50cnhfbGlzdCwgbGlzdCkgeworCQlmb3IgKHRzX25vID0gMDsgdHNfbm8gPCA4OyArK3RzX25vKSB7CisJCQlmb3IgKGxjaGFuX25vID0gMDsgbGNoYW5fbm8gPCBUU19NQVhfTENIQU47ICsrbGNoYW5fbm8pIHsKKwkJCQlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9CisJCQkJCSZ0cngtPnRzW3RzX25vXS5sY2hhbltsY2hhbl9ub107CisJCQkJaWYgKHN1YnNjciA9PSBsY2hhbi0+Y29ubi5zdWJzY3IpCisJCQkJCXJldHVybiBsY2hhbjsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbl9mb3Jfc3Vic2NyKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCXN0cnVjdCBnc21fYnRzICpidHM7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBzdWJzY3ItPm5ldDsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ0cywgJm5ldC0+YnRzX2xpc3QsIGxpc3QpIHsKKwkJbGNoYW4gPSBsY2hhbl9maW5kKGJ0cywgc3Vic2NyKTsKKwkJaWYgKGxjaGFuKQorCQkJcmV0dXJuIGxjaGFuOworCX0KKworCXJldHVybiBOVUxMOworfQorCit2b2lkIGJ0c19jaGFuX2xvYWQoc3RydWN0IHBjaGFuX2xvYWQgKmNsLCBjb25zdCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJ4LCAmYnRzLT50cnhfbGlzdCwgbGlzdCkgeworCQlpbnQgaTsKKworCQkvKiBza2lwIGFkbWluaXN0cmF0aXZlbHkgZGVhY3RpdmF0ZWQgdHJhbnhzY2VpdmVycyAqLworCQlpZiAoIW5tX2lzX3J1bm5pbmcoJnRyeC0+bm1fc3RhdGUpIHx8CisJCSAgICAhbm1faXNfcnVubmluZygmdHJ4LT5iYl90cmFuc2Mubm1fc3RhdGUpKQorCQkJY29udGludWU7CisKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodHJ4LT50cyk7IGkrKykgeworCQkJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9ICZ0cngtPnRzW2ldOworCQkJc3RydWN0IGxvYWRfY291bnRlciAqcGwgPSAmY2wtPnBjaGFuW3RzLT5wY2hhbl07CisJCQlpbnQgajsKKworCQkJLyogc2tpcCBhZG1pbmlzdHJhdGl2ZWx5IGRlYWN0aXZhdGVkIHRpbWVzbG90cyAqLworCQkJaWYgKCFubV9pc19ydW5uaW5nKCZ0cy0+bm1fc3RhdGUpKQorCQkJCWNvbnRpbnVlOworCisJCQlmb3IgKGogPSAwOyBqIDwgc3Vic2xvdHNfcGVyX3BjaGFuW3RzLT5wY2hhbl07IGorKykgeworCQkJCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gJnRzLT5sY2hhbltqXTsKKworCQkJCXBsLT50b3RhbCsrOworCisJCQkJc3dpdGNoIChsY2hhbi0+c3RhdGUpIHsKKwkJCQljYXNlIExDSEFOX1NfTk9ORToKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJcGwtPnVzZWQrKzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCit2b2lkIG5ldHdvcmtfY2hhbl9sb2FkKHN0cnVjdCBwY2hhbl9sb2FkICpwbCwgc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKworCW1lbXNldChwbCwgMCwgc2l6ZW9mKCpwbCkpOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoYnRzLCAmbmV0LT5idHNfbGlzdCwgbGlzdCkKKwkJYnRzX2NoYW5fbG9hZChwbCwgYnRzKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2RiLmMgYi9vcGVuYnNjL3NyYy9kYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZjQ3YWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9kYi5jCkBAIC0wLDAgKzEsMTE4MiBAQAorLyogU2ltcGxlIEhMUi9WTFIgZGF0YWJhc2UgYmFja2VuZCB1c2luZyBkYmkgKi8KKy8qIChDKSAyMDA4IGJ5IEphbiBMdWViYmUgPGpsdWViYmVAZGViaWFuLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8xMS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc3RhdGlzdGljcy5oPgorCisjaW5jbHVkZSA8bGliZ2VuLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGRiaS9kYmkuaD4KKworc3RhdGljIGNoYXIgKmRiX2Jhc2VuYW1lID0gTlVMTDsKK3N0YXRpYyBjaGFyICpkYl9kaXJuYW1lID0gTlVMTDsKK3N0YXRpYyBkYmlfY29ubiBjb25uOworCitzdGF0aWMgY2hhciAqY3JlYXRlX3N0bXRzW10gPSB7CisJIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIE1ldGEgKCIKKwkJImlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwgIgorCQkia2V5IFRFWFQgVU5JUVVFIE5PVCBOVUxMLCAiCisJCSJ2YWx1ZSBURVhUIE5PVCBOVUxMIgorCQkiKSIsCisJIklOU0VSVCBPUiBJR05PUkUgSU5UTyBNZXRhICIKKwkJIihrZXksIHZhbHVlKSAiCisJCSJWQUxVRVMgIgorCQkiKCdyZXZpc2lvbicsICcyJykiLAorCSJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBTdWJzY3JpYmVyICgiCisJCSJpZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsICIKKwkJImNyZWF0ZWQgVElNRVNUQU1QIE5PVCBOVUxMLCAiCisJCSJ1cGRhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkiaW1zaSBOVU1FUklDIFVOSVFVRSBOT1QgTlVMTCwgIgorCQkibmFtZSBURVhULCAiCisJCSJleHRlbnNpb24gVEVYVCBVTklRVUUsICIKKwkJImF1dGhvcml6ZWQgSU5URUdFUiBOT1QgTlVMTCBERUZBVUxUIDAsICIKKwkJInRtc2kgVEVYVCBVTklRVUUsICIKKwkJImxhYyBJTlRFR0VSIE5PVCBOVUxMIERFRkFVTFQgMCIKKwkJIikiLAorCSJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBBdXRoVG9rZW4gKCIKKwkJImlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwgIgorCQkic3Vic2NyaWJlcl9pZCBJTlRFR0VSIFVOSVFVRSBOT1QgTlVMTCwgIgorCQkiY3JlYXRlZCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJInRva2VuIFRFWFQgVU5JUVVFIE5PVCBOVUxMIgorCQkiKSIsCisJIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIEVxdWlwbWVudCAoIgorCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJjcmVhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkidXBkYXRlZCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJIm5hbWUgVEVYVCwgIgorCQkiY2xhc3NtYXJrMSBOVU1FUklDLCAiCisJCSJjbGFzc21hcmsyIEJMT0IsICIKKwkJImNsYXNzbWFyazMgQkxPQiwgIgorCQkiaW1laSBOVU1FUklDIFVOSVFVRSBOT1QgTlVMTCIKKwkJIikiLAorCSJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBFcXVpcG1lbnRXYXRjaCAoIgorCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJjcmVhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkidXBkYXRlZCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJInN1YnNjcmliZXJfaWQgTlVNRVJJQyBOT1QgTlVMTCwgIgorCQkiZXF1aXBtZW50X2lkIE5VTUVSSUMgTk9UIE5VTEwsICIKKwkJIlVOSVFVRSAoc3Vic2NyaWJlcl9pZCwgZXF1aXBtZW50X2lkKSAiCisJCSIpIiwKKwkiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgU01TICgiCisJCS8qIG1ldGFkYXRhLCBub3QgcGFydCBvZiBzbXMgKi8KKwkJImlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwgIgorCQkiY3JlYXRlZCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJInNlbnQgVElNRVNUQU1QLCAiCisJCSJzZW5kZXJfaWQgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkicmVjZWl2ZXJfaWQgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkiZGVsaXZlcl9hdHRlbXB0cyBJTlRFR0VSIE5PVCBOVUxMIERFRkFVTFQgMCwgIgorCQkvKiBkYXRhIGRpcmVjdGx5IGNvcGllZC9kZXJpdmVkIGZyb20gU01TICovCisJCSJ2YWxpZF91bnRpbCBUSU1FU1RBTVAsICIKKwkJInJlcGx5X3BhdGhfcmVxIElOVEVHRVIgTk9UIE5VTEwsICIKKwkJInN0YXR1c19yZXBfcmVxIElOVEVHRVIgTk9UIE5VTEwsICIKKwkJInByb3RvY29sX2lkIElOVEVHRVIgTk9UIE5VTEwsICIKKwkJImRhdGFfY29kaW5nX3NjaGVtZSBJTlRFR0VSIE5PVCBOVUxMLCAiCisJCSJ1ZF9oZHJfaW5kIElOVEVHRVIgTk9UIE5VTEwsICIKKwkJImRlc3RfYWRkciBURVhULCAiCisJCSJ1c2VyX2RhdGEgQkxPQiwgIgkvKiBUUC1VRCAqLworCQkvKiBhZGRpdGlvbmFsIGRhdGEsIGludGVycHJldGVkIGZyb20gU01TICovCisJCSJoZWFkZXIgQkxPQiwgIgkJLyogVUQgSGVhZGVyICovCisJCSJ0ZXh0IFRFWFQgIgkJLyogZGVjb2RlZCBVRCBhZnRlciBVREggKi8KKwkJIikiLAorCSJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBWTFIgKCIKKwkJImlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwgIgorCQkiY3JlYXRlZCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJInVwZGF0ZWQgVElNRVNUQU1QIE5PVCBOVUxMLCAiCisJCSJzdWJzY3JpYmVyX2lkIE5VTUVSSUMgVU5JUVVFIE5PVCBOVUxMLCAiCisJCSJsYXN0X2J0cyBOVU1FUklDIE5PVCBOVUxMICIKKwkJIikiLAorCSJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBBcGR1QmxvYnMgKCIKKwkJImlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwgIgorCQkiY3JlYXRlZCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJImFwZHVfaWRfZmxhZ3MgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkic3Vic2NyaWJlcl9pZCBJTlRFR0VSIE5PVCBOVUxMLCAiCisJCSJhcGR1IEJMT0IgIgorCQkiKSIsCisJIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIENvdW50ZXJzICgiCisJCSJpZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsICIKKwkJInRpbWVzdGFtcCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJInZhbHVlIElOVEVHRVIgTk9UIE5VTEwsICIKKwkJIm5hbWUgVEVYVCBOT1QgTlVMTCAiCisJCSIpIiwKKwkiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgQXV0aEtleXMgKCIKKwkJImlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwgIgorCQkic3Vic2NyaWJlcl9pZCBJTlRFR0VSIFVOSVFVRSBOT1QgTlVMTCwgIgorCQkiYWxnb3JpdGhtX2lkIElOVEVHRVIgTk9UIE5VTEwsICIKKwkJImEzYThfa2kgQkxPQiAiCisJCSIpIiwKKwkiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgQXV0aFR1cGxlcyAoIgorCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJzdWJzY3JpYmVyX2lkIE5VTUVSSUMgVU5JUVVFIE5PVCBOVUxMLCAiCisJCSJpc3N1ZWQgVElNRVNUQU1QIE5PVCBOVUxMLCAiCisJCSJ1c2VfY291bnQgSU5URUdFUiBOT1QgTlVMTCBERUZBVUxUIDAsICIKKwkJImtleV9zZXEgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkicmFuZCBCTE9CIE5PVCBOVUxMLCAiCisJCSJzcmVzIEJMT0IgTk9UIE5VTEwsICIKKwkJImtjIEJMT0IgTk9UIE5VTEwgIgorCQkiKSIsCit9OworCit2b2lkIGRiX2Vycm9yX2Z1bmMoZGJpX2Nvbm4gY29ubiwgdm9pZCAqZGF0YSkKK3sKKwljb25zdCBjaGFyICptc2c7CisJZGJpX2Nvbm5fZXJyb3IoY29ubiwgJm1zZyk7CisJTE9HUChEREIsIExPR0xfRVJST1IsICJEQkk6ICVzXG4iLCBtc2cpOworfQorCitzdGF0aWMgaW50IGNoZWNrX2RiX3JldmlzaW9uKHZvaWQpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJY29uc3QgY2hhciAqcmV2OworCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnkoY29ubiwKKwkJCQkiU0VMRUNUIHZhbHVlIEZST00gTWV0YSBXSEVSRSBrZXk9J3JldmlzaW9uJyIpOworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghZGJpX3Jlc3VsdF9uZXh0X3JvdyhyZXN1bHQpKSB7CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV2ID0gZGJpX3Jlc3VsdF9nZXRfc3RyaW5nKHJlc3VsdCwgInZhbHVlIik7CisJaWYgKCFyZXYgfHwgYXRvaShyZXYpICE9IDIpIHsKKwkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCXJldHVybiAwOworfQorCitpbnQgZGJfaW5pdChjb25zdCBjaGFyICpuYW1lKQoreworCWRiaV9pbml0aWFsaXplKE5VTEwpOworCisJY29ubiA9IGRiaV9jb25uX25ldygic3FsaXRlMyIpOworCWlmIChjb25uID09IE5VTEwpIHsKKwkJTE9HUChEREIsIExPR0xfRkFUQUwsICJGYWlsZWQgdG8gY3JlYXRlIGNvbm5lY3Rpb24uXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZGJpX2Nvbm5fZXJyb3JfaGFuZGxlciggY29ubiwgZGJfZXJyb3JfZnVuYywgTlVMTCApOworCisJLyogTXlTUUwKKwlkYmlfY29ubl9zZXRfb3B0aW9uKGNvbm4sICJob3N0IiwgImxvY2FsaG9zdCIpOworCWRiaV9jb25uX3NldF9vcHRpb24oY29ubiwgInVzZXJuYW1lIiwgInlvdXJfbmFtZSIpOworCWRiaV9jb25uX3NldF9vcHRpb24oY29ubiwgInBhc3N3b3JkIiwgInlvdXJfcGFzc3dvcmQiKTsKKwlkYmlfY29ubl9zZXRfb3B0aW9uKGNvbm4sICJkYm5hbWUiLCAieW91cl9kYm5hbWUiKTsKKwlkYmlfY29ubl9zZXRfb3B0aW9uKGNvbm4sICJlbmNvZGluZyIsICJVVEYtOCIpOworCSovCisKKwkvKiBTcUxpdGUgMyAqLworCWRiX2Jhc2VuYW1lID0gc3RyZHVwKG5hbWUpOworCWRiX2Rpcm5hbWUgPSBzdHJkdXAobmFtZSk7CisJZGJpX2Nvbm5fc2V0X29wdGlvbihjb25uLCAic3FsaXRlM19kYmRpciIsIGRpcm5hbWUoZGJfZGlybmFtZSkpOworCWRiaV9jb25uX3NldF9vcHRpb24oY29ubiwgImRibmFtZSIsIGJhc2VuYW1lKGRiX2Jhc2VuYW1lKSk7CisKKwlpZiAoZGJpX2Nvbm5fY29ubmVjdChjb25uKSA8IDApCisJCWdvdG8gb3V0X2VycjsKKworCXJldHVybiAwOworCitvdXRfZXJyOgorCWZyZWUoZGJfZGlybmFtZSk7CisJZnJlZShkYl9iYXNlbmFtZSk7CisJZGJfZGlybmFtZSA9IGRiX2Jhc2VuYW1lID0gTlVMTDsKKwlyZXR1cm4gLTE7Cit9CisKKworaW50IGRiX3ByZXBhcmUoKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3JlYXRlX3N0bXRzKTsgaSsrKSB7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5KGNvbm4sIGNyZWF0ZV9zdG10c1tpXSk7CisJCWlmICghcmVzdWx0KSB7CisJCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwKKwkJCSAgICAgIkZhaWxlZCB0byBjcmVhdGUgc29tZSB0YWJsZS5cbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJfQorCisJaWYgKGNoZWNrX2RiX3JldmlzaW9uKCkgPCAwKSB7CisJCUxPR1AoRERCLCBMT0dMX0ZBVEFMLCAiRGF0YWJhc2Ugc2NoZW1hIHJldmlzaW9uIGludmFsaWQsICIKKwkJCSJwbGVhc2UgdXBkYXRlIHlvdXIgZGF0YWJhc2Ugc2NoZW1hXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBkYl9maW5pKCkKK3sKKwlkYmlfY29ubl9jbG9zZShjb25uKTsKKwlkYmlfc2h1dGRvd24oKTsKKworCWlmIChkYl9kaXJuYW1lKQorCSAgICBmcmVlKGRiX2Rpcm5hbWUpOworCWlmIChkYl9iYXNlbmFtZSkKKwkgICAgZnJlZShkYl9iYXNlbmFtZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqZGJfY3JlYXRlX3N1YnNjcmliZXIoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGNoYXIgKmltc2kpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisKKwkvKiBJcyB0aGlzIHN1YnNjcmliZXIga25vd24gaW4gdGhlIGRiPyAqLworCXN1YnNjciA9IGRiX2dldF9zdWJzY3JpYmVyKG5ldCwgR1NNX1NVQlNDUklCRVJfSU1TSSwgaW1zaSk7CisJaWYgKHN1YnNjcikgeworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVVBEQVRFIFN1YnNjcmliZXIgc2V0IHVwZGF0ZWQgPSBkYXRldGltZSgnbm93JykgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJXSEVSRSBpbXNpID0gJXMgIiAsIGltc2kpOworCQlpZiAoIXJlc3VsdCkKKwkJCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiZmFpbGVkIHRvIHVwZGF0ZSB0aW1lc3RhbXBcbiIpOworCQllbHNlCisJCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJcmV0dXJuIHN1YnNjcjsKKwl9CisKKwlzdWJzY3IgPSBzdWJzY3JfYWxsb2MoKTsKKwlzdWJzY3ItPmZsYWdzIHw9IEdTTV9TVUJTQ1JJQkVSX0ZJUlNUX0NPTlRBQ1Q7CisJaWYgKCFzdWJzY3IpCisJCXJldHVybiBOVUxMOworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiSU5TRVJUIElOVE8gU3Vic2NyaWJlciAiCisJCSIoaW1zaSwgY3JlYXRlZCwgdXBkYXRlZCkgIgorCQkiVkFMVUVTICIKKwkJIiglcywgZGF0ZXRpbWUoJ25vdycpLCBkYXRldGltZSgnbm93JykpICIsCisJCWltc2kKKwkpOworCWlmICghcmVzdWx0KQorCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgU3Vic2NyaWJlciBieSBJTVNJLlxuIik7CisJc3Vic2NyLT5uZXQgPSBuZXQ7CisJc3Vic2NyLT5pZCA9IGRiaV9jb25uX3NlcXVlbmNlX2xhc3QoY29ubiwgTlVMTCk7CisJc3RybmNweShzdWJzY3ItPmltc2ksIGltc2ksIEdTTV9JTVNJX0xFTkdUSC0xKTsKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwlMT0dQKEREQiwgTE9HTF9JTkZPLCAiTmV3IFN1YnNjcmliZXI6IElEICVsbHUsIElNU0kgJXNcbiIsIHN1YnNjci0+aWQsIHN1YnNjci0+aW1zaSk7CisJZGJfc3Vic2NyaWJlcl9hbGxvY19leHRlbihzdWJzY3IpOworCXJldHVybiBzdWJzY3I7Cit9CisKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHVuc2lnbmVkIGNoYXIpID09IHNpemVvZihzdHJ1Y3QgZ3NtNDhfY2xhc3NtYXJrMSksIGNsYXNzbWFyazFfc2l6ZSk7CisKK3N0YXRpYyBpbnQgZ2V0X2VxdWlwbWVudF9ieV9zdWJzY3Ioc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJY29uc3QgY2hhciAqc3RyaW5nOworCXVuc2lnbmVkIGNoYXIgY20xOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmNtMiwgKmNtMzsKKwlzdHJ1Y3QgZ3NtX2VxdWlwbWVudCAqZXF1aXAgPSAmc3Vic2NyLT5lcXVpcG1lbnQ7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCQkiU0VMRUNUIGVxdWlwbWVudC4qIEZST00gRXF1aXBtZW50LEVxdWlwbWVudFdhdGNoICIKKwkJCQkiV0hFUkUgRXF1aXBtZW50V2F0Y2guZXF1aXBtZW50X2lkPUVxdWlwbWVudC5pZCAiCisJCQkJIkFORCBFcXVpcG1lbnRXYXRjaC5zdWJzY3JpYmVyX2lkID0gJWxsdSAiCisJCQkJIk9SREVSIEJZIHVwZGF0ZWQgREVTQyIsIHN1YnNjci0+aWQpOworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gLUVJTzsKKworCWlmICghZGJpX3Jlc3VsdF9uZXh0X3JvdyhyZXN1bHQpKSB7CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwllcXVpcC0+aWQgPSBkYmlfcmVzdWx0X2dldF91bG9uZ2xvbmcocmVzdWx0LCAiaWQiKTsKKworCXN0cmluZyA9IGRiaV9yZXN1bHRfZ2V0X3N0cmluZyhyZXN1bHQsICJpbWVpIik7CisJaWYgKHN0cmluZykKKwkJc3RybmNweShlcXVpcC0+aW1laSwgc3RyaW5nLCBzaXplb2YoZXF1aXAtPmltZWkpKTsKKworCXN0cmluZyA9IGRiaV9yZXN1bHRfZ2V0X3N0cmluZyhyZXN1bHQsICJjbGFzc21hcmsxIik7CisJaWYgKHN0cmluZykgeworCQljbTEgPSBhdG9pKHN0cmluZykgJiAweGZmOworCQltZW1jcHkoJmVxdWlwLT5jbGFzc21hcmsxLCAmY20xLCBzaXplb2YoZXF1aXAtPmNsYXNzbWFyazEpKTsKKwl9CisKKwllcXVpcC0+Y2xhc3NtYXJrMl9sZW4gPSBkYmlfcmVzdWx0X2dldF9maWVsZF9sZW5ndGgocmVzdWx0LCAiY2xhc3NtYXJrMiIpOworCWNtMiA9IGRiaV9yZXN1bHRfZ2V0X2JpbmFyeShyZXN1bHQsICJjbGFzc21hcmsyIik7CisJaWYgKGVxdWlwLT5jbGFzc21hcmsyX2xlbiA+IHNpemVvZihlcXVpcC0+Y2xhc3NtYXJrMikpCisJCWVxdWlwLT5jbGFzc21hcmsyX2xlbiA9IHNpemVvZihlcXVpcC0+Y2xhc3NtYXJrMik7CisJbWVtY3B5KGVxdWlwLT5jbGFzc21hcmsyLCBjbTIsIGVxdWlwLT5jbGFzc21hcmsyX2xlbik7CisKKwllcXVpcC0+Y2xhc3NtYXJrM19sZW4gPSBkYmlfcmVzdWx0X2dldF9maWVsZF9sZW5ndGgocmVzdWx0LCAiY2xhc3NtYXJrMyIpOworCWNtMyA9IGRiaV9yZXN1bHRfZ2V0X2JpbmFyeShyZXN1bHQsICJjbGFzc21hcmszIik7CisJaWYgKGVxdWlwLT5jbGFzc21hcmszX2xlbiA+IHNpemVvZihlcXVpcC0+Y2xhc3NtYXJrMykpCisJCWVxdWlwLT5jbGFzc21hcmszX2xlbiA9IHNpemVvZihlcXVpcC0+Y2xhc3NtYXJrMyk7CisJbWVtY3B5KGVxdWlwLT5jbGFzc21hcmszLCBjbTMsIGVxdWlwLT5jbGFzc21hcmszX2xlbik7CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCXJldHVybiAwOworfQorCitpbnQgZ2V0X2F1dGhpbmZvX2J5X3N1YnNjcihzdHJ1Y3QgZ3NtX2F1dGhfaW5mbyAqYWluZm8sCisJCQkgICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICphM2E4X2tpOworCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQkiU0VMRUNUICogRlJPTSBBdXRoS2V5cyBXSEVSRSBzdWJzY3JpYmVyX2lkPSV1IiwKKwkJCSBzdWJzY3ItPmlkKTsKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoIWRiaV9yZXN1bHRfbmV4dF9yb3cocmVzdWx0KSkgeworCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJYWluZm8tPmF1dGhfYWxnbyA9IGRiaV9yZXN1bHRfZ2V0X3Vsb25nbG9uZyhyZXN1bHQsICJhbGdvcml0aG1faWQiKTsKKwlhaW5mby0+YTNhOF9raV9sZW4gPSBkYmlfcmVzdWx0X2dldF9maWVsZF9sZW5ndGgocmVzdWx0LCAiYTNhOF9raSIpOworCWEzYThfa2kgPSBkYmlfcmVzdWx0X2dldF9iaW5hcnkocmVzdWx0LCAiYTNhOF9raSIpOworCWlmIChhaW5mby0+YTNhOF9raV9sZW4gPiBzaXplb2YoYWluZm8tPmEzYThfa2kpKQorCQlhaW5mby0+YTNhOF9raV9sZW4gPSBzaXplb2YoYWluZm8tPmEzYThfa2lfbGVuKTsKKwltZW1jcHkoYWluZm8tPmEzYThfa2ksIGEzYThfa2ksIGFpbmZvLT5hM2E4X2tpX2xlbik7CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCXJldHVybiAwOworfQorCitpbnQgc2V0X2F1dGhpbmZvX2Zvcl9zdWJzY3Ioc3RydWN0IGdzbV9hdXRoX2luZm8gKmFpbmZvLAorCQkJICAgIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCXN0cnVjdCBnc21fYXV0aF9pbmZvIGFpbmZvX29sZDsKKwlpbnQgcmMsIHVwZDsKKwl1bnNpZ25lZCBjaGFyICpraV9zdHI7CisKKwkvKiBEZWxldGlvbiA/ICovCisJaWYgKGFpbmZvID09IE5VTEwpIHsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQkiREVMRVRFIEZST00gQXV0aEtleXMgV0hFUkUgc3Vic2NyaWJlcl9pZD0ldSIsCisJCQlzdWJzY3ItPmlkKTsKKworCQlpZiAoIXJlc3VsdCkKKwkJCXJldHVybiAtRUlPOworCisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCisJCXJldHVybiAwOworCX0KKworCS8qIENoZWNrIGlmIGFscmVhZHkgZXhpc3RpbmcgKi8KKwlyYyA9IGdldF9hdXRoaW5mb19ieV9zdWJzY3IoJmFpbmZvX29sZCwgc3Vic2NyKTsKKwlpZiAocmMgJiYgcmMgIT0gLUVOT0VOVCkKKwkJcmV0dXJuIHJjOworCXVwZCA9IHJjID8gMCA6IDE7CisKKwkvKiBVcGRhdGUgLyBJbnNlcnQgKi8KKwlkYmlfY29ubl9xdW90ZV9iaW5hcnlfY29weShjb25uLAorCQlhaW5mby0+YTNhOF9raSwgYWluZm8tPmEzYThfa2lfbGVuLCAma2lfc3RyKTsKKworCWlmICghdXBkKSB7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJCSJJTlNFUlQgSU5UTyBBdXRoS2V5cyAiCisJCQkJIihzdWJzY3JpYmVyX2lkLCBhbGdvcml0aG1faWQsIGEzYThfa2kpICIKKwkJCQkiVkFMVUVTICgldSwgJXUsICVzKSIsCisJCQkJc3Vic2NyLT5pZCwgYWluZm8tPmF1dGhfYWxnbywga2lfc3RyKTsKKwl9IGVsc2UgeworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCQkiVVBEQVRFIEF1dGhLZXlzICIKKwkJCQkiU0VUIGFsZ29yaXRobV9pZD0ldSwgYTNhOF9raT0lcyAiCisJCQkJIldIRVJFIHN1YnNjcmliZXJfaWQ9JXUiLAorCQkJCWFpbmZvLT5hdXRoX2FsZ28sIGtpX3N0ciwgc3Vic2NyLT5pZCk7CisJfQorCisJZnJlZShraV9zdHIpOworCisJaWYgKCFyZXN1bHQpCisJCXJldHVybiAtRUlPOworCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGdldF9hdXRodHVwbGVfYnlfc3Vic2NyKHN0cnVjdCBnc21fYXV0aF90dXBsZSAqYXR1cGxlLAorCQkJICAgIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCWludCBsZW47CisJY29uc3QgdW5zaWduZWQgY2hhciAqYmxvYjsKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJIlNFTEVDVCAqIEZST00gQXV0aFR1cGxlcyBXSEVSRSBzdWJzY3JpYmVyX2lkPSV1IiwKKwkJCXN1YnNjci0+aWQpOworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gLUVJTzsKKworCWlmICghZGJpX3Jlc3VsdF9uZXh0X3JvdyhyZXN1bHQpKSB7CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwltZW1zZXQoYXR1cGxlLCAwLCBzaXplb2YoYXR1cGxlKSk7CisKKwlhdHVwbGUtPnVzZV9jb3VudCA9IGRiaV9yZXN1bHRfZ2V0X3Vsb25nbG9uZyhyZXN1bHQsICJ1c2VfY291bnQiKTsKKwlhdHVwbGUtPmtleV9zZXEgPSBkYmlfcmVzdWx0X2dldF91bG9uZ2xvbmcocmVzdWx0LCAia2V5X3NlcSIpOworCisJbGVuID0gZGJpX3Jlc3VsdF9nZXRfZmllbGRfbGVuZ3RoKHJlc3VsdCwgInJhbmQiKTsKKwlpZiAobGVuICE9IHNpemVvZihhdHVwbGUtPnJhbmQpKQorCQlnb3RvIGVycl9zaXplOworCisJYmxvYiA9IGRiaV9yZXN1bHRfZ2V0X2JpbmFyeShyZXN1bHQsICJyYW5kIik7CisJbWVtY3B5KGF0dXBsZS0+cmFuZCwgYmxvYiwgbGVuKTsKKworCWxlbiA9IGRiaV9yZXN1bHRfZ2V0X2ZpZWxkX2xlbmd0aChyZXN1bHQsICJzcmVzIik7CisJaWYgKGxlbiAhPSBzaXplb2YoYXR1cGxlLT5zcmVzKSkKKwkJZ290byBlcnJfc2l6ZTsKKworCWJsb2IgPSBkYmlfcmVzdWx0X2dldF9iaW5hcnkocmVzdWx0LCAic3JlcyIpOworCW1lbWNweShhdHVwbGUtPnNyZXMsIGJsb2IsIGxlbik7CisKKwlsZW4gPSBkYmlfcmVzdWx0X2dldF9maWVsZF9sZW5ndGgocmVzdWx0LCAia2MiKTsKKwlpZiAobGVuICE9IHNpemVvZihhdHVwbGUtPmtjKSkKKwkJZ290byBlcnJfc2l6ZTsKKworCWJsb2IgPSBkYmlfcmVzdWx0X2dldF9iaW5hcnkocmVzdWx0LCAia2MiKTsKKwltZW1jcHkoYXR1cGxlLT5rYywgYmxvYiwgbGVuKTsKKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCisJcmV0dXJuIDA7CisKK2Vycl9zaXplOgorCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCXJldHVybiAtRUlPOworfQorCitpbnQgc2V0X2F1dGh0dXBsZV9mb3Jfc3Vic2NyKHN0cnVjdCBnc21fYXV0aF90dXBsZSAqYXR1cGxlLAorCQkJICAgICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwlpbnQgcmMsIHVwZDsKKwlzdHJ1Y3QgZ3NtX2F1dGhfdHVwbGUgYXR1cGxlX29sZDsKKwl1bnNpZ25lZCBjaGFyICpyYW5kX3N0ciwgKnNyZXNfc3RyLCAqa2Nfc3RyOworCisJLyogRGVsZXRpb24gPyAqLworCWlmIChhdHVwbGUgPT0gTlVMTCkgeworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCSJERUxFVEUgRlJPTSBBdXRoVHVwbGVzIFdIRVJFIHN1YnNjcmliZXJfaWQ9JXUiLAorCQkJc3Vic2NyLT5pZCk7CisKKwkJaWYgKCFyZXN1bHQpCisJCQlyZXR1cm4gLUVJTzsKKworCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDaGVjayBpZiBhbHJlYWR5IGV4aXN0aW5nICovCisJcmMgPSBnZXRfYXV0aHR1cGxlX2J5X3N1YnNjcigmYXR1cGxlX29sZCwgc3Vic2NyKTsKKwlpZiAocmMgJiYgcmMgIT0gLUVOT0VOVCkKKwkJcmV0dXJuIHJjOworCXVwZCA9IHJjID8gMCA6IDE7CisKKwkvKiBVcGRhdGUgLyBJbnNlcnQgKi8KKwlkYmlfY29ubl9xdW90ZV9iaW5hcnlfY29weShjb25uLAorCQlhdHVwbGUtPnJhbmQsIHNpemVvZihhdHVwbGUtPnJhbmQpLCAmcmFuZF9zdHIpOworCWRiaV9jb25uX3F1b3RlX2JpbmFyeV9jb3B5KGNvbm4sCisJCWF0dXBsZS0+c3Jlcywgc2l6ZW9mKGF0dXBsZS0+c3JlcyksICZzcmVzX3N0cik7CisJZGJpX2Nvbm5fcXVvdGVfYmluYXJ5X2NvcHkoY29ubiwKKwkJYXR1cGxlLT5rYywgc2l6ZW9mKGF0dXBsZS0+a2MpLCAma2Nfc3RyKTsKKworCWlmICghdXBkKSB7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJCSJJTlNFUlQgSU5UTyBBdXRoVHVwbGVzICIKKwkJCQkiKHN1YnNjcmliZXJfaWQsIGlzc3VlZCwgdXNlX2NvdW50LCAiCisJCQkJICJrZXlfc2VxLCByYW5kLCBzcmVzLCBrYykgIgorCQkJCSJWQUxVRVMgKCV1LCBkYXRldGltZSgnbm93JyksICV1LCAiCisJCQkJICIldSwgJXMsICVzLCAlcyApICIsCisJCQkJc3Vic2NyLT5pZCwgYXR1cGxlLT51c2VfY291bnQsIGF0dXBsZS0+a2V5X3NlcSwKKwkJCQlyYW5kX3N0ciwgc3Jlc19zdHIsIGtjX3N0cik7CisJfSBlbHNlIHsKKwkJY2hhciAqaXNzdWVkID0gYXR1cGxlLT5rZXlfc2VxID09IGF0dXBsZV9vbGQua2V5X3NlcSA/CisJCQkJCSJpc3N1ZWQiIDogImRhdGV0aW1lKCdub3cnKSI7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJCSJVUERBVEUgQXV0aEtleXMgIgorCQkJCSJTRVQgaXNzdWVkPSVzLCB1c2VfY291bnQ9JXUsICIKKwkJCQkgImtleV9zZXE9JXUsIHJhbmQ9JXMsIHNyZXM9JXMsIGtjPSVzICIKKwkJCQkiV0hFUkUgc3Vic2NyaWJlcl9pZCA9ICV1IiwKKwkJCQlpc3N1ZWQsIGF0dXBsZS0+dXNlX2NvdW50LCBhdHVwbGUtPmtleV9zZXEsCisJCQkJcmFuZF9zdHIsIHNyZXNfc3RyLCBrY19zdHIsIHN1YnNjci0+aWQpOworCX0KKworCWZyZWUocmFuZF9zdHIpOworCWZyZWUoc3Jlc19zdHIpOworCWZyZWUoa2Nfc3RyKTsKKworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gLUVJTzsKKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQkFTRV9RVUVSWSAiU0VMRUNUICogRlJPTSBTdWJzY3JpYmVyICIKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqZGJfZ2V0X3N1YnNjcmliZXIoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCSBlbnVtIGdzbV9zdWJzY3JpYmVyX2ZpZWxkIGZpZWxkLAorCQkJCQkgY29uc3QgY2hhciAqaWQpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJY29uc3QgY2hhciAqc3RyaW5nOworCWNoYXIgKnF1b3RlZDsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKworCXN3aXRjaCAoZmllbGQpIHsKKwljYXNlIEdTTV9TVUJTQ1JJQkVSX0lNU0k6CisJCWRiaV9jb25uX3F1b3RlX3N0cmluZ19jb3B5KGNvbm4sIGlkLCAmcXVvdGVkKTsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQlCQVNFX1FVRVJZCisJCQkiV0hFUkUgaW1zaSA9ICVzICIsCisJCQlxdW90ZWQKKwkJKTsKKwkJZnJlZShxdW90ZWQpOworCQlicmVhazsKKwljYXNlIEdTTV9TVUJTQ1JJQkVSX1RNU0k6CisJCWRiaV9jb25uX3F1b3RlX3N0cmluZ19jb3B5KGNvbm4sIGlkLCAmcXVvdGVkKTsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQlCQVNFX1FVRVJZCisJCQkiV0hFUkUgdG1zaSA9ICVzICIsCisJCQlxdW90ZWQKKwkJKTsKKwkJZnJlZShxdW90ZWQpOworCQlicmVhazsKKwljYXNlIEdTTV9TVUJTQ1JJQkVSX0VYVEVOU0lPTjoKKwkJZGJpX2Nvbm5fcXVvdGVfc3RyaW5nX2NvcHkoY29ubiwgaWQsICZxdW90ZWQpOworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCUJBU0VfUVVFUlkKKwkJCSJXSEVSRSBleHRlbnNpb24gPSAlcyAiLAorCQkJcXVvdGVkCisJCSk7CisJCWZyZWUocXVvdGVkKTsKKwkJYnJlYWs7CisJY2FzZSBHU01fU1VCU0NSSUJFUl9JRDoKKwkJZGJpX2Nvbm5fcXVvdGVfc3RyaW5nX2NvcHkoY29ubiwgaWQsICZxdW90ZWQpOworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCUJBU0VfUVVFUlkKKwkJCSJXSEVSRSBpZCA9ICVzICIsIHF1b3RlZCk7CisJCWZyZWUocXVvdGVkKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEREIsIExPR0xfTk9USUNFLCAiVW5rbm93biBxdWVyeSBzZWxlY3RvciBmb3IgU3Vic2NyaWJlci5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKCFyZXN1bHQpIHsKKwkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gcXVlcnkgU3Vic2NyaWJlci5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKCFkYmlfcmVzdWx0X25leHRfcm93KHJlc3VsdCkpIHsKKwkJREVCVUdQKEREQiwgIkZhaWxlZCB0byBmaW5kIHRoZSBTdWJzY3JpYmVyLiAnJXUnICclcydcbiIsCisJCQlmaWVsZCwgaWQpOworCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc3Vic2NyID0gc3Vic2NyX2FsbG9jKCk7CisJc3Vic2NyLT5uZXQgPSBuZXQ7CisJc3Vic2NyLT5pZCA9IGRiaV9yZXN1bHRfZ2V0X3Vsb25nbG9uZyhyZXN1bHQsICJpZCIpOworCXN0cmluZyA9IGRiaV9yZXN1bHRfZ2V0X3N0cmluZyhyZXN1bHQsICJpbXNpIik7CisJaWYgKHN0cmluZykKKwkJc3RybmNweShzdWJzY3ItPmltc2ksIHN0cmluZywgR1NNX0lNU0lfTEVOR1RIKTsKKworCXN0cmluZyA9IGRiaV9yZXN1bHRfZ2V0X3N0cmluZyhyZXN1bHQsICJ0bXNpIik7CisJaWYgKHN0cmluZykKKwkJc3Vic2NyLT50bXNpID0gdG1zaV9mcm9tX3N0cmluZyhzdHJpbmcpOworCisJc3RyaW5nID0gZGJpX3Jlc3VsdF9nZXRfc3RyaW5nKHJlc3VsdCwgIm5hbWUiKTsKKwlpZiAoc3RyaW5nKQorCQlzdHJuY3B5KHN1YnNjci0+bmFtZSwgc3RyaW5nLCBHU01fTkFNRV9MRU5HVEgpOworCisJc3RyaW5nID0gZGJpX3Jlc3VsdF9nZXRfc3RyaW5nKHJlc3VsdCwgImV4dGVuc2lvbiIpOworCWlmIChzdHJpbmcpCisJCXN0cm5jcHkoc3Vic2NyLT5leHRlbnNpb24sIHN0cmluZywgR1NNX0VYVEVOU0lPTl9MRU5HVEgpOworCisJc3Vic2NyLT5sYWMgPSBkYmlfcmVzdWx0X2dldF91aW50KHJlc3VsdCwgImxhYyIpOworCXN1YnNjci0+YXV0aG9yaXplZCA9IGRiaV9yZXN1bHRfZ2V0X3VpbnQocmVzdWx0LCAiYXV0aG9yaXplZCIpOworCURFQlVHUChEREIsICJGb3VuZCBTdWJzY3JpYmVyOiBJRCAlbGx1LCBJTVNJICVzLCBOQU1FICclcycsIFRNU0kgJXUsIEVYVEVOICclcycsIExBQyAlaHUsIEFVVEggJXVcbiIsCisJCXN1YnNjci0+aWQsIHN1YnNjci0+aW1zaSwgc3Vic2NyLT5uYW1lLCBzdWJzY3ItPnRtc2ksIHN1YnNjci0+ZXh0ZW5zaW9uLAorCQlzdWJzY3ItPmxhYywgc3Vic2NyLT5hdXRob3JpemVkKTsKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCWdldF9lcXVpcG1lbnRfYnlfc3Vic2NyKHN1YnNjcik7CisKKwlyZXR1cm4gc3Vic2NyOworfQorCitpbnQgZGJfc3luY19zdWJzY3JpYmVyKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyaWJlcikKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwljaGFyIHRtc2lbMTRdOworCWNoYXIgKnFfdG1zaTsKKworCWlmIChzdWJzY3JpYmVyLT50bXNpICE9IEdTTV9SRVNFUlZFRF9UTVNJKSB7CisJCXNwcmludGYodG1zaSwgIiV1Iiwgc3Vic2NyaWJlci0+dG1zaSk7CisJCWRiaV9jb25uX3F1b3RlX3N0cmluZ19jb3B5KGNvbm4sCisJCQkJICAgdG1zaSwKKwkJCQkgICAmcV90bXNpKTsKKwl9IGVsc2UKKwkJcV90bXNpID0gc3RyZHVwKCJOVUxMIik7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIlVQREFURSBTdWJzY3JpYmVyICIKKwkJIlNFVCB1cGRhdGVkID0gZGF0ZXRpbWUoJ25vdycpLCAiCisJCSJuYW1lID0gJyVzJywgIgorCQkiZXh0ZW5zaW9uID0gJyVzJywgIgorCQkiYXV0aG9yaXplZCA9ICVpLCAiCisJCSJ0bXNpID0gJXMsICIKKwkJImxhYyA9ICVpICIKKwkJIldIRVJFIGltc2kgPSAlcyAiLAorCQlzdWJzY3JpYmVyLT5uYW1lLAorCQlzdWJzY3JpYmVyLT5leHRlbnNpb24sCisJCXN1YnNjcmliZXItPmF1dGhvcml6ZWQsCisJCXFfdG1zaSwKKwkJc3Vic2NyaWJlci0+bGFjLAorCQlzdWJzY3JpYmVyLT5pbXNpKTsKKworCWZyZWUocV90bXNpKTsKKworCWlmICghcmVzdWx0KSB7CisJCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIHVwZGF0ZSBTdWJzY3JpYmVyIChieSBJTVNJKS5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCXJldHVybiAwOworfQorCitpbnQgZGJfc3luY19lcXVpcG1lbnQoc3RydWN0IGdzbV9lcXVpcG1lbnQgKmVxdWlwKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCXVuc2lnbmVkIGNoYXIgKmNtMiwgKmNtMzsKKwl1X2ludDhfdCBjbGFzc21hcmsxOworCisJbWVtY3B5KCZjbGFzc21hcmsxLCAmZXF1aXAtPmNsYXNzbWFyazEsIHNpemVvZihjbGFzc21hcmsxKSk7CisJREVCVUdQKEREQiwgIlN5bmMgRXF1aXBtZW50IElNRUk9JXMsIGNsYXNzbWFyazE9JTAyeCIsCisJCWVxdWlwLT5pbWVpLCBjbGFzc21hcmsxKTsKKwlpZiAoZXF1aXAtPmNsYXNzbWFyazJfbGVuKQorCQlERUJVR1BDKEREQiwgIiwgY2xhc3NtYXJrMj0lcyIsCisJCQloZXhkdW1wKGVxdWlwLT5jbGFzc21hcmsyLCBlcXVpcC0+Y2xhc3NtYXJrMl9sZW4pKTsKKwlpZiAoZXF1aXAtPmNsYXNzbWFyazNfbGVuKQorCQlERUJVR1BDKEREQiwgIiwgY2xhc3NtYXJrMz0lcyIsCisJCQloZXhkdW1wKGVxdWlwLT5jbGFzc21hcmszLCBlcXVpcC0+Y2xhc3NtYXJrM19sZW4pKTsKKwlERUJVR1BDKEREQiwgIlxuIik7CisKKwlkYmlfY29ubl9xdW90ZV9iaW5hcnlfY29weShjb25uLCBlcXVpcC0+Y2xhc3NtYXJrMiwKKwkJCQkgICBlcXVpcC0+Y2xhc3NtYXJrMl9sZW4sICZjbTIpOworCWRiaV9jb25uX3F1b3RlX2JpbmFyeV9jb3B5KGNvbm4sIGVxdWlwLT5jbGFzc21hcmszLAorCQkJCSAgIGVxdWlwLT5jbGFzc21hcmszX2xlbiwgJmNtMyk7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIlVQREFURSBFcXVpcG1lbnQgU0VUICIKKwkJCSJ1cGRhdGVkID0gZGF0ZXRpbWUoJ25vdycpLCAiCisJCQkiY2xhc3NtYXJrMSA9ICV1LCAiCisJCQkiY2xhc3NtYXJrMiA9ICVzLCAiCisJCQkiY2xhc3NtYXJrMyA9ICVzICIKKwkJIldIRVJFIGltZWkgPSAnJXMnICIsCisJCWNsYXNzbWFyazEsIGNtMiwgY20zLCBlcXVpcC0+aW1laSk7CisKKwlmcmVlKGNtMik7CisJZnJlZShjbTMpOworCisJaWYgKCFyZXN1bHQpIHsKKwkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gdXBkYXRlIEVxdWlwbWVudFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCXJldHVybiAwOworfQorCitpbnQgZGJfc3Vic2NyaWJlcl9hbGxvY190bXNpKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyaWJlcikKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdCA9IE5VTEw7CisJY2hhciB0bXNpWzE0XTsKKwljaGFyKiB0bXNpX3F1b3RlZDsKKworCWZvciAoOzspIHsKKwkJc3Vic2NyaWJlci0+dG1zaSA9IHJhbmQoKTsKKwkJaWYgKHN1YnNjcmliZXItPnRtc2kgPT0gR1NNX1JFU0VSVkVEX1RNU0kpCisJCQljb250aW51ZTsKKworCQlzcHJpbnRmKHRtc2ksICIldSIsIHN1YnNjcmliZXItPnRtc2kpOworCQlkYmlfY29ubl9xdW90ZV9zdHJpbmdfY29weShjb25uLCB0bXNpLCAmdG1zaV9xdW90ZWQpOworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCSJTRUxFQ1QgKiBGUk9NIFN1YnNjcmliZXIgIgorCQkJIldIRVJFIHRtc2kgPSAlcyAiLAorCQkJdG1zaV9xdW90ZWQpOworCisJCWZyZWUodG1zaV9xdW90ZWQpOworCisJCWlmICghcmVzdWx0KSB7CisJCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBxdWVyeSBTdWJzY3JpYmVyICIKKwkJCQkid2hpbGUgYWxsb2NhdGluZyBuZXcgVE1TSS5cbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKGRiaV9yZXN1bHRfZ2V0X251bXJvd3MocmVzdWx0KSkgeworCQkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIWRiaV9yZXN1bHRfbmV4dF9yb3cocmVzdWx0KSkgeworCQkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCQlERUJVR1AoRERCLCAiQWxsb2NhdGVkIFRNU0kgJXUgZm9yIElNU0kgJXMuXG4iLAorCQkJCXN1YnNjcmliZXItPnRtc2ksIHN1YnNjcmliZXItPmltc2kpOworCQkJcmV0dXJuIGRiX3N5bmNfc3Vic2NyaWJlcihzdWJzY3JpYmVyKTsKKwkJfQorCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBkYl9zdWJzY3JpYmVyX2FsbG9jX2V4dGVuKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyaWJlcikKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdCA9IE5VTEw7CisJdV9pbnQzMl90IHRyeTsKKworCWZvciAoOzspIHsKKwkJdHJ5ID0gKHJhbmQoKSUoR1NNX01BWF9FWFRFTi1HU01fTUlOX0VYVEVOKzEpK0dTTV9NSU5fRVhURU4pOworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCSJTRUxFQ1QgKiBGUk9NIFN1YnNjcmliZXIgIgorCQkJIldIRVJFIGV4dGVuc2lvbiA9ICVpIiwKKwkJCXRyeQorCQkpOworCQlpZiAoIXJlc3VsdCkgeworCQkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gcXVlcnkgU3Vic2NyaWJlciAiCisJCQkJIndoaWxlIGFsbG9jYXRpbmcgbmV3IGV4dGVuc2lvbi5cbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKGRiaV9yZXN1bHRfZ2V0X251bXJvd3MocmVzdWx0KSl7CisJCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghZGJpX3Jlc3VsdF9uZXh0X3JvdyhyZXN1bHQpKSB7CisJCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJCWJyZWFrOworCQl9CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCX0KKwlzcHJpbnRmKHN1YnNjcmliZXItPmV4dGVuc2lvbiwgIiVpIiwgdHJ5KTsKKwlERUJVR1AoRERCLCAiQWxsb2NhdGVkIGV4dGVuc2lvbiAlaSBmb3IgSU1TSSAlcy5cbiIsIHRyeSwgc3Vic2NyaWJlci0+aW1zaSk7CisJcmV0dXJuIGRiX3N5bmNfc3Vic2NyaWJlcihzdWJzY3JpYmVyKTsKK30KKy8qCisgKiB0cnkgdG8gYWxsb2NhdGUgYSBuZXcgdW5pcXVlIHRva2VuIGZvciB0aGlzIHN1YnNjcmliZXIgYW5kIHJldHVybiBpdAorICogdmlhIGEgcGFyYW1ldGVyLiBpZiB0aGUgc3Vic2NyaWJlciBhbHJlYWR5IGhhcyBhIHRva2VuLCByZXR1cm4KKyAqIGFuIGVycm9yLgorICovCisKK2ludCBkYl9zdWJzY3JpYmVyX2FsbG9jX3Rva2VuKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyaWJlciwgdV9pbnQzMl90ICp0b2tlbikKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwl1X2ludDMyX3QgdHJ5OworCisJZm9yICg7OykgeworCQl0cnkgPSByYW5kKCk7CisJCWlmICghdHJ5KSAvKiAwIGlzIGFuIGludmFsaWQgdG9rZW4gKi8KKwkJCWNvbnRpbnVlOworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCSJTRUxFQ1QgKiBGUk9NIEF1dGhUb2tlbiAiCisJCQkiV0hFUkUgc3Vic2NyaWJlcl9pZCA9ICVsbHUgT1IgdG9rZW4gPSBcIiUwOFhcIiAiLAorCQkJc3Vic2NyaWJlci0+aWQsIHRyeSk7CisJCWlmICghcmVzdWx0KSB7CisJCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBxdWVyeSBBdXRoVG9rZW4gIgorCQkJCSJ3aGlsZSBhbGxvY2F0aW5nIG5ldyB0b2tlbi5cbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKGRiaV9yZXN1bHRfZ2V0X251bXJvd3MocmVzdWx0KSkgeworCQkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIWRiaV9yZXN1bHRfbmV4dF9yb3cocmVzdWx0KSkgeworCQkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCQlicmVhazsKKwkJfQorCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwl9CisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCSJJTlNFUlQgSU5UTyBBdXRoVG9rZW4gIgorCQkiKHN1YnNjcmliZXJfaWQsIGNyZWF0ZWQsIHRva2VuKSAiCisJCSJWQUxVRVMgIgorCQkiKCVsbHUsIGRhdGV0aW1lKCdub3cnKSwgXCIlMDhYXCIpICIsCisJCXN1YnNjcmliZXItPmlkLCB0cnkpOworCWlmICghcmVzdWx0KSB7CisJCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSB0b2tlbiAlMDhYIGZvciAiCisJCQkiSU1TSSAlcy5cbiIsIHRyeSwgc3Vic2NyaWJlci0+aW1zaSk7CisJCXJldHVybiAxOworCX0KKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkqdG9rZW4gPSB0cnk7CisJREVCVUdQKEREQiwgIkFsbG9jYXRlZCB0b2tlbiAlMDhYIGZvciBJTVNJICVzLlxuIiwgdHJ5LCBzdWJzY3JpYmVyLT5pbXNpKTsKKworCXJldHVybiAwOworfQorCitpbnQgZGJfc3Vic2NyaWJlcl9hc3NvY19pbWVpKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyaWJlciwgY2hhciBpbWVpW0dTTV9JTUVJX0xFTkdUSF0pCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGVxdWlwbWVudF9pZCwgd2F0Y2hfaWQ7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisKKwlzdHJuY3B5KHN1YnNjcmliZXItPmVxdWlwbWVudC5pbWVpLCBpbWVpLAorCQlzaXplb2Yoc3Vic2NyaWJlci0+ZXF1aXBtZW50LmltZWkpLTEpLAorCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCSJJTlNFUlQgT1IgSUdOT1JFIElOVE8gRXF1aXBtZW50ICIKKwkJIihpbWVpLCBjcmVhdGVkLCB1cGRhdGVkKSAiCisJCSJWQUxVRVMgIgorCQkiKCVzLCBkYXRldGltZSgnbm93JyksIGRhdGV0aW1lKCdub3cnKSkgIiwKKwkJaW1laSk7CisJaWYgKCFyZXN1bHQpIHsKKwkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIEVxdWlwbWVudCBieSBJTUVJLlxuIik7CisJCXJldHVybiAxOworCX0KKworCWVxdWlwbWVudF9pZCA9IDA7CisJaWYgKGRiaV9yZXN1bHRfZ2V0X251bXJvd3NfYWZmZWN0ZWQocmVzdWx0KSkgeworCQllcXVpcG1lbnRfaWQgPSBkYmlfY29ubl9zZXF1ZW5jZV9sYXN0KGNvbm4sIE5VTEwpOworCX0KKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCWlmIChlcXVpcG1lbnRfaWQpCisJCURFQlVHUChEREIsICJOZXcgRXF1aXBtZW50OiBJRCAlbGx1LCBJTUVJICVzXG4iLCBlcXVpcG1lbnRfaWQsIGltZWkpOworCWVsc2UgeworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCSJTRUxFQ1QgaWQgRlJPTSBFcXVpcG1lbnQgIgorCQkJIldIRVJFIGltZWkgPSAlcyAiLAorCQkJaW1laQorCQkpOworCQlpZiAoIXJlc3VsdCkgeworCQkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gcXVlcnkgRXF1aXBtZW50IGJ5IElNRUkuXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJCWlmICghZGJpX3Jlc3VsdF9uZXh0X3JvdyhyZXN1bHQpKSB7CisJCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBmaW5kIHRoZSBFcXVpcG1lbnQuXG4iKTsKKwkJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJZXF1aXBtZW50X2lkID0gZGJpX3Jlc3VsdF9nZXRfdWxvbmdsb25nKHJlc3VsdCwgImlkIik7CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCX0KKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiSU5TRVJUIE9SIElHTk9SRSBJTlRPIEVxdWlwbWVudFdhdGNoICIKKwkJIihzdWJzY3JpYmVyX2lkLCBlcXVpcG1lbnRfaWQsIGNyZWF0ZWQsIHVwZGF0ZWQpICIKKwkJIlZBTFVFUyAiCisJCSIoJWxsdSwgJWxsdSwgZGF0ZXRpbWUoJ25vdycpLCBkYXRldGltZSgnbm93JykpICIsCisJCXN1YnNjcmliZXItPmlkLCBlcXVpcG1lbnRfaWQpOworCWlmICghcmVzdWx0KSB7CisJCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBFcXVpcG1lbnRXYXRjaC5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwl3YXRjaF9pZCA9IDA7CisJaWYgKGRiaV9yZXN1bHRfZ2V0X251bXJvd3NfYWZmZWN0ZWQocmVzdWx0KSkKKwkJd2F0Y2hfaWQgPSBkYmlfY29ubl9zZXF1ZW5jZV9sYXN0KGNvbm4sIE5VTEwpOworCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJaWYgKHdhdGNoX2lkKQorCQlERUJVR1AoRERCLCAiTmV3IEVxdWlwbWVudFdhdGNoOiBJRCAlbGx1LCBJTVNJICVzLCBJTUVJICVzXG4iLAorCQkJZXF1aXBtZW50X2lkLCBzdWJzY3JpYmVyLT5pbXNpLCBpbWVpKTsKKwllbHNlIHsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQkiVVBEQVRFIEVxdWlwbWVudFdhdGNoICIKKwkJCSJTRVQgdXBkYXRlZCA9IGRhdGV0aW1lKCdub3cnKSAiCisJCQkiV0hFUkUgc3Vic2NyaWJlcl9pZCA9ICVsbHUgQU5EIGVxdWlwbWVudF9pZCA9ICVsbHUgIiwKKwkJCXN1YnNjcmliZXItPmlkLCBlcXVpcG1lbnRfaWQpOworCQlpZiAoIXJlc3VsdCkgeworCQkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gdXBkYXRlIEVxdWlwbWVudFdhdGNoLlxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJREVCVUdQKEREQiwgIlVwZGF0ZWQgRXF1aXBtZW50V2F0Y2g6IElEICVsbHUsIElNU0kgJXMsIElNRUkgJXNcbiIsCisJCQllcXVpcG1lbnRfaWQsIHN1YnNjcmliZXItPmltc2ksIGltZWkpOworCX0KKworCXJldHVybiAwOworfQorCisvKiBzdG9yZSBhbiBbdW5zZW50XSBTTVMgdG8gdGhlIGRhdGFiYXNlICovCitpbnQgZGJfc21zX3N0b3JlKHN0cnVjdCBnc21fc21zICpzbXMpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJY2hhciAqcV90ZXh0LCAqcV9kYWRkcjsKKwl1bnNpZ25lZCBjaGFyICpxX3VkYXRhOworCWNoYXIgKnZhbGlkaXR5X3RpbWVzdGFtcCA9ICIyMjIyLTItMiI7CisKKwkvKiBGSVhNRTogZ2VuZXJhdGUgdmFsaWRpdHkgdGltZXN0YW1wIGJhc2VkIG9uIHZhbGlkaXR5X21pbnV0ZXMgKi8KKworCWRiaV9jb25uX3F1b3RlX3N0cmluZ19jb3B5KGNvbm4sIChjaGFyICopc21zLT50ZXh0LCAmcV90ZXh0KTsKKwlkYmlfY29ubl9xdW90ZV9zdHJpbmdfY29weShjb25uLCAoY2hhciAqKXNtcy0+ZGVzdF9hZGRyLCAmcV9kYWRkcik7CisJZGJpX2Nvbm5fcXVvdGVfYmluYXJ5X2NvcHkoY29ubiwgc21zLT51c2VyX2RhdGEsIHNtcy0+dXNlcl9kYXRhX2xlbiwKKwkJCQkgICAmcV91ZGF0YSk7CisJLyogRklYTUU6IGNvcnJlY3QgdmFsaWRpdHkgcGVyaW9kICovCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCSJJTlNFUlQgSU5UTyBTTVMgIgorCQkiKGNyZWF0ZWQsIHNlbmRlcl9pZCwgcmVjZWl2ZXJfaWQsIHZhbGlkX3VudGlsLCAiCisJCSAicmVwbHlfcGF0aF9yZXEsIHN0YXR1c19yZXBfcmVxLCBwcm90b2NvbF9pZCwgIgorCQkgImRhdGFfY29kaW5nX3NjaGVtZSwgdWRfaGRyX2luZCwgZGVzdF9hZGRyLCAiCisJCSAidXNlcl9kYXRhLCB0ZXh0KSBWQUxVRVMgIgorCQkiKGRhdGV0aW1lKCdub3cnKSwgJWxsdSwgJWxsdSwgJXUsICIKKwkJICIldSwgJXUsICV1LCAldSwgJXUsICVzLCAlcywgJXMpIiwKKwkJc21zLT5zZW5kZXItPmlkLAorCQlzbXMtPnJlY2VpdmVyID8gc21zLT5yZWNlaXZlci0+aWQgOiAwLCB2YWxpZGl0eV90aW1lc3RhbXAsCisJCXNtcy0+cmVwbHlfcGF0aF9yZXEsIHNtcy0+c3RhdHVzX3JlcF9yZXEsIHNtcy0+cHJvdG9jb2xfaWQsCisJCXNtcy0+ZGF0YV9jb2Rpbmdfc2NoZW1lLCBzbXMtPnVkX2hkcl9pbmQsCisJCXFfZGFkZHIsIHFfdWRhdGEsIHFfdGV4dCk7CisJZnJlZShxX3RleHQpOworCWZyZWUocV9kYWRkcik7CisJZnJlZShxX3VkYXRhKTsKKworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gLUVJTzsKKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGdzbV9zbXMgKnNtc19mcm9tX3Jlc3VsdChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgZGJpX3Jlc3VsdCByZXN1bHQpCit7CisJc3RydWN0IGdzbV9zbXMgKnNtcyA9IHNtc19hbGxvYygpOworCWxvbmcgbG9uZyB1bnNpZ25lZCBpbnQgc2VuZGVyX2lkLCByZWNlaXZlcl9pZDsKKwljb25zdCBjaGFyICp0ZXh0LCAqZGFkZHI7CisJY29uc3QgdW5zaWduZWQgY2hhciAqdXNlcl9kYXRhOworCisJaWYgKCFzbXMpCisJCXJldHVybiBOVUxMOworCisJc21zLT5pZCA9IGRiaV9yZXN1bHRfZ2V0X3Vsb25nbG9uZyhyZXN1bHQsICJpZCIpOworCisJc2VuZGVyX2lkID0gZGJpX3Jlc3VsdF9nZXRfdWxvbmdsb25nKHJlc3VsdCwgInNlbmRlcl9pZCIpOworCXNtcy0+c2VuZGVyID0gc3Vic2NyX2dldF9ieV9pZChuZXQsIHNlbmRlcl9pZCk7CisKKwlyZWNlaXZlcl9pZCA9IGRiaV9yZXN1bHRfZ2V0X3Vsb25nbG9uZyhyZXN1bHQsICJyZWNlaXZlcl9pZCIpOworCXNtcy0+cmVjZWl2ZXIgPSBzdWJzY3JfZ2V0X2J5X2lkKG5ldCwgcmVjZWl2ZXJfaWQpOworCisJLyogRklYTUU6IHZhbGlkaXR5ICovCisJLyogRklYTUU6IHRob3NlIHNob3VsZCBhbGwgYmUgZ2V0X3VjaGFyLCBidXQgc3FsaXRlMyBpcyBicmFpbmRlYWQgKi8KKwlzbXMtPnJlcGx5X3BhdGhfcmVxID0gZGJpX3Jlc3VsdF9nZXRfdWludChyZXN1bHQsICJyZXBseV9wYXRoX3JlcSIpOworCXNtcy0+c3RhdHVzX3JlcF9yZXEgPSBkYmlfcmVzdWx0X2dldF91aW50KHJlc3VsdCwgInN0YXR1c19yZXBfcmVxIik7CisJc21zLT51ZF9oZHJfaW5kID0gZGJpX3Jlc3VsdF9nZXRfdWludChyZXN1bHQsICJ1ZF9oZHJfaW5kIik7CisJc21zLT5wcm90b2NvbF9pZCA9IGRiaV9yZXN1bHRfZ2V0X3VpbnQocmVzdWx0LCAicHJvdG9jb2xfaWQiKTsKKwlzbXMtPmRhdGFfY29kaW5nX3NjaGVtZSA9IGRiaV9yZXN1bHRfZ2V0X3VpbnQocmVzdWx0LAorCQkJCQkJICAiZGF0YV9jb2Rpbmdfc2NoZW1lIik7CisJLyogc21zLT5tc2dfcmVmIGlzIHRlbXBvcmFyeSBhbmQgbm90IHN0b3JlZCBpbiBEQiAqLworCisJZGFkZHIgPSBkYmlfcmVzdWx0X2dldF9zdHJpbmcocmVzdWx0LCAiZGVzdF9hZGRyIik7CisJaWYgKGRhZGRyKSB7CisJCXN0cm5jcHkoc21zLT5kZXN0X2FkZHIsIGRhZGRyLCBzaXplb2Yoc21zLT5kZXN0X2FkZHIpKTsKKwkJc21zLT5kZXN0X2FkZHJbc2l6ZW9mKHNtcy0+ZGVzdF9hZGRyKS0xXSA9ICdcMCc7CisJfQorCisJc21zLT51c2VyX2RhdGFfbGVuID0gZGJpX3Jlc3VsdF9nZXRfZmllbGRfbGVuZ3RoKHJlc3VsdCwgInVzZXJfZGF0YSIpOworCXVzZXJfZGF0YSA9IGRiaV9yZXN1bHRfZ2V0X2JpbmFyeShyZXN1bHQsICJ1c2VyX2RhdGEiKTsKKwlpZiAoc21zLT51c2VyX2RhdGFfbGVuID4gc2l6ZW9mKHNtcy0+dXNlcl9kYXRhKSkKKwkJc21zLT51c2VyX2RhdGFfbGVuID0gKHVfaW50OF90KSBzaXplb2Yoc21zLT51c2VyX2RhdGEpOworCW1lbWNweShzbXMtPnVzZXJfZGF0YSwgdXNlcl9kYXRhLCBzbXMtPnVzZXJfZGF0YV9sZW4pOworCisJdGV4dCA9IGRiaV9yZXN1bHRfZ2V0X3N0cmluZyhyZXN1bHQsICJ0ZXh0Iik7CisJaWYgKHRleHQpIHsKKwkJc3RybmNweShzbXMtPnRleHQsIHRleHQsIHNpemVvZihzbXMtPnRleHQpKTsKKwkJc21zLT50ZXh0W3NpemVvZihzbXMtPnRleHQpLTFdID0gJ1wwJzsKKwl9CisJcmV0dXJuIHNtczsKK30KKworLyogcmV0cmlldmUgdGhlIG5leHQgdW5zZW50IFNNUyB3aXRoIElEID49IG1pbl9pZCAqLworc3RydWN0IGdzbV9zbXMgKmRiX3Ntc19nZXRfdW5zZW50KHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCB1bnNpZ25lZCBsb25nIGxvbmcgbWluX2lkKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCXN0cnVjdCBnc21fc21zICpzbXM7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIlNFTEVDVCAqIEZST00gU01TLFN1YnNjcmliZXIgIgorCQkiV0hFUkUgc21zLmlkID49ICVsbHUgQU5EIHNtcy5zZW50IGlzIE5VTEwgIgorCQkJIkFORCBzbXMucmVjZWl2ZXJfaWQgPSBzdWJzY3JpYmVyLmlkICIKKwkJCSJBTkQgc3Vic2NyaWJlci5sYWMgPiAwICIKKwkJIk9SREVSIEJZIHNtcy5pZCBMSU1JVCAxIiwKKwkJbWluX2lkKTsKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIWRiaV9yZXN1bHRfbmV4dF9yb3cocmVzdWx0KSkgeworCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc21zID0gc21zX2Zyb21fcmVzdWx0KG5ldCwgcmVzdWx0KTsKKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCisJcmV0dXJuIHNtczsKK30KKworc3RydWN0IGdzbV9zbXMgKmRiX3Ntc19nZXRfdW5zZW50X2J5X3N1YnNjcihzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgdW5zaWduZWQgbG9uZyBsb25nIG1pbl9zdWJzY3JfaWQpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJc3RydWN0IGdzbV9zbXMgKnNtczsKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiU0VMRUNUICogRlJPTSBTTVMsU3Vic2NyaWJlciAiCisJCSJXSEVSRSBzbXMucmVjZWl2ZXJfaWQgPj0gJWxsdSBBTkQgc21zLnNlbnQgaXMgTlVMTCAiCisJCQkiQU5EIHNtcy5yZWNlaXZlcl9pZCA9IHN1YnNjcmliZXIuaWQgIgorCQkJIkFORCBzdWJzY3JpYmVyLmxhYyA+IDAgIgorCQkiT1JERVIgQlkgc21zLnJlY2VpdmVyX2lkLCBpZCBMSU1JVCAxIiwKKwkJbWluX3N1YnNjcl9pZCk7CisJaWYgKCFyZXN1bHQpCisJCXJldHVybiBOVUxMOworCisJaWYgKCFkYmlfcmVzdWx0X25leHRfcm93KHJlc3VsdCkpIHsKKwkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXNtcyA9IHNtc19mcm9tX3Jlc3VsdChuZXQsIHJlc3VsdCk7CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCXJldHVybiBzbXM7Cit9CisKKy8qIHJldHJpZXZlIHRoZSBuZXh0IHVuc2VudCBTTVMgZm9yIGEgZ2l2ZW4gc3Vic2NyaWJlciAqLworc3RydWN0IGdzbV9zbXMgKmRiX3Ntc19nZXRfdW5zZW50X2Zvcl9zdWJzY3Ioc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJc3RydWN0IGdzbV9zbXMgKnNtczsKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiU0VMRUNUICogRlJPTSBTTVMsU3Vic2NyaWJlciAiCisJCSJXSEVSRSBzbXMucmVjZWl2ZXJfaWQgPSAlbGx1IEFORCBzbXMuc2VudCBpcyBOVUxMICIKKwkJCSJBTkQgc21zLnJlY2VpdmVyX2lkID0gc3Vic2NyaWJlci5pZCAiCisJCQkiQU5EIHN1YnNjcmliZXIubGFjID4gMCAiCisJCSJPUkRFUiBCWSBzbXMuaWQgTElNSVQgMSIsCisJCXN1YnNjci0+aWQpOworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghZGJpX3Jlc3VsdF9uZXh0X3JvdyhyZXN1bHQpKSB7CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzbXMgPSBzbXNfZnJvbV9yZXN1bHQoc3Vic2NyLT5uZXQsIHJlc3VsdCk7CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCXJldHVybiBzbXM7Cit9CisKKy8qIG1hcmsgYSBnaXZlbiBTTVMgYXMgcmVhZCAqLworaW50IGRiX3Ntc19tYXJrX3NlbnQoc3RydWN0IGdzbV9zbXMgKnNtcykKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiVVBEQVRFIFNNUyAiCisJCSJTRVQgc2VudCA9IGRhdGV0aW1lKCdub3cnKSAiCisJCSJXSEVSRSBpZCA9ICVsbHUiLCBzbXMtPmlkKTsKKwlpZiAoIXJlc3VsdCkgeworCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBtYXJrIFNNUyAlbGx1IGFzIHNlbnQuXG4iLCBzbXMtPmlkKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgYXR0ZW1wdGVkIGRlbGl2ZXJpZXMgKi8KK2ludCBkYl9zbXNfaW5jX2RlbGl2ZXJfYXR0ZW1wdHMoc3RydWN0IGdzbV9zbXMgKnNtcykKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiVVBEQVRFIFNNUyAiCisJCSJTRVQgZGVsaXZlcl9hdHRlbXB0cyA9IGRlbGl2ZXJfYXR0ZW1wdHMgKyAxICIKKwkJIldIRVJFIGlkID0gJWxsdSIsIHNtcy0+aWQpOworCWlmICghcmVzdWx0KSB7CisJCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIGluYyBkZWxpdmVyIGF0dGVtcHRzIGZvciAiCisJCQkiU01TICVsbHUuXG4iLCBzbXMtPmlkKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkYl9hcGR1X2Jsb2Jfc3RvcmUoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQl1X2ludDhfdCBhcGR1X2lkX2ZsYWdzLCB1X2ludDhfdCBsZW4sCisJCQl1X2ludDhfdCAqYXBkdSkKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwl1bnNpZ25lZCBjaGFyICpxX2FwZHU7CisKKwlkYmlfY29ubl9xdW90ZV9iaW5hcnlfY29weShjb25uLCBhcGR1LCBsZW4sICZxX2FwZHUpOworCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCSJJTlNFUlQgSU5UTyBBcGR1QmxvYnMgIgorCQkiKGNyZWF0ZWQsc3Vic2NyaWJlcl9pZCxhcGR1X2lkX2ZsYWdzLGFwZHUpIFZBTFVFUyAiCisJCSIoZGF0ZXRpbWUoJ25vdycpLCVsbHUsJXUsJXMpIiwKKwkJc3Vic2NyLT5pZCwgYXBkdV9pZF9mbGFncywgcV9hcGR1KTsKKworCWZyZWUocV9hcGR1KTsKKworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gLUVJTzsKKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCXJldHVybiAwOworfQorCitpbnQgZGJfc3RvcmVfY291bnRlcihzdHJ1Y3QgY291bnRlciAqY3RyKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCWNoYXIgKnFfbmFtZTsKKworCWRiaV9jb25uX3F1b3RlX3N0cmluZ19jb3B5KGNvbm4sIGN0ci0+bmFtZSwgJnFfbmFtZSk7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIklOU0VSVCBJTlRPIENvdW50ZXJzICIKKwkJIih0aW1lc3RhbXAsbmFtZSx2YWx1ZSkgVkFMVUVTICIKKwkJIihkYXRldGltZSgnbm93JyksJXMsJWx1KSIsIHFfbmFtZSwgY3RyLT52YWx1ZSk7CisKKwlmcmVlKHFfbmFtZSk7CisKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuIC1FSU87CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2RlYnVnLmMgYi9vcGVuYnNjL3NyYy9kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MTc1NmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9kZWJ1Zy5jCkBAIC0wLDAgKzEsMTkzIEBACisvKiBPcGVuQlNDIERlYnVnZ2luZy9Mb2dnaW5nIHN1cHBvcnQgY29kZSAqLworCisvKiAoQykgMjAwOC0yMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOCBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdXRpbHMuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisKKy8qIGRlZmF1bHQgY2F0ZWdvcmllcyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBsb2dfaW5mb19jYXQgZGVmYXVsdF9jYXRlZ29yaWVzW10gPSB7CisJW0RSTExdID0geworCQkubmFtZSA9ICJEUkxMIiwKKwkJLmRlc2NyaXB0aW9uID0gIlJhZGlvIExpbmsgTGF5ZXIiLAorCQkuY29sb3IgPSAiXDAzM1sxOzMxbSIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRENDXSA9IHsKKwkJLm5hbWUgPSAiRENDIiwKKwkJLmRlc2NyaXB0aW9uID0gIkNhbGwgQ29udHJvbCIsCisJCS5jb2xvciA9ICJcMDMzWzE7MzJtIiwKKwkJLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSwKKwl9LAorCVtETU1dID0geworCQkubmFtZSA9ICJETU0iLAorCQkuZGVzY3JpcHRpb24gPSAiTW9iaWxpdHkgTWFuYWdlbWVudCIsCisJCS5jb2xvciA9ICJcMDMzWzE7MzNtIiwKKwkJLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSwKKwl9LAorCVtEUlJdID0geworCQkubmFtZSA9ICJEUlIiLAorCQkuZGVzY3JpcHRpb24gPSAiUmFkaW8gUmVzb3VyY2UiLAorCQkuY29sb3IgPSAiXDAzM1sxOzM0bSIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRFJTTF0gPSB7CisJCS5uYW1lID0gIkRSU0wiLAorCQkuZGVzY3JpcHRpb24gPSAiUmFkaW8gU2lnYW5sbGluZyBMaW5rIiwKKwkJLmNvbG9yID0gIlwwMzNbMTszNW0iLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0ROTV0gPQl7CisJCS5uYW1lID0gIkROTSIsCisJCS5kZXNjcmlwdGlvbiA9ICJOZXR3b3JrIE1hbmFnZW1lbnQgKE9NTCkiLAorCQkuY29sb3IgPSAiXDAzM1sxOzM2bSIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9JTkZPLAorCX0sCisJW0RNTkNDXSA9IHsKKwkJLm5hbWUgPSAiRE1OQ0MiLAorCQkuZGVzY3JpcHRpb24gPSAiQlNDPC0+TVNDIGludGVyZmFjZSIsCisJCS5jb2xvciA9ICJcMDMzWzE7MzltIiwKKwkJLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSwKKwl9LAorCVtEU01TXSA9IHsKKwkJLm5hbWUgPSAiRFNNUyIsCisJCS5kZXNjcmlwdGlvbiA9ICJTaG9ydCBNZXNzYWdlIFNlcnZpY2UiLAorCQkuY29sb3IgPSAiXDAzM1sxOzM3bSIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRFBBR10JPSB7CisJCS5uYW1lID0gIkRQQUciLAorCQkuZGVzY3JpcHRpb24gPSAiUGFnaW5nIiwKKwkJLmNvbG9yID0gIlwwMzNbMTszOG0iLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0RNRUFTXSA9IHsKKwkJLm5hbWUgPSAiRE1FQVMiLAorCQkuZGVzY3JpcHRpb24gPSAiTWVhc3VyZW1lbnQgUHJvY2Vzc2luZyIsCisJCS5lbmFibGVkID0gMCwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRE1JXSA9IHsKKwkJLm5hbWUgPSAiRE1JIiwKKwkJLmRlc2NyaXB0aW9uID0gIm1JU0ROIElucHV0IERyaXZlciIsCisJCS5lbmFibGVkID0gMCwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRE1JQl0gPSB7CisJCS5uYW1lID0gIkRNSUIiLAorCQkuZGVzY3JpcHRpb24gPSAibUlTRE4gQi1DaGFubmVscyIsCisJCS5lbmFibGVkID0gMCwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRE1VWF0gPSB7CisJCS5uYW1lID0gIkRNVVgiLAorCQkuZGVzY3JpcHRpb24gPSAiVFJBVSBGcmFtZSBNdWx0aXBsZXgiLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0RJTlBdID0geworCQkubmFtZSA9ICJESU5QIiwKKwkJLmRlc2NyaXB0aW9uID0gIklucHV0IERyaXZlciIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRFNDQ1BdID0geworCQkubmFtZSA9ICJEU0NDUCIsCisJCS5kZXNjcmlwdGlvbiA9ICJTQ0NQIFByb3RvY29sIiwKKwkJLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSwKKwl9LAorCVtETVNDXSA9IHsKKwkJLm5hbWUgPSAiRE1TQyIsCisJCS5kZXNjcmlwdGlvbiA9ICJNb2JpbGUgU3dpdGNoaW5nIENlbnRlciIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRE1HQ1BdID0geworCQkubmFtZSA9ICJETUdDUCIsCisJCS5kZXNjcmlwdGlvbiA9ICJNZWRpYSBHYXRld2F5IENvbnRyb2wgUHJvdG9jb2wiLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0RIT10gPSB7CisJCS5uYW1lID0gIkRITyIsCisJCS5kZXNjcmlwdGlvbiA9ICJIYW5kLU92ZXIiLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0REQl0gPSB7CisJCS5uYW1lID0gIkREQiIsCisJCS5kZXNjcmlwdGlvbiA9ICJEYXRhYmFzZSIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRFJFRl0gPSB7CisJCS5uYW1lID0gIkRSRUYiLAorCQkuZGVzY3JpcHRpb24gPSAiUmVmZXJlbmNlIENvdW50aW5nIiwKKwkJLmVuYWJsZWQgPSAwLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSwKKwl9LAorCVtER1BSU10gPSB7CisJCS5uYW1lID0gIkRHUFJTIiwKKwkJLmRlc2NyaXB0aW9uID0gIkdQUlMgUGFja2V0IFNlcnZpY2UiLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfREVCVUcsCisJfSwKK307CisKK2VudW0gbG9nX2N0eHQgeworCUNUWF9TVUJTQ1JJQkVSLAorfTsKKworZW51bSBsb2dfZmlsdGVyIHsKKwlfRkxUX0FMTCA9IExPR19GSUxURVJfQUxMLAkvKiBsaWJvc21vY29yZSAqLworCUZMVF9JTVNJID0gMSwKK307CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZuKGNvbnN0IHN0cnVjdCBsb2dfY29udGV4dCAqY3R4LAorCQkgICAgIHN0cnVjdCBsb2dfdGFyZ2V0ICp0YXIpCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPSBjdHgtPmN0eFtDVFhfU1VCU0NSSUJFUl07CisKKwlpZiAoKHRhci0+ZmlsdGVyX21hcCAmICgxIDw8IEZMVF9JTVNJKSkgIT0gMAorCSAgICAmJiBzdWJzY3IgJiYgc3RyY21wKHN1YnNjci0+aW1zaSwgdGFyLT5maWx0ZXJfZGF0YVtGTFRfSU1TSV0pID09IDApCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK2NvbnN0IHN0cnVjdCBsb2dfaW5mbyBsb2dfaW5mbyA9IHsKKwkuZmlsdGVyX2ZuID0gZmlsdGVyX2ZuLAorCS5jYXQgPSBkZWZhdWx0X2NhdGVnb3JpZXMsCisJLm51bV9jYXQgPSBBUlJBWV9TSVpFKGRlZmF1bHRfY2F0ZWdvcmllcyksCit9OworCit2b2lkIGxvZ19zZXRfaW1zaV9maWx0ZXIoc3RydWN0IGxvZ190YXJnZXQgKnRhcmdldCwgY29uc3QgY2hhciAqaW1zaSkKK3sKKwlpZiAoaW1zaSkgeworCQl0YXJnZXQtPmZpbHRlcl9tYXAgfD0gKDEgPDwgRkxUX0lNU0kpOworCQl0YXJnZXQtPmZpbHRlcl9kYXRhW0ZMVF9JTVNJXSA9IHRhbGxvY19zdHJkdXAodGFyZ2V0LCBpbXNpKTsKKwl9IGVsc2UgaWYgKHRhcmdldC0+ZmlsdGVyX2RhdGFbRkxUX0lNU0ldKSB7CisJCXRhcmdldC0+ZmlsdGVyX21hcCAmPSB+KDEgPDwgRkxUX0lNU0kpOworCQl0YWxsb2NfZnJlZSh0YXJnZXQtPmZpbHRlcl9kYXRhW0ZMVF9JTVNJXSk7CisJCXRhcmdldC0+ZmlsdGVyX2RhdGFbRkxUX0lNU0ldID0gTlVMTDsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9lMV9jb25maWcuYyBiL29wZW5ic2Mvc3JjL2UxX2NvbmZpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZmJjZWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9lMV9jb25maWcuYwpAQCAtMCwwICsxLDIzNiBAQAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9lMV9pbnB1dC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdHJhdV9mcmFtZS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdHJhdV9tdXguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21pc2RuLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9pcGFjY2Vzcy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKworI2RlZmluZSBTQVBJX0wyTUwJMAorI2RlZmluZSBTQVBJX09NTAk2MgorI2RlZmluZSBTQVBJX1JTTAkwCS8qIDYzID8gKi8KKworLyogVGhlIGUxX3JlY29uZmlnXyooKSBmdW5jdGlvbnMgYmVsb3cgdGFsZSB0aGUgY29uZmlndXJhdGlvbiBwcmVzZW50IGluIHRoZQorICogYnRzL3RyeC90cyBkYXRhIHN0cnVjdHVyZXMgYW5kIGVuc3VyZSB0aGUgRTEgY29uZmlndXJhdGlvbiByZWZsZWN0cyB0aGUKKyAqIHRpbWVzbG90L3N1YnNsb3QvVEVJIGNvbmZpZ3VyYXRpb24gKi8KKworaW50IGUxX3JlY29uZmlnX3RzKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMpCit7CisJc3RydWN0IGdzbV9lMV9zdWJzbG90ICplMV9saW5rID0gJnRzLT5lMV9saW5rOworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lOworCXN0cnVjdCBlMWlucF90cyAqZTFfdHM7CisKKwlERUJVR1AoRE1JLCAiZTFfcmVjb25maWdfdHMoJXUsJXUsJXUpXG4iLCB0cy0+dHJ4LT5idHMtPm5yLCB0cy0+dHJ4LT5uciwgdHMtPm5yKTsKKworCWlmICghZTFfbGluay0+ZTFfdHMpCisJCXJldHVybiAwOworCisJbGluZSA9IGUxaW5wX2xpbmVfZ2V0X2NyZWF0ZShlMV9saW5rLT5lMV9ucik7CisJaWYgKCFsaW5lKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN3aXRjaCAodHMtPnBjaGFuKSB7CisJY2FzZSBHU01fUENIQU5fVENIX0Y6CisJY2FzZSBHU01fUENIQU5fVENIX0g6CisJCWUxX3RzID0gJmxpbmUtPnRzW2UxX2xpbmstPmUxX3RzLTFdOworCQllMWlucF90c19jb25maWcoZTFfdHMsIGxpbmUsIEUxSU5QX1RTX1RZUEVfVFJBVSk7CisJCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZlMV90cy0+dHJhdS5kZW11eCwgZTFfbGluay0+ZTFfdHNfc3MpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGUxX3JlY29uZmlnX3RyeChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKmUxX2xpbmsgPSAmdHJ4LT5yc2xfZTFfbGluazsKKwlzdHJ1Y3QgZTFpbnBfdHMgKnNpZ25fdHM7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmU7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqcnNsX2xpbms7CisJaW50IGk7CisKKwlpZiAoIWUxX2xpbmstPmUxX3RzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFJTTCBMaW5rICovCisJbGluZSA9IGUxaW5wX2xpbmVfZ2V0X2NyZWF0ZShlMV9saW5rLT5lMV9ucik7CisJaWYgKCFsaW5lKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzaWduX3RzID0gJmxpbmUtPnRzW2UxX2xpbmstPmUxX3RzLTFdOworCWUxaW5wX3RzX2NvbmZpZyhzaWduX3RzLCBsaW5lLCBFMUlOUF9UU19UWVBFX1NJR04pOworCXJzbF9saW5rID0gZTFpbnBfc2lnbl9saW5rX2NyZWF0ZShzaWduX3RzLCBFMUlOUF9TSUdOX1JTTCwKKwkJCQkJICB0cngsIHRyeC0+cnNsX3RlaSwgU0FQSV9SU0wpOworCWlmICghcnNsX2xpbmspCisJCXJldHVybiAtRU5PTUVNOworCWlmICh0cngtPnJzbF9saW5rKQorCQllMWlucF9zaWduX2xpbmtfZGVzdHJveSh0cngtPnJzbF9saW5rKTsKKwl0cngtPnJzbF9saW5rID0gcnNsX2xpbms7CisKKwlmb3IgKGkgPSAwOyBpIDwgVFJYX05SX1RTOyBpKyspCisJCWUxX3JlY29uZmlnX3RzKCZ0cngtPnRzW2ldKTsKKworCXJldHVybiAwOworfQorCitpbnQgZTFfcmVjb25maWdfYnRzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGdzbV9lMV9zdWJzbG90ICplMV9saW5rID0gJmJ0cy0+b21sX2UxX2xpbms7CisJc3RydWN0IGUxaW5wX3RzICpzaWduX3RzOworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lOworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKm9tbF9saW5rOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCisJREVCVUdQKERNSSwgImUxX3JlY29uZmlnX2J0cygldSlcbiIsIGJ0cy0+bnIpOworCisJaWYgKCFlMV9saW5rLT5lMV90cykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBPTUwgbGluayAqLworCWxpbmUgPSBlMWlucF9saW5lX2dldF9jcmVhdGUoZTFfbGluay0+ZTFfbnIpOworCWlmICghbGluZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJc2lnbl90cyA9ICZsaW5lLT50c1tlMV9saW5rLT5lMV90cy0xXTsKKwllMWlucF90c19jb25maWcoc2lnbl90cywgbGluZSwgRTFJTlBfVFNfVFlQRV9TSUdOKTsKKwlvbWxfbGluayA9IGUxaW5wX3NpZ25fbGlua19jcmVhdGUoc2lnbl90cywgRTFJTlBfU0lHTl9PTUwsCisJCQkJCSAgYnRzLT5jMCwgYnRzLT5vbWxfdGVpLCBTQVBJX09NTCk7CisJaWYgKCFvbWxfbGluaykKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKGJ0cy0+b21sX2xpbmspCisJCWUxaW5wX3NpZ25fbGlua19kZXN0cm95KGJ0cy0+b21sX2xpbmspOworCWJ0cy0+b21sX2xpbmsgPSBvbWxfbGluazsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyeCwgJmJ0cy0+dHJ4X2xpc3QsIGxpc3QpCisJCWUxX3JlY29uZmlnX3RyeCh0cngpOworCisJLyogbm90aWZ5IEUxIGlucHV0IHNvbWV0aGluZyBoYXMgY2hhbmdlZCAqLworCXJldHVybiBlMWlucF9saW5lX3VwZGF0ZShsaW5lKTsKK30KKworI2lmIDAKKy8qIGRvIHNvbWUgY29tcGlsZWQtaW4gY29uZmlndXJhdGlvbiBmb3Igb3VyIEJUUy9FMSBzZXR1cCAqLworaW50IGUxX2NvbmZpZyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgY2FyZG5yLCBpbnQgcmVsZWFzZV9sMikKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZTsKKwlzdHJ1Y3QgZTFpbnBfdHMgKnNpZ25fdHM7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqb21sX2xpbmssICpyc2xfbGluazsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IGJ0cy0+YzA7CisJaW50IGJhc2VfdHM7CisKKwlzd2l0Y2ggKGJ0cy0+bnIpIHsKKwljYXNlIDA6CisJCS8qIEZpcnN0IEJUUyB1c2VzIEUxIFRTIDAxLDAyLDAzLDA0LDA1ICovCisJCWJhc2VfdHMgPSBIQVJEQ09ERURfQlRTMF9UUyAtIDE7CisJCWJyZWFrOworCWNhc2UgMToKKwkJLyogU2Vjb25kIEJUUyB1c2VzIEUxIFRTIDA2LDA3LDA4LDA5LDEwICovCisJCWJhc2VfdHMgPSBIQVJEQ09ERURfQlRTMV9UUyAtIDE7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJLyogVGhpcmQgQlRTIHVzZXMgRTEgVFMgMTEsMTIsMTMsMTQsMTUgKi8KKwkJYmFzZV90cyA9IEhBUkRDT0RFRF9CVFMyX1RTIC0gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlsaW5lID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3QgZTFpbnBfbGluZSk7CisJaWYgKCFsaW5lKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIGNyZWF0ZSBFMSB0aW1lc2xvdHMgZm9yIHNpZ25hbGxpbmcgYW5kIFRSQVUgZnJhbWVzICovCisJZTFpbnBfdHNfY29uZmlnKCZsaW5lLT50c1tiYXNlX3RzKzEtMV0sIGxpbmUsIEUxSU5QX1RTX1RZUEVfU0lHTik7CisJZTFpbnBfdHNfY29uZmlnKCZsaW5lLT50c1tiYXNlX3RzKzItMV0sIGxpbmUsIEUxSU5QX1RTX1RZUEVfVFJBVSk7CisJZTFpbnBfdHNfY29uZmlnKCZsaW5lLT50c1tiYXNlX3RzKzMtMV0sIGxpbmUsIEUxSU5QX1RTX1RZUEVfVFJBVSk7CisKKwkvKiBjcmVhdGUgc2lnbmFsbGluZyBsaW5rcyBmb3IgVFMxICovCisJc2lnbl90cyA9ICZsaW5lLT50c1tiYXNlX3RzKzEtMV07CisJb21sX2xpbmsgPSBlMWlucF9zaWduX2xpbmtfY3JlYXRlKHNpZ25fdHMsIEUxSU5QX1NJR05fT01MLAorCQkJCQkgIHRyeCwgVEVJX09NTCwgU0FQSV9PTUwpOworCXJzbF9saW5rID0gZTFpbnBfc2lnbl9saW5rX2NyZWF0ZShzaWduX3RzLCBFMUlOUF9TSUdOX1JTTCwKKwkJCQkJICB0cngsIFRFSV9SU0wsIFNBUElfUlNMKTsKKworCS8qIGNyZWF0ZSBiYWNrLWxpbmtzIGZyb20gYnRzL3RyeCAqLworCWJ0cy0+b21sX2xpbmsgPSBvbWxfbGluazsKKwl0cngtPnJzbF9saW5rID0gcnNsX2xpbms7CisKKwkvKiBlbmFibGUgc3ViY2hhbm5lbCBkZW11eGVyIG9uIFRTMiAqLworCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzItMV0udHJhdS5kZW11eCwgMSk7CisJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrMi0xXS50cmF1LmRlbXV4LCAyKTsKKwlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cysyLTFdLnRyYXUuZGVtdXgsIDMpOworCisJLyogZW5hYmxlIHN1YmNoYW5uZWwgZGVtdXhlciBvbiBUUzMgKi8KKwlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cyszLTFdLnRyYXUuZGVtdXgsIDApOworCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzMtMV0udHJhdS5kZW11eCwgMSk7CisJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrMy0xXS50cmF1LmRlbXV4LCAyKTsKKwlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cyszLTFdLnRyYXUuZGVtdXgsIDMpOworCisJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgMSk7CisJaWYgKHRyeCkgeworCQkvKiBjcmVhdGUgRTEgdGltZXNsb3RzIGZvciBUUkFVIGZyYW1lcyBvZiBUUlgxICovCisJCWUxaW5wX3RzX2NvbmZpZygmbGluZS0+dHNbYmFzZV90cys0LTFdLCBsaW5lLCBFMUlOUF9UU19UWVBFX1RSQVUpOworCQllMWlucF90c19jb25maWcoJmxpbmUtPnRzW2Jhc2VfdHMrNS0xXSwgbGluZSwgRTFJTlBfVFNfVFlQRV9UUkFVKTsKKworCQkvKiBjcmVhdGUgUlNMIHNpZ25hbGxpbmcgbGluayBmb3IgVFJYMSAqLworCQlzaWduX3RzID0gJmxpbmUtPnRzW2Jhc2VfdHMrMS0xXTsKKwkJcnNsX2xpbmsgPSBlMWlucF9zaWduX2xpbmtfY3JlYXRlKHNpZ25fdHMsIEUxSU5QX1NJR05fUlNMLAorCQkJCQkgIHRyeCwgVEVJX1JTTCsxLCBTQVBJX1JTTCk7CisJCS8qIGNyZWF0ZSBiYWNrLWxpbmtzIGZyb20gdHJ4ICovCisJCXRyeC0+cnNsX2xpbmsgPSByc2xfbGluazsKKworCQkvKiBlbmFibGUgc3ViY2hhbm5lbCBkZW11eGVyIG9uIFRTMiAqLworCQlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cys0LTFdLnRyYXUuZGVtdXgsIDApOworCQlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cys0LTFdLnRyYXUuZGVtdXgsIDEpOworCQlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cys0LTFdLnRyYXUuZGVtdXgsIDIpOworCQlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cys0LTFdLnRyYXUuZGVtdXgsIDMpOworCisJCS8qIGVuYWJsZSBzdWJjaGFubmVsIGRlbXV4ZXIgb24gVFMzICovCisJCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzUtMV0udHJhdS5kZW11eCwgMCk7CisJCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzUtMV0udHJhdS5kZW11eCwgMSk7CisJCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzUtMV0udHJhdS5kZW11eCwgMik7CisJCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzUtMV0udHJhdS5kZW11eCwgMyk7CisJfQorCisJcmV0dXJuIG1pX3NldHVwKGNhcmRuciwgbGluZSwgcmVsZWFzZV9sMik7Cit9CisjZW5kaWYKKworLyogY29uZmlndXJlIHBzZXVkbyBFMSBsaW5lIGluIGlwLmFjY2VzcyBzdHlsZSBhbmQgY29ubmVjdCB0byBCVFMgKi8KK2ludCBpYV9jb25maWdfY29ubmVjdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbikKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZTsKKwlzdHJ1Y3QgZTFpbnBfdHMgKnNpZ25fdHMsICpyc2xfdHM7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqb21sX2xpbmssICpyc2xfbGluazsKKworCWxpbmUgPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBlMWlucF9saW5lKTsKKwlpZiAoIWxpbmUpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogY3JlYXRlIEUxIHRpbWVzbG90cyBmb3Igc2lnbmFsbGluZyBhbmQgVFJBVSBmcmFtZXMgKi8KKwllMWlucF90c19jb25maWcoJmxpbmUtPnRzWzEtMV0sIGxpbmUsIEUxSU5QX1RTX1RZUEVfU0lHTik7CisJZTFpbnBfdHNfY29uZmlnKCZsaW5lLT50c1syLTFdLCBsaW5lLCBFMUlOUF9UU19UWVBFX1NJR04pOworCisJLyogY3JlYXRlIHNpZ25hbGxpbmcgbGlua3MgZm9yIFRTMSAqLworCXNpZ25fdHMgPSAmbGluZS0+dHNbMS0xXTsKKwlyc2xfdHMgPSAmbGluZS0+dHNbMi0xXTsKKwlvbWxfbGluayA9IGUxaW5wX3NpZ25fbGlua19jcmVhdGUoc2lnbl90cywgRTFJTlBfU0lHTl9PTUwsCisJCQkJCSAgYnRzLT5jMCwgMHhmZiwgMCk7CisJcnNsX2xpbmsgPSBlMWlucF9zaWduX2xpbmtfY3JlYXRlKHJzbF90cywgRTFJTlBfU0lHTl9SU0wsCisJCQkJCSAgYnRzLT5jMCwgMCwgMCk7CisKKwkvKiBjcmVhdGUgYmFjay1saW5rcyBmcm9tIGJ0cy90cnggKi8KKwlidHMtPm9tbF9saW5rID0gb21sX2xpbms7CisJYnRzLT5jMC0+cnNsX2xpbmsgPSByc2xfbGluazsKKworCS8qIGRlZmF1bHQgcG9ydCBhdCBCVFMgZm9yIGluY29taW5nIGNvbm5lY3Rpb25zIGlzIDMwMDYgKi8KKwlpZiAoc2luLT5zaW5fcG9ydCA9PSAwKQorCQlzaW4tPnNpbl9wb3J0ID0gaHRvbnMoMzAwNik7CisKKwlyZXR1cm4gaXBhY2Nlc3NfY29ubmVjdChsaW5lLCBzaW4pOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZTFfaW5wdXQuYyBiL29wZW5ic2Mvc3JjL2UxX2lucHV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFkZmU5YgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2UxX2lucHV0LmMKQEAgLTAsMCArMSw1NjUgQEAKKy8qIE9wZW5CU0MgQWJpcyBpbnRlcmZhY2UgdG8gRTEgKi8KKworLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8bUlTRE5pZi5oPgorCisvLyNkZWZpbmUgQUZfQ09NUEFUSUJJTElUWV9GVU5DCisvLyNpbmNsdWRlIDxjb21wYXRfYWZfaXNkbi5oPgorI2lmbmRlZiBBRl9JU0ROCisjZGVmaW5lIEFGX0lTRE4gMzQKKyNkZWZpbmUgUEZfSVNETiBBRl9JU0ROCisjZW5kaWYKKworI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZTFfaW5wdXQuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfbm0uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zdWJjaGFuX2RlbXV4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmF1X2ZyYW1lLmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmF1X211eC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9taXNkbi5oPgorCisjZGVmaW5lIE5VTV9FMV9UUwkzMgorCisvKiBsaXN0IG9mIGFsbCBFMSBkcml2ZXJzICovCitMTElTVF9IRUFEKGUxaW5wX2RyaXZlcl9saXN0KTsKKworLyogbGlzdCBvZiBhbGwgRTEgbGluZXMgKi8KK0xMSVNUX0hFQUQoZTFpbnBfbGluZV9saXN0KTsKKworc3RhdGljIHZvaWQgKnRhbGxfc2lnbF9jdHg7CisKKy8qIHRvIGJlIGltcGxlbWVudGVkLCBlLmcuIGJ5IGJzY19oYWNrLmMgKi8KK3ZvaWQgaW5wdXRfZXZlbnQoaW50IGV2ZW50LCBlbnVtIGUxaW5wX3NpZ25fdHlwZSB0eXBlLCBzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCk7CisKKy8qCisgKiBwY2FwIHdyaXRpbmcgb2YgdGhlIG1pc2RuIGxvYWQKKyAqIHBjYXAgZm9ybWF0IGlzIGZyb20gaHR0cDovL3dpa2kud2lyZXNoYXJrLm9yZy9EZXZlbG9wbWVudC9MaWJwY2FwRmlsZUZvcm1hdAorICovCisjZGVmaW5lIERMVF9MSU5VWF9MQVBECQkxNzcKKyNkZWZpbmUgUENBUF9JTlBVVAkJMAorI2RlZmluZSBQQ0FQX09VVFBVVAkJMQorCitzdHJ1Y3QgcGNhcF9oZHIgeworCXVfaW50MzJfdCBtYWdpY19udW1iZXI7CisJdV9pbnQxNl90IHZlcnNpb25fbWFqb3I7CisJdV9pbnQxNl90IHZlcnNpb25fbWlub3I7CisJaW50MzJfdCAgdGhpc3pvbmU7CisJdV9pbnQzMl90IHNpZ2ZpZ3M7CisJdV9pbnQzMl90IHNuYXBsZW47CisJdV9pbnQzMl90IG5ldHdvcms7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgcGNhcHJlY19oZHIgeworCXVfaW50MzJfdCB0c19zZWM7CisJdV9pbnQzMl90IHRzX3VzZWM7CisJdV9pbnQzMl90IGluY2xfbGVuOworCXVfaW50MzJfdCBvcmlnX2xlbjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBmYWtlX2xpbnV4X2xhcGRfaGVhZGVyIHsKKyAgICAgICAgdV9pbnQxNl90IHBrdHR5cGU7CisJdV9pbnQxNl90IGhhdHlwZTsKKwl1X2ludDE2X3QgaGFsZW47CisJdV9pbnQ2NF90IGFkZHI7CisJaW50MTZfdCBwcm90b2NvbDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBsYXBkX2hlYWRlciB7CisJdV9pbnQ4X3QgZWExIDogMTsKKwl1X2ludDhfdCBjciA6IDE7CisJdV9pbnQ4X3Qgc2FwaSA6IDY7CisJdV9pbnQ4X3QgZWEyIDogMTsKKwl1X2ludDhfdCB0ZWkgOiA3OworCXVfaW50OF90IGNvbnRyb2xfZm9vOyAvKiBmYWtlIFVNJ3MgLi4uICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdGF0aWNfYXNzZXJ0KChpbnQpJigoc3RydWN0IGZha2VfbGludXhfbGFwZF9oZWFkZXIqKU5VTEwpLT5oYXR5cGUgPT0gMiwJaGF0eXBlX29mZnNldCk7CitzdGF0aWNfYXNzZXJ0KChpbnQpJigoc3RydWN0IGZha2VfbGludXhfbGFwZF9oZWFkZXIqKU5VTEwpLT5oYWxlbiA9PSA0LAkJaGFsZW5fb2Zmc2V0KTsKK3N0YXRpY19hc3NlcnQoKGludCkmKChzdHJ1Y3QgZmFrZV9saW51eF9sYXBkX2hlYWRlciopTlVMTCktPmFkZHIgPT0gNiwJCWFkZHJfb2Zmc2V0KTsKK3N0YXRpY19hc3NlcnQoKGludCkmKChzdHJ1Y3QgZmFrZV9saW51eF9sYXBkX2hlYWRlciopTlVMTCktPnByb3RvY29sID09IDE0LAlwcm90b19vZmZzZXQpOworc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IGZha2VfbGludXhfbGFwZF9oZWFkZXIpID09IDE2LAkJCWxhcGRfaGVhZGVyX3NpemUpOworCisKK3N0YXRpYyBpbnQgcGNhcF9mZCA9IC0xOworCit2b2lkIGUxX3NldF9wY2FwX2ZkKGludCBmZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBwY2FwX2hkciBoZWFkZXIgPSB7CisJCS5tYWdpY19udW1iZXIJPSAweGExYjJjM2Q0LAorCQkudmVyc2lvbl9tYWpvcgk9IDIsCisJCS52ZXJzaW9uX21pbm9yCT0gNCwKKwkJLnRoaXN6b25lCT0gMCwKKwkJLnNpZ2ZpZ3MJPSAwLAorCQkuc25hcGxlbgk9IDY1NTM1LAorCQkubmV0d29yawk9IERMVF9MSU5VWF9MQVBELAorCX07CisKKwlwY2FwX2ZkID0gZmQ7CisJcmV0ID0gd3JpdGUocGNhcF9mZCwgJmhlYWRlciwgc2l6ZW9mKGhlYWRlcikpOworfQorCisvKiBUaGlzIGN1cnJlbnRseSBvbmx5IHdvcmtzIGZvciB0aGUgRC1DaGFubmVsICovCitzdGF0aWMgdm9pZCB3cml0ZV9wY2FwX3BhY2tldChpbnQgZGlyZWN0aW9uLCBpbnQgc2FwaSwgaW50IHRlaSwKKwkJCSAgICAgIHN0cnVjdCBtc2diICptc2cpIHsKKwlpZiAocGNhcF9mZCA8IDApCisJCXJldHVybjsKKworCWludCByZXQ7CisJdGltZV90IGN1cl90aW1lOworCXN0cnVjdCB0bSAqdG07CisJaW50IG1pX2hlYWQgPSAoZGlyZWN0aW9uPT1QQ0FQX0lOUFVUKSA/IE1JU0ROX0hFQURFUl9MRU4gOiAwOworCisJc3RydWN0IGZha2VfbGludXhfbGFwZF9oZWFkZXIgaGVhZGVyID0geworCQkucGt0dHlwZQk9IDQsCisJCS5oYXR5cGUJCT0gMCwKKwkJLmhhbGVuCQk9IDAsCisJCS5hZGRyCQk9IGRpcmVjdGlvbiA9PSBQQ0FQX09VVFBVVCA/IDB4MCA6IDB4MSwKKwkJLnByb3RvY29sCT0gbnRvaHMoNDgpLAorCX07CisKKwlzdHJ1Y3QgbGFwZF9oZWFkZXIgbGFwZF9oZWFkZXIgPSB7CisJCS5lYTEJCT0gMCwKKwkJLmNyCQk9IGRpcmVjdGlvbiA9PSBQQ0FQX09VVFBVVCA/IDEgOiAwLAorCQkuc2FwaQkJPSBzYXBpICYgMHgzRiwKKwkJLmVhMgkJPSAxLAorCQkudGVpCQk9IHRlaSAmIDB4N0YsCisJCS5jb250cm9sX2Zvbwk9IDB4MDMgLyogVUkgKi8sCisJfTsJCisKKwlzdHJ1Y3QgcGNhcHJlY19oZHIgcGF5bG9hZF9oZWFkZXIgPSB7CisJCS50c19zZWMJICAgID0gMCwKKwkJLnRzX3VzZWMgICAgPSAwLAorCQkuaW5jbF9sZW4gICA9IG1zZy0+bGVuICsgc2l6ZW9mKHN0cnVjdCBmYWtlX2xpbnV4X2xhcGRfaGVhZGVyKQorCQkJCSsgc2l6ZW9mKHN0cnVjdCBsYXBkX2hlYWRlcikKKwkJCQktIG1pX2hlYWQsCisJCS5vcmlnX2xlbiAgID0gbXNnLT5sZW4gKyBzaXplb2Yoc3RydWN0IGZha2VfbGludXhfbGFwZF9oZWFkZXIpCisJCQkJKyBzaXplb2Yoc3RydWN0IGxhcGRfaGVhZGVyKQorCQkJCS0gbWlfaGVhZCwKKwl9OworCisKKwljdXJfdGltZSA9IHRpbWUoTlVMTCk7CisJdG0gPSBsb2NhbHRpbWUoJmN1cl90aW1lKTsKKwlwYXlsb2FkX2hlYWRlci50c19zZWMgPSBta3RpbWUodG0pOworCisJcmV0ID0gd3JpdGUocGNhcF9mZCwgJnBheWxvYWRfaGVhZGVyLCBzaXplb2YocGF5bG9hZF9oZWFkZXIpKTsKKwlyZXQgPSB3cml0ZShwY2FwX2ZkLCAmaGVhZGVyLCBzaXplb2YoaGVhZGVyKSk7CisJcmV0ID0gd3JpdGUocGNhcF9mZCwgJmxhcGRfaGVhZGVyLCBzaXplb2YobGFwZF9oZWFkZXIpKTsKKwlyZXQgPSB3cml0ZShwY2FwX2ZkLCBtc2ctPmRhdGEgKyBtaV9oZWFkLAorCQkJbXNnLT5sZW4gLSBtaV9oZWFkKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnNpZ25fdHlwZXNbXSA9IHsKKwlbRTFJTlBfU0lHTl9OT05FXQk9ICJOb25lIiwKKwlbRTFJTlBfU0lHTl9PTUxdCT0gIk9NTCIsCisJW0UxSU5QX1NJR05fUlNMXQk9ICJSU0wiLAorfTsKK2NvbnN0IGNoYXIgKmUxaW5wX3NpZ250eXBlX25hbWUoZW51bSBlMWlucF9zaWduX3R5cGUgdHApCit7CisJaWYgKHRwID49IEFSUkFZX1NJWkUoc2lnbl90eXBlcykpCisJCXJldHVybiAidW5kZWZpbmVkIjsKKwlyZXR1cm4gc2lnbl90eXBlc1t0cF07Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICp0c190eXBlc1tdID0geworCVtFMUlOUF9UU19UWVBFX05PTkVdCT0gIk5vbmUiLAorCVtFMUlOUF9UU19UWVBFX1NJR05dCT0gIlNpZ25hbGxpbmciLAorCVtFMUlOUF9UU19UWVBFX1RSQVVdCT0gIlRSQVUiLAorfTsKKworY29uc3QgY2hhciAqZTFpbnBfdHN0eXBlX25hbWUoZW51bSBlMWlucF90c190eXBlIHRwKQoreworCWlmICh0cCA+PSBBUlJBWV9TSVpFKHRzX3R5cGVzKSkKKwkJcmV0dXJuICJ1bmRlZmluZWQiOworCXJldHVybiB0c190eXBlc1t0cF07Cit9CisKKy8qIGNhbGxiYWNrIHdoZW4gYSBUUkFVIGZyYW1lIHdhcyByZWNlaXZlZCAqLworc3RhdGljIGludCBzdWJjaF9jYihzdHJ1Y3Qgc3ViY2hfZGVtdXggKmRteCwgaW50IGNoLCB1X2ludDhfdCAqZGF0YSwgaW50IGxlbiwKKwkJICAgIHZvaWQgKl9wcml2KQoreworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gX3ByaXY7CisJc3RydWN0IGdzbV9lMV9zdWJzbG90IHNyY19zczsKKworCXNyY19zcy5lMV9uciA9IGUxaV90cy0+bGluZS0+bnVtOworCXNyY19zcy5lMV90cyA9IGUxaV90cy0+bnVtOworCXNyY19zcy5lMV90c19zcyA9IGNoOworCisJcmV0dXJuIHRyYXVfbXV4X2lucHV0KCZzcmNfc3MsIGRhdGEsIGxlbik7Cit9CisKK2ludCBhYmlzX3JzbF9zZW5kbXNnKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqc2lnbl9saW5rOworCXN0cnVjdCBlMWlucF9kcml2ZXIgKmUxaW5wX2RyaXZlcjsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90czsKKworCW1zZy0+bDJoID0gbXNnLT5kYXRhOworCisJaWYgKCFtc2ctPnRyeCkgeworCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICJyc2xfc2VuZG1zZzogbXNnLT50cnggPT0gTlVMTDogJXNcbiIsCisJCQloZXhkdW1wKG1zZy0+ZGF0YSwgbXNnLT5sZW4pKTsKKwkJdGFsbG9jX2ZyZWUobXNnKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIGlmICghbXNnLT50cngtPnJzbF9saW5rKSB7CisJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgInJzbF9zZW5kbXNnOiBtc2ctPnRyeC0+cnNsX2xpbmsgPT0gTlVMTDogJXNcbiIsCisJCQloZXhkdW1wKG1zZy0+ZGF0YSwgbXNnLT5sZW4pKTsKKwkJdGFsbG9jX2ZyZWUobXNnKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJc2lnbl9saW5rID0gbXNnLT50cngtPnJzbF9saW5rOworCWUxaV90cyA9IHNpZ25fbGluay0+dHM7CisJaWYgKCFic2NfdGltZXJfcGVuZGluZygmZTFpX3RzLT5zaWduLnR4X3RpbWVyKSkgeworCQkvKiBub3RpZnkgdGhlIGRyaXZlciB3ZSBoYXZlIHNvbWV0aGluZyB0byB3cml0ZSAqLworCQllMWlucF9kcml2ZXIgPSBzaWduX2xpbmstPnRzLT5saW5lLT5kcml2ZXI7CisJCWUxaW5wX2RyaXZlci0+d2FudF93cml0ZShlMWlfdHMpOworCX0KKwltc2diX2VucXVldWUoJnNpZ25fbGluay0+dHhfbGlzdCwgbXNnKTsKKworCS8qIGR1bXAgaXQgKi8KKwl3cml0ZV9wY2FwX3BhY2tldChQQ0FQX09VVFBVVCwgc2lnbl9saW5rLT5zYXBpLCBzaWduX2xpbmstPnRlaSwgbXNnKTsKKworCXJldHVybiAwOworfQorCitpbnQgX2FiaXNfbm1fc2VuZG1zZyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKnNpZ25fbGluazsKKwlzdHJ1Y3QgZTFpbnBfZHJpdmVyICplMWlucF9kcml2ZXI7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHM7CisKKwltc2ctPmwyaCA9IG1zZy0+ZGF0YTsKKworCWlmICghbXNnLT50cnggfHwgIW1zZy0+dHJ4LT5idHMgfHwgIW1zZy0+dHJ4LT5idHMtPm9tbF9saW5rKSB7CisJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgIm5tX3NlbmRtc2c6IG1zZy0+dHJ4ID09IE5VTExcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzaWduX2xpbmsgPSBtc2ctPnRyeC0+YnRzLT5vbWxfbGluazsKKwllMWlfdHMgPSBzaWduX2xpbmstPnRzOworCWlmICghYnNjX3RpbWVyX3BlbmRpbmcoJmUxaV90cy0+c2lnbi50eF90aW1lcikpIHsKKwkJLyogbm90aWZ5IHRoZSBkcml2ZXIgd2UgaGF2ZSBzb21ldGhpbmcgdG8gd3JpdGUgKi8KKwkJZTFpbnBfZHJpdmVyID0gc2lnbl9saW5rLT50cy0+bGluZS0+ZHJpdmVyOworCQllMWlucF9kcml2ZXItPndhbnRfd3JpdGUoZTFpX3RzKTsKKwl9CisJbXNnYl9lbnF1ZXVlKCZzaWduX2xpbmstPnR4X2xpc3QsIG1zZyk7CisKKwkvKiBkdW1wIGl0ICovCisJd3JpdGVfcGNhcF9wYWNrZXQoUENBUF9PVVRQVVQsIHNpZ25fbGluay0+c2FwaSwgc2lnbl9saW5rLT50ZWksIG1zZyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogVGltZXNsb3QgKi8KKworLyogY29uZmlndXJlIGFuZCBpbml0aWFsaXplIG9uZSBlMWlucF90cyAqLworaW50IGUxaW5wX3RzX2NvbmZpZyhzdHJ1Y3QgZTFpbnBfdHMgKnRzLCBzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSwKKwkJICAgIGVudW0gZTFpbnBfdHNfdHlwZSB0eXBlKQoreworCWlmICh0cy0+dHlwZSA9PSB0eXBlICYmIHRzLT5saW5lICYmIGxpbmUpCisJCXJldHVybiAwOworCisJdHMtPnR5cGUgPSB0eXBlOworCXRzLT5saW5lID0gbGluZTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgRTFJTlBfVFNfVFlQRV9TSUdOOgorCQlJTklUX0xMSVNUX0hFQUQoJnRzLT5zaWduLnNpZ25fbGlua3MpOworCQlicmVhazsKKwljYXNlIEUxSU5QX1RTX1RZUEVfVFJBVToKKwkJc3ViY2hhbl9tdXhfaW5pdCgmdHMtPnRyYXUubXV4KTsKKwkJdHMtPnRyYXUuZGVtdXgub3V0X2NiID0gc3ViY2hfY2I7CisJCXRzLT50cmF1LmRlbXV4LmRhdGEgPSB0czsKKwkJc3ViY2hfZGVtdXhfaW5pdCgmdHMtPnRyYXUuZGVtdXgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERNSSwgTE9HTF9FUlJPUiwgInVuc3VwcG9ydGVkIEUxIHRpbWVzbG90IHR5cGUgJXVcbiIsCisJCQl0cy0+dHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBlMWlucF9saW5lICplMWlucF9saW5lX2dldCh1X2ludDhfdCBlMV9ucikKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqZTFpX2xpbmU7CisKKwkvKiBpdGVyYXRlIG92ZXIgZ2xvYmFsIGxpc3Qgb2YgZTEgbGluZXMgKi8KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShlMWlfbGluZSwgJmUxaW5wX2xpbmVfbGlzdCwgbGlzdCkgeworCQlpZiAoZTFpX2xpbmUtPm51bSA9PSBlMV9ucikKKwkJCXJldHVybiBlMWlfbGluZTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBlMWlucF9saW5lICplMWlucF9saW5lX2dldF9jcmVhdGUodV9pbnQ4X3QgZTFfbnIpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmU7CisJaW50IGk7CisKKwlsaW5lID0gZTFpbnBfbGluZV9nZXQoZTFfbnIpOworCWlmIChsaW5lKQorCQlyZXR1cm4gbGluZTsKKworCWxpbmUgPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBlMWlucF9saW5lKTsKKwlpZiAoIWxpbmUpCisJCXJldHVybiBOVUxMOworCisJbGluZS0+bnVtID0gZTFfbnI7CisJZm9yIChpID0gMDsgaSA8IE5VTV9FMV9UUzsgaSsrKSB7CisJCWxpbmUtPnRzW2ldLm51bSA9IGkrMTsKKwkJbGluZS0+dHNbaV0ubGluZSA9IGxpbmU7CisJfQorCWxsaXN0X2FkZF90YWlsKCZsaW5lLT5saXN0LCAmZTFpbnBfbGluZV9saXN0KTsKKworCXJldHVybiBsaW5lOworfQorCitzdGF0aWMgc3RydWN0IGUxaW5wX3RzICplMWlucF90c19nZXQodV9pbnQ4X3QgZTFfbnIsIHVfaW50OF90IHRzX25yKQoreworCXN0cnVjdCBlMWlucF9saW5lICplMWlfbGluZTsKKworCWUxaV9saW5lID0gZTFpbnBfbGluZV9nZXQoZTFfbnIpOworCWlmICghZTFpX2xpbmUpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuICZlMWlfbGluZS0+dHNbdHNfbnItMV07Cit9CisKK3N0cnVjdCBzdWJjaF9tdXggKmUxaW5wX2dldF9tdXgodV9pbnQ4X3QgZTFfbnIsIHVfaW50OF90IHRzX25yKQoreworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gZTFpbnBfdHNfZ2V0KGUxX25yLCB0c19ucik7CisKKwlpZiAoIWUxaV90cykKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gJmUxaV90cy0+dHJhdS5tdXg7Cit9CisKKy8qIFNpZ25hbGxpbmcgTGluayAqLworCitzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICplMWlucF9sb29rdXBfc2lnbl9saW5rKHN0cnVjdCBlMWlucF90cyAqZTFpLAorCQkJCQkgCXVfaW50OF90IHRlaSwgdV9pbnQ4X3Qgc2FwaSkKK3sKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpsaW5rOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkobGluaywgJmUxaS0+c2lnbi5zaWduX2xpbmtzLCBsaXN0KSB7CisJCWlmIChsaW5rLT5zYXBpID09IHNhcGkgJiYgbGluay0+dGVpID09IHRlaSkKKwkJCXJldHVybiBsaW5rOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKiBjcmVhdGUgYSBuZXcgc2lnbmFsbGluZyBsaW5rIGluIGEgRTEgdGltZXNsb3QgKi8KKworc3RydWN0IGUxaW5wX3NpZ25fbGluayAqCitlMWlucF9zaWduX2xpbmtfY3JlYXRlKHN0cnVjdCBlMWlucF90cyAqdHMsIGVudW0gZTFpbnBfc2lnbl90eXBlIHR5cGUsCisJCQlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgdGVpLAorCQkJdV9pbnQ4X3Qgc2FwaSkKK3sKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpsaW5rOworCisJaWYgKHRzLT50eXBlICE9IEUxSU5QX1RTX1RZUEVfU0lHTikKKwkJcmV0dXJuIE5VTEw7CisKKwlsaW5rID0gdGFsbG9jX3plcm8odGFsbF9zaWdsX2N0eCwgc3RydWN0IGUxaW5wX3NpZ25fbGluayk7CisJaWYgKCFsaW5rKQorCQlyZXR1cm4gTlVMTDsKKworCWxpbmstPnRzID0gdHM7CisJbGluay0+dHlwZSA9IHR5cGU7CisJSU5JVF9MTElTVF9IRUFEKCZsaW5rLT50eF9saXN0KTsKKwlsaW5rLT50cnggPSB0cng7CisJbGluay0+dGVpID0gdGVpOworCWxpbmstPnNhcGkgPSBzYXBpOworCisJbGxpc3RfYWRkX3RhaWwoJmxpbmstPmxpc3QsICZ0cy0+c2lnbi5zaWduX2xpbmtzKTsKKworCXJldHVybiBsaW5rOworfQorCit2b2lkIGUxaW5wX3NpZ25fbGlua19kZXN0cm95KHN0cnVjdCBlMWlucF9zaWduX2xpbmsgKmxpbmspCit7CisJc3RydWN0IG1zZ2IgKm1zZzsKKworCWxsaXN0X2RlbCgmbGluay0+bGlzdCk7CisJd2hpbGUgKCFsbGlzdF9lbXB0eSgmbGluay0+dHhfbGlzdCkpIHsKKwkJbXNnID0gbXNnYl9kZXF1ZXVlKCZsaW5rLT50eF9saXN0KTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJfQorCisJaWYgKGxpbmstPnRzLT50eXBlID09IEUxSU5QX1RTX1RZUEVfU0lHTikKKwkJYnNjX2RlbF90aW1lcigmbGluay0+dHMtPnNpZ24udHhfdGltZXIpOworCisJdGFsbG9jX2ZyZWUobGluayk7Cit9CisKKy8qIHRoZSBFMSBkcml2ZXIgdGVsbHMgdXMgaGUgaGFzIHJlY2VpdmVkIHNvbWV0aGluZyBvbiBhIFRTICovCitpbnQgZTFpbnBfcnhfdHMoc3RydWN0IGUxaW5wX3RzICp0cywgc3RydWN0IG1zZ2IgKm1zZywKKwkJdV9pbnQ4X3QgdGVpLCB1X2ludDhfdCBzYXBpKQoreworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKmxpbms7CisJaW50IHJldDsKKworCXN3aXRjaCAodHMtPnR5cGUpIHsKKwljYXNlIEUxSU5QX1RTX1RZUEVfU0lHTjoKKwkJLyogY29uc3VsdCB0aGUgbGlzdCBvZiBzaWduYWxsaW5nIGxpbmtzICovCisJCXdyaXRlX3BjYXBfcGFja2V0KFBDQVBfSU5QVVQsIHNhcGksIHRlaSwgbXNnKTsKKwkJbGluayA9IGUxaW5wX2xvb2t1cF9zaWduX2xpbmsodHMsIHRlaSwgc2FwaSk7CisJCWlmICghbGluaykgeworCQkJTE9HUChETUksIExPR0xfRVJST1IsICJkaWRuJ3QgZmluZCBzaWduYWxsaW5nIGxpbmsgZm9yICIKKwkJCQkidGVpICVkLCBzYXBpICVkXG4iLCB0ZWksIHNhcGkpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlsb2dfc2V0X2NvbnRleHQoQlNDX0NUWF9CVFMsIGxpbmstPnRyeC0+YnRzKTsKKwkJc3dpdGNoIChsaW5rLT50eXBlKSB7CisJCWNhc2UgRTFJTlBfU0lHTl9PTUw6CisJCQltc2ctPnRyeCA9IGxpbmstPnRyeDsKKwkJCXJldCA9IGFiaXNfbm1fcmN2bXNnKG1zZyk7CisJCQlicmVhazsKKwkJY2FzZSBFMUlOUF9TSUdOX1JTTDoKKwkJCW1zZy0+dHJ4ID0gbGluay0+dHJ4OworCQkJcmV0ID0gYWJpc19yc2xfcmN2bXNnKG1zZyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlMT0dQKERNSSwgTE9HTF9FUlJPUiwgInVua25vd24gbGluayB0eXBlICV1XG4iLCBsaW5rLT50eXBlKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgRTFJTlBfVFNfVFlQRV9UUkFVOgorCQlyZXQgPSBzdWJjaF9kZW11eF9pbigmdHMtPnRyYXUuZGVtdXgsIG1zZy0+bDJoLCBtc2diX2wybGVuKG1zZykpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlMT0dQKERNSSwgTE9HTF9FUlJPUiwgInVua25vd24gVFMgdHlwZSAldVxuIiwgdHMtPnR5cGUpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIFRTWF9BTExPQ19TSVpFIDQwOTYKKworLyogY2FsbGVkIGJ5IGRyaXZlciBpZiBpdCB3YW50cyB0byB0cmFuc21pdCBvbiBhIGdpdmVuIFRTICovCitzdHJ1Y3QgbXNnYiAqZTFpbnBfdHhfdHMoc3RydWN0IGUxaW5wX3RzICplMWlfdHMsCisJCQkgc3RydWN0IGUxaW5wX3NpZ25fbGluayAqKnNpZ25fbGluaykKK3sKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpsaW5rOworCXN0cnVjdCBtc2diICptc2cgPSBOVUxMOworCWludCBsZW47CisKKwlzd2l0Y2ggKGUxaV90cy0+dHlwZSkgeworCWNhc2UgRTFJTlBfVFNfVFlQRV9TSUdOOgorCQkvKiBGSVhNRTogaW1wbGVtZW50IHRoaXMgcm91bmQgcm9iaW4gKi8KKwkJbGxpc3RfZm9yX2VhY2hfZW50cnkobGluaywgJmUxaV90cy0+c2lnbi5zaWduX2xpbmtzLCBsaXN0KSB7CisJCQltc2cgPSBtc2diX2RlcXVldWUoJmxpbmstPnR4X2xpc3QpOworCQkJaWYgKG1zZykgeworCQkJCWlmIChzaWduX2xpbmspCisJCQkJCSpzaWduX2xpbmsgPSBsaW5rOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgRTFJTlBfVFNfVFlQRV9UUkFVOgorCQltc2cgPSBtc2diX2FsbG9jKFRTWF9BTExPQ19TSVpFLCAiVFJBVV9UWCIpOworCQlpZiAoIW1zZykKKwkJCXJldHVybiBOVUxMOworCQlsZW4gPSBzdWJjaGFuX211eF9vdXQoJmUxaV90cy0+dHJhdS5tdXgsIG1zZy0+ZGF0YSwgNDApOworCQltc2diX3B1dChtc2csIDQwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETUksIExPR0xfRVJST1IsICJ1bnN1cHBvcnRlZCBFMSBUUyB0eXBlICV1XG4iLCBlMWlfdHMtPnR5cGUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIG1zZzsKK30KKworLyogY2FsbGVkIGJ5IGRyaXZlciBpbiBjYXNlIHNvbWUga2luZCBvZiBsaW5rIHN0YXRlIGV2ZW50ICovCitpbnQgZTFpbnBfZXZlbnQoc3RydWN0IGUxaW5wX3RzICp0cywgaW50IGV2dCwgdV9pbnQ4X3QgdGVpLCB1X2ludDhfdCBzYXBpKQoreworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKmxpbms7CisKKwlsaW5rID0gZTFpbnBfbG9va3VwX3NpZ25fbGluayh0cywgdGVpLCBzYXBpKTsKKwlpZiAoIWxpbmspCisJCXJldHVybiAtRUlOVkFMOworCisJLyogRklYTUU6IHJlcG9ydCBmdXJ0aGVyIHVwd2FyZHMgKi8KKwlpbnB1dF9ldmVudChldnQsIGxpbmstPnR5cGUsIGxpbmstPnRyeCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIHJlZ2lzdGVyIGEgZHJpdmVyIHdpdGggdGhlIEUxIGNvcmUgKi8KK2ludCBlMWlucF9kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IGUxaW5wX2RyaXZlciAqZHJ2KQoreworCWxsaXN0X2FkZF90YWlsKCZkcnYtPmxpc3QsICZlMWlucF9kcml2ZXJfbGlzdCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBlMWlucF9saW5lX3VwZGF0ZShzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSkKK3sKKwlyZXR1cm4gbWlfZTFfbGluZV91cGRhdGUobGluZSk7Cit9CisKK3N0YXRpYyBpbnQgZTFpX3NpZ19jYih1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgc2lnbmFsLAorCQkgICAgICB2b2lkICpoYW5kbGVyX2RhdGEsIHZvaWQgKnNpZ25hbF9kYXRhKQoreworCWlmIChzdWJzeXMgIT0gU1NfR0xPQkFMIHx8CisJICAgIHNpZ25hbCAhPSBTX0dMT0JBTF9TSFVURE9XTikKKwkJcmV0dXJuIDA7CisKKwlpZiAocGNhcF9mZCkgeworCQljbG9zZShwY2FwX2ZkKTsKKwkJcGNhcF9mZCA9IC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKSB2b2lkIG9uX2Rzb19sb2FkX2UxX2lucCh2b2lkKQoreworCXRhbGxfc2lnbF9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAxLAorCQkJCQkgICAiZTFpbnBfc2lnbl9saW5rIik7CisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfR0xPQkFMLCBlMWlfc2lnX2NiLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dwcnMvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL3NyYy9ncHJzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNDI5MjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ncHJzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTcgQEAKK0lOQ0xVREVTID0gJChhbGxfaW5jbHVkZXMpIC1JJCh0b3Bfc3JjZGlyKS9pbmNsdWRlIC1JJCh0b3BfYnVpbGRkaXIpCitBTV9DRkxBR1M9LVdhbGwgJChMSUJPU01PQ09SRV9DRkxBR1MpCitBTV9MREZMQUdTID0gJChMSUJPU01PQ09SRV9MSUJTKQorCitzYmluX1BST0dSQU1TID0gb3Ntby1nYnByb3h5IG9zbW8tc2dzbgorbm9pbnN0X0xJQlJBUklFUyA9IGxpYnNnc24uYQorCitsaWJzZ3NuX2FfU09VUkNFUyA9IGdwcnNfbnMuYyBncHJzX2Jzc2dwLmMgZ3Byc19sbGMuYyBnc21fMDRfMDhfZ3Bycy5jIFwKKwkJY3JjMjQuYyBncHJzX3Nnc24uYworCitvc21vX2dicHJveHlfU09VUkNFUyA9IGdiX3Byb3h5LmMgZ2JfcHJveHlfbWFpbi5jIGdiX3Byb3h5X3Z0eS5jIFwKKwkJCWdwcnNfbnMuYyAkKHRvcF9zcmNkaXIpL3NyYy9zb2NrZXQuYyAkKHRvcF9zcmNkaXIpL3NyYy9kZWJ1Zy5jCitvc21vX2dicHJveHlfTERBREQgPSAkKHRvcF9idWlsZGRpcikvc3JjL2xpYnZ0eS5hCisKK29zbW9fc2dzbl9TT1VSQ0VTID0gc2dzbl9tYWluLmMgc2dzbl92dHkuYyBcCisJCQkkKHRvcF9zcmNkaXIpL3NyYy9zb2NrZXQuYyAkKHRvcF9zcmNkaXIpL3NyYy9kZWJ1Zy5jCitvc21vX3Nnc25fTERBREQgPSAkKHRvcF9idWlsZGRpcikvc3JjL2xpYnZ0eS5hIGxpYnNnc24uYQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3Bycy9jcmMyNC5jIGIvb3BlbmJzYy9zcmMvZ3Bycy9jcmMyNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwODIxMjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ncHJzL2NyYzI0LmMKQEAgLTAsMCArMSw2OSBAQAorLyogR1BSUyBMTEMgQ1JDLTI0IEltcGxlbWVudGF0aW9uICovCisKKy8qIChDKSAyMDA4LTIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvY3JjMjQuaD4KKworLyogQ1JDMjQgdGFibGUgLSBGQ1MgKi8KK3N0YXRpYyBjb25zdCB1X2ludDMyX3QgdGJsX2NyYzI0WzI1Nl0gPSB7CisJMHgwMDAwMDAwMCwgMHgwMGQ2YTc3NiwgMHgwMGY2NDU1NywgMHgwMDIwZTIyMSwgMHgwMGI3ODExNSwgMHgwMDYxMjY2MywgMHgwMDQxYzQ0MiwgMHgwMDk3NjMzNCwKKwkweDAwMzQwOTkxLCAweDAwZTJhZWU3LCAweDAwYzI0Y2M2LCAweDAwMTRlYmIwLCAweDAwODM4ODg0LCAweDAwNTUyZmYyLCAweDAwNzVjZGQzLCAweDAwYTM2YWE1LAorCTB4MDA2ODEzMjIsIDB4MDBiZWI0NTQsIDB4MDA5ZTU2NzUsIDB4MDA0OGYxMDMsIDB4MDBkZjkyMzcsIDB4MDAwOTM1NDEsIDB4MDAyOWQ3NjAsIDB4MDBmZjcwMTYsCisJMHgwMDVjMWFiMywgMHgwMDhhYmRjNSwgMHgwMGFhNWZlNCwgMHgwMDdjZjg5MiwgMHgwMGViOWJhNiwgMHgwMDNkM2NkMCwgMHgwMDFkZGVmMSwgMHgwMGNiNzk4NywKKwkweDAwZDAyNjQ0LCAweDAwMDY4MTMyLCAweDAwMjY2MzEzLCAweDAwZjBjNDY1LCAweDAwNjdhNzUxLCAweDAwYjEwMDI3LCAweDAwOTFlMjA2LCAweDAwNDc0NTcwLAorCTB4MDBlNDJmZDUsIDB4MDAzMjg4YTMsIDB4MDAxMjZhODIsIDB4MDBjNGNkZjQsIDB4MDA1M2FlYzAsIDB4MDA4NTA5YjYsIDB4MDBhNWViOTcsIDB4MDA3MzRjZTEsCisJMHgwMGI4MzU2NiwgMHgwMDZlOTIxMCwgMHgwMDRlNzAzMSwgMHgwMDk4ZDc0NywgMHgwMDBmYjQ3MywgMHgwMGQ5MTMwNSwgMHgwMGY5ZjEyNCwgMHgwMDJmNTY1MiwKKwkweDAwOGMzY2Y3LCAweDAwNWE5YjgxLCAweDAwN2E3OWEwLCAweDAwYWNkZWQ2LCAweDAwM2JiZGUyLCAweDAwZWQxYTk0LCAweDAwY2RmOGI1LCAweDAwMWI1ZmMzLAorCTB4MDBmYjQ3MzMsIDB4MDAyZGUwNDUsIDB4MDAwZDAyNjQsIDB4MDBkYmE1MTIsIDB4MDA0Y2M2MjYsIDB4MDA5YTYxNTAsIDB4MDBiYTgzNzEsIDB4MDA2YzI0MDcsCisJMHgwMGNmNGVhMiwgMHgwMDE5ZTlkNCwgMHgwMDM5MGJmNSwgMHgwMGVmYWM4MywgMHgwMDc4Y2ZiNywgMHgwMGFlNjhjMSwgMHgwMDhlOGFlMCwgMHgwMDU4MmQ5NiwKKwkweDAwOTM1NDExLCAweDAwNDVmMzY3LCAweDAwNjUxMTQ2LCAweDAwYjNiNjMwLCAweDAwMjRkNTA0LCAweDAwZjI3MjcyLCAweDAwZDI5MDUzLCAweDAwMDQzNzI1LAorCTB4MDBhNzVkODAsIDB4MDA3MWZhZjYsIDB4MDA1MTE4ZDcsIDB4MDA4N2JmYTEsIDB4MDAxMGRjOTUsIDB4MDBjNjdiZTMsIDB4MDBlNjk5YzIsIDB4MDAzMDNlYjQsCisJMHgwMDJiNjE3NywgMHgwMGZkYzYwMSwgMHgwMGRkMjQyMCwgMHgwMDBiODM1NiwgMHgwMDljZTA2MiwgMHgwMDRhNDcxNCwgMHgwMDZhYTUzNSwgMHgwMGJjMDI0MywKKwkweDAwMWY2OGU2LCAweDAwYzljZjkwLCAweDAwZTkyZGIxLCAweDAwM2Y4YWM3LCAweDAwYThlOWYzLCAweDAwN2U0ZTg1LCAweDAwNWVhY2E0LCAweDAwODgwYmQyLAorCTB4MDA0MzcyNTUsIDB4MDA5NWQ1MjMsIDB4MDBiNTM3MDIsIDB4MDA2MzkwNzQsIDB4MDBmNGYzNDAsIDB4MDAyMjU0MzYsIDB4MDAwMmI2MTcsIDB4MDBkNDExNjEsCisJMHgwMDc3N2JjNCwgMHgwMGExZGNiMiwgMHgwMDgxM2U5MywgMHgwMDU3OTllNSwgMHgwMGMwZmFkMSwgMHgwMDE2NWRhNywgMHgwMDM2YmY4NiwgMHgwMGUwMThmMCwKKwkweDAwYWQ4NWRkLCAweDAwN2IyMmFiLCAweDAwNWJjMDhhLCAweDAwOGQ2N2ZjLCAweDAwMWEwNGM4LCAweDAwY2NhM2JlLCAweDAwZWM0MTlmLCAweDAwM2FlNmU5LAorCTB4MDA5OThjNGMsIDB4MDA0ZjJiM2EsIDB4MDA2ZmM5MWIsIDB4MDBiOTZlNmQsIDB4MDAyZTBkNTksIDB4MDBmOGFhMmYsIDB4MDBkODQ4MGUsIDB4MDAwZWVmNzgsCisJMHgwMGM1OTZmZiwgMHgwMDEzMzE4OSwgMHgwMDMzZDNhOCwgMHgwMGU1NzRkZSwgMHgwMDcyMTdlYSwgMHgwMGE0YjA5YywgMHgwMDg0NTJiZCwgMHgwMDUyZjVjYiwKKwkweDAwZjE5ZjZlLCAweDAwMjczODE4LCAweDAwMDdkYTM5LCAweDAwZDE3ZDRmLCAweDAwNDYxZTdiLCAweDAwOTBiOTBkLCAweDAwYjA1YjJjLCAweDAwNjZmYzVhLAorCTB4MDA3ZGEzOTksIDB4MDBhYjA0ZWYsIDB4MDA4YmU2Y2UsIDB4MDA1ZDQxYjgsIDB4MDBjYTIyOGMsIDB4MDAxYzg1ZmEsIDB4MDAzYzY3ZGIsIDB4MDBlYWMwYWQsCisJMHgwMDQ5YWEwOCwgMHgwMDlmMGQ3ZSwgMHgwMGJmZWY1ZiwgMHgwMDY5NDgyOSwgMHgwMGZlMmIxZCwgMHgwMDI4OGM2YiwgMHgwMDA4NmU0YSwgMHgwMGRlYzkzYywKKwkweDAwMTViMGJiLCAweDAwYzMxN2NkLCAweDAwZTNmNWVjLCAweDAwMzU1MjlhLCAweDAwYTIzMWFlLCAweDAwNzQ5NmQ4LCAweDAwNTQ3NGY5LCAweDAwODJkMzhmLAorCTB4MDAyMWI5MmEsIDB4MDBmNzFlNWMsIDB4MDBkN2ZjN2QsIDB4MDAwMTViMGIsIDB4MDA5NjM4M2YsIDB4MDA0MDlmNDksIDB4MDA2MDdkNjgsIDB4MDBiNmRhMWUsCisJMHgwMDU2YzJlZSwgMHgwMDgwNjU5OCwgMHgwMGEwODdiOSwgMHgwMDc2MjBjZiwgMHgwMGUxNDNmYiwgMHgwMDM3ZTQ4ZCwgMHgwMDE3MDZhYywgMHgwMGMxYTFkYSwKKwkweDAwNjJjYjdmLCAweDAwYjQ2YzA5LCAweDAwOTQ4ZTI4LCAweDAwNDIyOTVlLCAweDAwZDU0YTZhLCAweDAwMDNlZDFjLCAweDAwMjMwZjNkLCAweDAwZjVhODRiLAorCTB4MDAzZWQxY2MsIDB4MDBlODc2YmEsIDB4MDBjODk0OWIsIDB4MDAxZTMzZWQsIDB4MDA4OTUwZDksIDB4MDA1ZmY3YWYsIDB4MDA3ZjE1OGUsIDB4MDBhOWIyZjgsCisJMHgwMDBhZDg1ZCwgMHgwMGRjN2YyYiwgMHgwMGZjOWQwYSwgMHgwMDJhM2E3YywgMHgwMGJkNTk0OCwgMHgwMDZiZmUzZSwgMHgwMDRiMWMxZiwgMHgwMDlkYmI2OSwKKwkweDAwODZlNGFhLCAweDAwNTA0M2RjLCAweDAwNzBhMWZkLCAweDAwYTYwNjhiLCAweDAwMzE2NWJmLCAweDAwZTdjMmM5LCAweDAwYzcyMGU4LCAweDAwMTE4NzllLAorCTB4MDBiMmVkM2IsIDB4MDA2NDRhNGQsIDB4MDA0NGE4NmMsIDB4MDA5MjBmMWEsIDB4MDAwNTZjMmUsIDB4MDBkM2NiNTgsIDB4MDBmMzI5NzksIDB4MDAyNThlMGYsCisJMHgwMGVlZjc4OCwgMHgwMDM4NTBmZSwgMHgwMDE4YjJkZiwgMHgwMGNlMTVhOSwgMHgwMDU5NzY5ZCwgMHgwMDhmZDFlYiwgMHgwMGFmMzNjYSwgMHgwMDc5OTRiYywKKwkweDAwZGFmZTE5LCAweDAwMGM1OTZmLCAweDAwMmNiYjRlLCAweDAwZmExYzM4LCAweDAwNmQ3ZjBjLCAweDAwYmJkODdhLCAweDAwOWIzYTViLCAweDAwNGQ5ZDJkCit9OworCisjZGVmaW5lIElOSVRfQ1JDMjQJMHhmZmZmZmYKKwordV9pbnQzMl90IGNyYzI0X2NhbGModV9pbnQzMl90IGZjcywgdV9pbnQ4X3QgKmNwLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXdoaWxlIChsZW4tLSkKKwkJZmNzID0gKGZjcyA+PiA4KSBeIHRibF9jcmMyNFsoZmNzIF4gKmNwKyspICYgMHhmZl07CisJcmV0dXJuIGZjczsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dwcnMvZ2JfcHJveHkuYyBiL29wZW5ic2Mvc3JjL2dwcnMvZ2JfcHJveHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTVhZDcwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3Bycy9nYl9wcm94eS5jCkBAIC0wLDAgKzEsNDE2IEBACisvKiBOUy1vdmVyLUlQIHByb3h5ICovCisKKy8qIChDKSAyMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAxMCBieSBPbiBXYXZlcworICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL2ZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX25zLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX2Jzc2dwLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nYl9wcm94eS5oPgorCitzdHJ1Y3QgZ2Jwcm94X3BlZXIgeworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisKKwkvKiBOUy1WQyBvdmVyIHdoaWNoIHdlIHNlbmQvcmVjZWl2ZSBkYXRhIHRvIHRoaXMgQlZDICovCisJc3RydWN0IGdwcnNfbnN2YyAqbnN2YzsKKworCS8qIEJWQ0kgdXNlZCBmb3IgUG9pbnQtdG8tUG9pbnQgdG8gdGhpcyBwZWVyICovCisJdWludDE2X3QgYnZjaTsKKworCS8qIFJvdXRlaW5nIEFyZWEgdGhhdCB0aGlzIHBlZXIgaXMgcGFydCBvZiAocmF3IDA0LjA4IGVuY29kaW5nKSAqLworCXVpbnQ4X3QgcmFbNl07Cit9OworCisvKiBMaW5rZWQgbGlzdCBvZiBhbGwgR2IgcGVlcnMgKGV4Y2VwdCBTR1NOKSAqLworc3RhdGljIExMSVNUX0hFQUQoZ2Jwcm94X2J0c19wZWVycyk7CisKK2V4dGVybiBzdHJ1Y3QgZ3Byc19uc19pbnN0ICpnYnByb3hfbnNpOworCisvKiBGaW5kIHRoZSBnYnByb3hfcGVlciBieSBpdHMgQlZDSSAqLworc3RhdGljIHN0cnVjdCBnYnByb3hfcGVlciAqcGVlcl9ieV9idmNpKHVpbnQxNl90IGJ2Y2kpCit7CisJc3RydWN0IGdicHJveF9wZWVyICpwZWVyOworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHBlZXIsICZnYnByb3hfYnRzX3BlZXJzLCBsaXN0KSB7CisJCWlmIChwZWVyLT5idmNpID09IGJ2Y2kpCisJCQlyZXR1cm4gcGVlcjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ2Jwcm94X3BlZXIgKnBlZXJfYnlfbnN2YyhzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjKQoreworCXN0cnVjdCBnYnByb3hfcGVlciAqcGVlcjsKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShwZWVyLCAmZ2Jwcm94X2J0c19wZWVycywgbGlzdCkgeworCQlpZiAocGVlci0+bnN2YyA9PSBuc3ZjKQorCQkJcmV0dXJuIHBlZXI7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiBsb29rLXVwIGEgcGVlciBieSBpdHMgUm91dGVpbmcgQXJlYSBDb2RlIChSQUMpICovCitzdGF0aWMgc3RydWN0IGdicHJveF9wZWVyICpwZWVyX2J5X3JhYyhjb25zdCB1aW50OF90ICpyYSkKK3sKKwlzdHJ1Y3QgZ2Jwcm94X3BlZXIgKnBlZXI7CisJbGxpc3RfZm9yX2VhY2hfZW50cnkocGVlciwgJmdicHJveF9idHNfcGVlcnMsIGxpc3QpIHsKKwkJaWYgKCFtZW1jbXAoJnBlZXItPnJhLCByYSwgNikpCisJCQlyZXR1cm4gcGVlcjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIGxvb2stdXAgYSBwZWVyIGJ5IGl0cyBMb2NhdGlvbiBBcmVhIENvZGUgKExBQykgKi8KK3N0YXRpYyBzdHJ1Y3QgZ2Jwcm94X3BlZXIgKnBlZXJfYnlfbGFjKGNvbnN0IHVpbnQ4X3QgKmxhKQoreworCXN0cnVjdCBnYnByb3hfcGVlciAqcGVlcjsKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShwZWVyLCAmZ2Jwcm94X2J0c19wZWVycywgbGlzdCkgeworCQlpZiAoIW1lbWNtcCgmcGVlci0+cmEsIGxhLCA1KSkKKwkJCXJldHVybiBwZWVyOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBnYnByb3hfcGVlciAqcGVlcl9hbGxvYyh1aW50MTZfdCBidmNpKQoreworCXN0cnVjdCBnYnByb3hfcGVlciAqcGVlcjsKKworCXBlZXIgPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBnYnByb3hfcGVlcik7CisJaWYgKCFwZWVyKQorCQlyZXR1cm4gTlVMTDsKKworCXBlZXItPmJ2Y2kgPSBidmNpOworCWxsaXN0X2FkZCgmcGVlci0+bGlzdCwgJmdicHJveF9idHNfcGVlcnMpOworCisJcmV0dXJuIHBlZXI7Cit9CisKK3N0YXRpYyB2b2lkIHBlZXJfZnJlZShzdHJ1Y3QgZ2Jwcm94X3BlZXIgKnBlZXIpCit7CisJbGxpc3RfZGVsKCZwZWVyLT5saXN0KTsKKwl0YWxsb2NfZnJlZShwZWVyKTsKK30KKworLyogc3RyaXAgb2ZmIHRoZSBOUyBoZWFkZXIgKi8KK3N0YXRpYyB2b2lkIHN0cmlwX25zX2hkcihzdHJ1Y3QgbXNnYiAqbXNnKQoreworCWludCBzdHJpcF9sZW4gPSBtc2diX2Jzc2dwaChtc2cpIC0gbXNnLT5kYXRhOworCW1zZ2JfcHVsbChtc2csIHN0cmlwX2xlbik7Cit9CisKKy8qIEZJWE1FOiB0aGlzIGlzIGNvcHkrcGFzdGUgZnJvbSBncHJzX2Jzc2dwLmMgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1zZ2IgKmJzc2dwX21zZ2JfYWxsb2Modm9pZCkKK3sKKwlyZXR1cm4gbXNnYl9hbGxvY19oZWFkcm9vbSg0MDk2LCAxMjgsICJCU1NHUCIpOworfQorc3RhdGljIGludCBic3NncF90eF9zaW1wbGVfYnZjaSh1aW50OF90IHBkdV90eXBlLCB1aW50MTZfdCBuc2VpLAorCQkJICAgICAgICB1aW50MTZfdCBidmNpLCB1aW50MTZfdCBuc19idmNpKQoreworCXN0cnVjdCBtc2diICptc2cgPSBic3NncF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGJzc2dwX25vcm1hbF9oZHIgKmJncGggPQorCQkJKHN0cnVjdCBic3NncF9ub3JtYWxfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpiZ3BoKSk7CisJdWludDE2X3QgX2J2Y2k7CisKKwltc2diX25zZWkobXNnKSA9IG5zZWk7CisJbXNnYl9idmNpKG1zZykgPSBuc19idmNpOworCisJYmdwaC0+cGR1X3R5cGUgPSBwZHVfdHlwZTsKKwlfYnZjaSA9IGh0b25zKGJ2Y2kpOworCW1zZ2JfdHZsdl9wdXQobXNnLCBCU1NHUF9JRV9CVkNJLCAyLCAodWludDhfdCAqKSAmX2J2Y2kpOworCisJcmV0dXJuIGdwcnNfbnNfc2VuZG1zZyhnYnByb3hfbnNpLCBtc2cpOworfQorCisKKy8qIGZlZWQgYSBtZXNzYWdlIGRvd24gdGhlIE5TLVZDIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHBlZXIgKi8KK3N0YXRpYyBpbnQgZ2Jwcm94X3JlbGF5MnNnc24oc3RydWN0IG1zZ2IgKm1zZywgdWludDE2X3QgbnNfYnZjaSkKK3sKKwlERUJVR1AoREdQUlMsICJOU0VJPSV1IHByb3h5aW5nIHRvIFNHU04gKE5TX0JWQ0k9JXUsIE5TRUk9JXUpXG4iLAorCQltc2diX25zZWkobXNnKSwgbnNfYnZjaSwgZ2JjZmcubnNpcF9zZ3NuX25zZWkpOworCisJbXNnYl9idmNpKG1zZykgPSBuc19idmNpOworCW1zZ2JfbnNlaShtc2cpID0gZ2JjZmcubnNpcF9zZ3NuX25zZWk7CisKKwlzdHJpcF9uc19oZHIobXNnKTsKKworCXJldHVybiBncHJzX25zX3NlbmRtc2coZ2Jwcm94X25zaSwgbXNnKTsKK30KKworLyogZmVlZCBhIG1lc3NhZ2UgZG93biB0aGUgTlMtVkMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgcGVlciAqLworc3RhdGljIGludCBnYnByb3hfcmVsYXkycGVlcihzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ2Jwcm94X3BlZXIgKnBlZXIsCisJCQkgIHVpbnQxNl90IG5zX2J2Y2kpCit7CisJREVCVUdQKERHUFJTLCAiTlNFST0ldSBwcm94eWluZyB0byBCU1MgKE5TX0JWQ0k9JXUsIE5TRUk9JXUpXG4iLAorCQltc2diX25zZWkobXNnKSwgbnNfYnZjaSwgcGVlci0+bnN2Yy0+bnNlaSk7CisKKwltc2diX2J2Y2kobXNnKSA9IG5zX2J2Y2k7CisJbXNnYl9uc2VpKG1zZykgPSBwZWVyLT5uc3ZjLT5uc2VpOworCisJc3RyaXBfbnNfaGRyKG1zZyk7CisKKwlyZXR1cm4gZ3Byc19uc19zZW5kbXNnKGdicHJveF9uc2ksIG1zZyk7Cit9CisKKy8qIFNlbmQgYSBtZXNzYWdlIHRvIGEgcGVlciBpZGVudGlmaWVkIGJ5IHB0cF9idmNpIGJ1dCB1c2luZyBuc19idmNpCisgKiBpbiB0aGUgTlMgaGRyICovCitzdGF0aWMgaW50IGdicHJveF9yZWxheTJidmNpKHN0cnVjdCBtc2diICptc2csIHVpbnQxNl90IHB0cF9idmNpLAorCQkJICB1aW50MTZfdCBuc19idmNpKQoreworCXN0cnVjdCBnYnByb3hfcGVlciAqcGVlcjsKKworCXBlZXIgPSBwZWVyX2J5X2J2Y2kocHRwX2J2Y2kpOworCWlmICghcGVlcikgeworCQlMT0dQKERHUFJTLCBMT0dMX0VSUk9SLCAiQ2Fubm90IGZpbmQgQlNTIGZvciBCVkNJICV1XG4iLAorCQkJcHRwX2J2Y2kpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlyZXR1cm4gZ2Jwcm94X3JlbGF5MnBlZXIobXNnLCBwZWVyLCBuc19idmNpKTsKK30KKworLyogUmVjZWl2ZSBhbiBpbmNvbWluZyBzaWduYWxsaW5nIG1lc3NhZ2UgZnJvbSBhIEJTUy1zaWRlIE5TLVZDICovCitzdGF0aWMgaW50IGdicHJveF9yeF9zaWdfZnJvbV9ic3Moc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdwcnNfbnN2YyAqbnN2YywKKwkJCQkgIHVpbnQxNl90IG5zX2J2Y2kpCit7CisJc3RydWN0IGJzc2dwX25vcm1hbF9oZHIgKmJncGggPSAoc3RydWN0IGJzc2dwX25vcm1hbF9oZHIgKikgbXNnYl9ic3NncGgobXNnKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwl1aW50OF90IHBkdV90eXBlID0gYmdwaC0+cGR1X3R5cGU7CisJaW50IGRhdGFfbGVuID0gbXNnYl9ic3NncF9sZW4obXNnKSAtIHNpemVvZigqYmdwaCk7CisJc3RydWN0IGdicHJveF9wZWVyICpmcm9tX3BlZXI7CisJc3RydWN0IGdwcnNfcmFfaWQgcmFpZDsKKworCWlmIChuc19idmNpICE9IDApIHsKKwkJTE9HUChER1BSUywgTE9HTF9OT1RJQ0UsICJOU0VJPSV1IEJWQ0kgJXUgaXMgbm90IHNpZ25hbGxpbmdcbiIsCisJCQluc3ZjLT5uc2VpLCBuc19idmNpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogd2UgYWN0dWFsbHkgc2hvdWxkIG5ldmVyIHNlZSB0aG9zZSB0d28gZm9yIEJWQ0kgPT0gMCwgYnV0IGRvdWJsZS1jaGVjaworCSAqIGp1c3QgdG8gbWFrZSBzdXJlICAqLworCWlmIChwZHVfdHlwZSA9PSBCU1NHUF9QRFVUX1VMX1VOSVREQVRBIHx8CisJICAgIHBkdV90eXBlID09IEJTU0dQX1BEVVRfRExfVU5JVERBVEEpIHsKKwkJTE9HUChER1BSUywgTE9HTF9OT1RJQ0UsICJOU0VJPSV1IFVOSVREQVRBIG5vdCBhbGxvd2VkIGluICIKKwkJCSJzaWduYWxsaW5nXG4iLCBuc3ZjLT5uc2VpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYnNzZ3BfdGx2X3BhcnNlKCZ0cCwgYmdwaC0+ZGF0YSwgZGF0YV9sZW4pOworCisJc3dpdGNoIChwZHVfdHlwZSkgeworCWNhc2UgQlNTR1BfUERVVF9TVVNQRU5EOgorCWNhc2UgQlNTR1BfUERVVF9SRVNVTUU6CisJCS8qIFdlIGltcGxlbWVudCBSQUMgc25vb3BpbmcgZHVyaW5nIFNVU1BFTkQvUkVTVU1FLCBzaW5jZQorCQkgKiBpdCBlc3RhYmxpc2hlcyBhIHJlbGF0aW9uc2lwIGJldHdlZW4gQlZDSS9wZWVyIGFuZCB0aGUKKwkJICogcm91dGVpbmcgYXJlYSBjb2RlLiAgVGhlIHNub29wZWQgaW5mb3JtYXRpb24gaXMgdGhlbgorCQkgKiB1c2VkIGZvciByb3V0aW5nIHRoZSB7U1VTUEVORCxSRVNVTUV9X1tOXUFDSyBiYWNrIHRvCisJCSAqIHRoZSBjb3JyZWN0IEJTU0dQICovCisJCWlmICghVExWUF9QUkVTRU5UKCZ0cCwgQlNTR1BfSUVfUk9VVEVJTkdfQVJFQSkpCisJCQlnb3RvIGVycl9tYW5kX2llOworCQlmcm9tX3BlZXIgPSBwZWVyX2J5X25zdmMobnN2Yyk7CisJCWlmICghZnJvbV9wZWVyKQorCQkJZ290byBlcnJfbm9fcGVlcjsKKwkJbWVtY3B5KCZmcm9tX3BlZXItPnJhLCBUTFZQX1ZBTCgmdHAsIEJTU0dQX0lFX1JPVVRFSU5HX0FSRUEpLAorCQkJc2l6ZW9mKCZmcm9tX3BlZXItPnJhKSk7CisJCWdzbTQ4X3BhcnNlX3JhKCZyYWlkLCAmZnJvbV9wZWVyLT5yYSk7CisJCURFQlVHUChER1BSUywgIk5TRUk9JXUgUkFDIHNub29waW5nOiBSQUMgJXUvJXUvJXUvJXUgYmVoaW5kIEJWQ0k9JXUsICIKKwkJCSJOU1ZDST0ldVxuIiwgbnN2Yy0+bnNlaSwgcmFpZC5tY2MsIHJhaWQubW5jLCByYWlkLmxhYywKKwkJCXJhaWQucmFjICwgZnJvbV9wZWVyLT5idmNpLCBuc3ZjLT5uc3ZjaSk7CisJCS8qIEZJWE1FOiBUaGlzIG9ubHkgc3VwcG9ydHMgb25lIEJTUyBwZXIgUkEgKi8KKwkJYnJlYWs7CisJY2FzZSBCU1NHUF9QRFVUX0JWQ19SRVNFVDoKKwkJLyogSWYgd2UgcmVjZWl2ZSBhIEJWQyByZXNldCBvbiB0aGUgc2lnbmFsbGluZyBlbmRwb2ludCwgd2UKKwkJICogZG9uJ3Qgd2FudCB0aGUgU0dTTiB0byByZXNldCwgYXMgdGhlIHNpZ25hbGxpbmcgZW5kcG9pbnQKKwkJICogaXMgY29tbW9uIGZvciBhbGwgcG9pbnQtdG8tcG9pbnQgQlZDcyAoYW5kIHRodXMgYWxsIEJUUykgKi8KKwkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEJTU0dQX0lFX0JWQ0kpKSB7CisJCQl1aW50MTZfdCBidmNpID0gbnRvaHMoKih1aW50MTZfdCAqKVRMVlBfVkFMKCZ0cCwgQlNTR1BfSUVfQlZDSSkpOworCQkJaWYgKGJ2Y2kgPT0gMCkgeworCQkJCS8qIEZJWE1FOiBvbmx5IGRvIHRoaXMgaWYgU0dTTiBpcyBhbGl2ZSEgKi8KKwkJCQlMT0dQKERHUFJTLCBMT0dMX0lORk8sICJOU0VJPSV1IFNlbmRpbmcgZmFrZSAiCisJCQkJCSJCVkMgUkVTRVQgQUNLIG9mIEJWQ0k9MFxuIiwgbnN2Yy0+bnNlaSk7CisJCQkJcmV0dXJuIGJzc2dwX3R4X3NpbXBsZV9idmNpKEJTU0dQX1BEVVRfQlZDX1JFU0VUX0FDSywKKwkJCQkJCQkgICAgbnN2Yy0+bnNlaSwgMCwgbnNfYnZjaSk7CisJCQl9IGVsc2UgaWYgKCFwZWVyX2J5X2J2Y2koYnZjaSkpIHsKKwkJCQkvKiBpZiBhIFBUUC1CVkMgaXMgcmVzZXQsIGFuZCB3ZSBkb24ndCBrbm93IHRoYXQKKwkJCQkgKiBQVFAtQlZDSSB5ZXQsIHdlIHNob3VsZCBhbGxvY2F0ZSBhIG5ldyBwZWVyICovCisJCQkJTE9HUChER1BSUywgTE9HTF9JTkZPLCAiQWxsb2NhdGlvbmcgbmV3IHBlZXIgZm9yICIKKwkJCQkgICAgICJCVkNJPSV1IHZpYSBOU1ZDST0ldS9OU0VJPSV1XG4iLCBidmNpLAorCQkJCSAgICAgbnN2Yy0+bnN2Y2ksIG5zdmMtPm5zZWkpOworCQkJCWZyb21fcGVlciA9IHBlZXJfYWxsb2MoYnZjaSk7CisJCQkJZnJvbV9wZWVyLT5uc3ZjID0gbnN2YzsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisKKwkvKiBOb3JtYWxseSwgd2UgY2FuIHNpbXBseSBwYXNzIG9uIGFsbCBzaWduYWxsaW5nIG1lc3NhZ2VzIGZyb20gQlNTIHRvIFNHU04gKi8KKwlyZXR1cm4gZ2Jwcm94X3JlbGF5MnNnc24obXNnLCBuc19idmNpKTsKK2Vycl9ub19wZWVyOgorZXJyX21hbmRfaWU6CisJLyogRklYTUU6IGRvIHNvbWV0aGluZyAqLworCTsKK30KKworLyogUmVjZWl2ZSBwYWdpbmcgcmVxdWVzdCBmcm9tIFNHU04sIHdlIG5lZWQgdG8gcmVsYXkgdG8gcHJvcGVyIEJTUyAqLworc3RhdGljIGludCBnYnByb3hfcnhfcGFnaW5nKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCB0bHZfcGFyc2VkICp0cCwKKwkJCSAgICBzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjLCB1aW50MTZfdCBuc19idmNpKQoreworCXN0cnVjdCBnYnByb3hfcGVlciAqcGVlcjsKKworCWlmIChUTFZQX1BSRVNFTlQodHAsIEJTU0dQX0lFX0JWQ0kpKSB7CisJCXVpbnQxNl90IGJ2Y2kgPSBudG9ocygqKHVpbnQxNl90ICopVExWUF9WQUwodHAsIEJTU0dQX0lFX0JWQ0kpKTsKKwkJcmV0dXJuIGdicHJveF9yZWxheTJidmNpKG1zZywgYnZjaSwgbnNfYnZjaSk7CisJfSBlbHNlIGlmIChUTFZQX1BSRVNFTlQodHAsIEJTU0dQX0lFX1JPVVRFSU5HX0FSRUEpKSB7CisJCXBlZXIgPSBwZWVyX2J5X3JhYyhUTFZQX1ZBTCh0cCwgQlNTR1BfSUVfUk9VVEVJTkdfQVJFQSkpOworCQlyZXR1cm4gZ2Jwcm94X3JlbGF5MnBlZXIobXNnLCBwZWVyLCBuc19idmNpKTsKKwl9IGVsc2UgaWYgKFRMVlBfUFJFU0VOVCh0cCwgQlNTR1BfSUVfTE9DQVRJT05fQVJFQSkpIHsKKwkJcGVlciA9IHBlZXJfYnlfbGFjKFRMVlBfVkFMKHRwLCBCU1NHUF9JRV9MT0NBVElPTl9BUkVBKSk7CisJCXJldHVybiBnYnByb3hfcmVsYXkycGVlcihtc2csIHBlZXIsIG5zX2J2Y2kpOworCX0gZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogUmVjZWl2ZSBhbiBpbmNvbWluZyBzaWduYWxsaW5nIG1lc3NhZ2UgZnJvbSB0aGUgU0dTTi1zaWRlIE5TLVZDICovCitzdGF0aWMgaW50IGdicHJveF9yeF9zaWdfZnJvbV9zZ3NuKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBncHJzX25zdmMgKm5zdmMsCisJCQkJICAgdWludDE2X3QgbnNfYnZjaSkKK3sKKwlzdHJ1Y3QgYnNzZ3Bfbm9ybWFsX2hkciAqYmdwaCA9IChzdHJ1Y3QgYnNzZ3Bfbm9ybWFsX2hkciAqKSBtc2diX2Jzc2dwaChtc2cpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXVpbnQ4X3QgcGR1X3R5cGUgPSBiZ3BoLT5wZHVfdHlwZTsKKwlpbnQgZGF0YV9sZW4gPSBtc2diX2Jzc2dwX2xlbihtc2cpIC0gc2l6ZW9mKCpiZ3BoKTsKKwlzdHJ1Y3QgZ2Jwcm94X3BlZXIgKnBlZXI7CisJdWludDE2X3QgYnZjaTsKKwlpbnQgcmMgPSAwOworCisJaWYgKG5zX2J2Y2kgIT0gMCkgeworCQlMT0dQKERHUFJTLCBMT0dMX05PVElDRSwgIk5TRUk9JXUoU0dTTikgQlZDSSAldSBpcyBub3QgIgorCQkJInNpZ25hbGxpbmdcbiIsIG5zdmMtPm5zZWksIG5zX2J2Y2kpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiB3ZSBhY3R1YWxseSBzaG91bGQgbmV2ZXIgc2VlIHRob3NlIHR3byBmb3IgQlZDSSA9PSAwLCBidXQgZG91YmxlLWNoZWNrCisJICoganVzdCB0byBtYWtlIHN1cmUgICovCisJaWYgKHBkdV90eXBlID09IEJTU0dQX1BEVVRfVUxfVU5JVERBVEEgfHwKKwkgICAgcGR1X3R5cGUgPT0gQlNTR1BfUERVVF9ETF9VTklUREFUQSkgeworCQlMT0dQKERHUFJTLCBMT0dMX05PVElDRSwgIk5TRUk9JXUoU0dTTikgVU5JVERBVEEgbm90IGFsbG93ZWQgaW4gIgorCQkJInNpZ25hbGxpbmdcbiIsIG5zdmMtPm5zZWkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyYyA9IGJzc2dwX3Rsdl9wYXJzZSgmdHAsIGJncGgtPmRhdGEsIGRhdGFfbGVuKTsKKworCXN3aXRjaCAocGR1X3R5cGUpIHsKKwljYXNlIEJTU0dQX1BEVVRfRkxVU0hfTEw6CisJY2FzZSBCU1NHUF9QRFVUX0JWQ19CTE9DS19BQ0s6CisJY2FzZSBCU1NHUF9QRFVUX0JWQ19VTkJMT0NLX0FDSzoKKwljYXNlIEJTU0dQX1BEVVRfQlZDX1JFU0VUOgorCWNhc2UgQlNTR1BfUERVVF9CVkNfUkVTRVRfQUNLOgorCQkvKiBzaW1wbGUgY2FzZTogQlZDSSBJRSBpcyBtYW5kYXRvcnkgKi8KKwkJaWYgKCFUTFZQX1BSRVNFTlQoJnRwLCBCU1NHUF9JRV9CVkNJKSkKKwkJCWdvdG8gZXJyX21hbmRfaWU7CisJCWJ2Y2kgPSBudG9ocygqKHVpbnQxNl90ICopVExWUF9WQUwoJnRwLCBCU1NHUF9JRV9CVkNJKSk7CisJCXJjID0gZ2Jwcm94X3JlbGF5MmJ2Y2kobXNnLCBidmNpLCBuc19idmNpKTsKKwkJYnJlYWs7CisJY2FzZSBCU1NHUF9QRFVUX1BBR0lOR19QUzoKKwljYXNlIEJTU0dQX1BEVVRfUEFHSU5HX0NTOgorCQkvKiBwcm9jZXNzIHRoZSBwYWdpbmcgcmVxdWVzdCAoTEFDL1JBQyBsb29rdXApICovCisJCXJjID0gZ2Jwcm94X3J4X3BhZ2luZyhtc2csICZ0cCwgbnN2YywgbnNfYnZjaSk7CisJCWJyZWFrOworCWNhc2UgQlNTR1BfUERVVF9TVEFUVVM6CisJCS8qIEZJWE1FOiBTb21lIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQgKi8KKwkJTE9HUChER1BSUywgTE9HTF9OT1RJQ0UsCisJCQkiTlNFST0ldShTR1NOKSBTVEFUVVMgbm90IGltcGxlbWVudGVkIHlldFxuIiwgbnN2Yy0+bnNlaSk7CisJCWJyZWFrOworCS8qIHRob3NlIG9ubHkgZXhpc3QgaW4gdGhlIFNHU04gLT4gQlNTIGRpcmVjdGlvbiAqLworCWNhc2UgQlNTR1BfUERVVF9TVVNQRU5EX0FDSzoKKwljYXNlIEJTU0dQX1BEVVRfU1VTUEVORF9OQUNLOgorCWNhc2UgQlNTR1BfUERVVF9SRVNVTUVfQUNLOgorCWNhc2UgQlNTR1BfUERVVF9SRVNVTUVfTkFDSzoKKwkJLyogUkFDIElFIGlzIG1hbmRhdG9yeSAqLworCQlpZiAoIVRMVlBfUFJFU0VOVCgmdHAsIEJTU0dQX0lFX1JPVVRFSU5HX0FSRUEpKQorCQkJZ290byBlcnJfbWFuZF9pZTsKKwkJcGVlciA9IHBlZXJfYnlfcmFjKFRMVlBfVkFMKCZ0cCwgQlNTR1BfSUVfUk9VVEVJTkdfQVJFQSkpOworCQlpZiAoIXBlZXIpCisJCQlnb3RvIGVycl9ub19wZWVyOworCQlyYyA9IGdicHJveF9yZWxheTJwZWVyKG1zZywgcGVlciwgbnNfYnZjaSk7CisJCWJyZWFrOworCWNhc2UgQlNTR1BfUERVVF9TR1NOX0lOVk9LRV9UUkFDRToKKwkJTE9HUChER1BSUywgTE9HTF9FUlJPUiwKKwkJICAgICAiTlNFST0ldShTR1NOKSBJTlZPS0UgVFJBQ0Ugbm90IHN1cHBvcnRlZFxuIiwgbnN2Yy0+bnNlaSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUChER1BSUywgIkJTU0dQIFBEVSB0eXBlIDB4JTAyeCB1bmtub3duXG4iLCBwZHVfdHlwZSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK2Vycl9tYW5kX2llOgorCUxPR1AoREdQUlMsIExPR0xfRVJST1IsICJOU0VJPSV1KFNHU04pIG1pc3NpbmcgbWFuZGF0b3J5IElFXG4iLAorCQluc3ZjLT5uc2VpKTsKKwkvKiBGSVhNRTogdGhpcyB3b3VsZCBwdWxsIGdwcnNfYnNzZ3AuYyBpbiwgd2hpY2ggaW4gdHVybiBoYXMgZGVwZW5kZW5jaWVzICovCisJLy9yZXR1cm4gYnNzZ3BfdHhfc3RhdHVzKEJTU0dQX0NBVVNFX01JU1NJTkdfTUFORF9JRSwgTlVMTCwgbXNnKTsKKwlyZXR1cm47CitlcnJfbm9fcGVlcjoKKwlMT0dQKERHUFJTLCBMT0dMX0VSUk9SLCAiTlNFST0ldShTR1NOKSBjYW5ub3QgZmluZCBwZWVyIGJhc2VkIG9uIFJBQ1xuIik7CisJLyogRklYTUUgKi8KKwlyZXR1cm47Cit9CisKKy8qIE1haW4gaW5wdXQgZnVuY3Rpb24gZm9yIEdiIHByb3h5ICovCitpbnQgZ2Jwcm94X3Jjdm1zZyhzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjLCB1aW50MTZfdCBuc19idmNpKQoreworCWludCByYzsKKworCS8qIE9ubHkgQlZDST0wIG1lc3NhZ2VzIG5lZWQgc3BlY2lhbCB0cmVhdG1lbnQgKi8KKwlpZiAobnNfYnZjaSA9PSAwIHx8IG5zX2J2Y2kgPT0gMSkgeworCQlpZiAobnN2Yy0+cmVtb3RlX2VuZF9pc19zZ3NuKQorCQkJcmMgPSBnYnByb3hfcnhfc2lnX2Zyb21fc2dzbihtc2csIG5zdmMsIG5zX2J2Y2kpOworCQllbHNlCisJCQlyYyA9IGdicHJveF9yeF9zaWdfZnJvbV9ic3MobXNnLCBuc3ZjLCBuc19idmNpKTsKKwl9IGVsc2UgeworCQkvKiBBbGwgb3RoZXIgQlZDSSBhcmUgUFRQIGFuZCB0aHVzIGNhbiBiZSBzaW1wbHkgZm9yd2FyZGVkICovCisJCWlmICghbnN2Yy0+cmVtb3RlX2VuZF9pc19zZ3NuKSB7CisJCQlyYyA9IGdicHJveF9yZWxheTJzZ3NuKG1zZywgbnNfYnZjaSk7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgZ2Jwcm94X3BlZXIgKnBlZXIgPSBwZWVyX2J5X2J2Y2kobnNfYnZjaSk7CisJCQlpZiAoIXBlZXIpIHsKKwkJCQlMT0dQKERHUFJTLCBMT0dMX05PVElDRSwgIkFsbG9jYXRpb25nIG5ldyBwZWVyIGZvciAiCisJCQkJICAgICAiQlZDST0ldSB2aWEgTlNWQz0ldS9OU0VJPSV1XG4iLCBuc19idmNpLAorCQkJCSAgICAgbnN2Yy0+bnN2Y2ksIG5zdmMtPm5zZWkpOworCQkJCXBlZXIgPSBwZWVyX2FsbG9jKG5zX2J2Y2kpOworCQkJCXBlZXItPm5zdmMgPSBuc3ZjOworCQkJfQorCQkJcmMgPSBnYnByb3hfcmVsYXkycGVlcihtc2csIHBlZXIsIG5zX2J2Y2kpOworCQl9CisJfQorCisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3Bycy9nYl9wcm94eV9tYWluLmMgYi9vcGVuYnNjL3NyYy9ncHJzL2diX3Byb3h5X21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDU0Yjc4Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3Bycy9nYl9wcm94eV9tYWluLmMKQEAgLTAsMCArMSwxNDkgQEAKKy8qIE5TLW92ZXItSVAgcHJveHkgKi8KKworLyogKEMpIDIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDEwIGJ5IE9uIFdhdmVzCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKworI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19ucy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdGVsbmV0X2ludGVyZmFjZS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdnR5Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nYl9wcm94eS5oPgorCisjaW5jbHVkZSAiLi4vLi4vYnNjY29uZmlnLmgiCisKKy8qIHRoaXMgaXMgaGVyZSBmb3IgdGhlIHZ0eS4uLiBpdCB3aWxsIG5ldmVyIGJlIGNhbGxlZCAqLwordm9pZCBzdWJzY3JfcHV0KCkgeyBhYm9ydCgpOyB9CisKKyNkZWZpbmUgX0dOVV9TT1VSQ0UKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKwordm9pZCAqdGFsbF9ic2NfY3R4OworCitzdHJ1Y3QgZ3Byc19uc19pbnN0ICpnYnByb3hfbnNpOworCitjb25zdCBjaGFyICpvcGVuYnNjX3ZlcnNpb24gPSAiT3Ntb2NvbSBOU0lQIFByb3h5ICIgUEFDS0FHRV9WRVJTSU9OOworY29uc3QgY2hhciAqb3BlbmJzY19jb3B5cmlnaHQgPQorCSJDb3B5cmlnaHQgKEMpIDIwMTAgSGFyYWxkIFdlbHRlIGFuZCBPbi1XYXZlc1xuIgorCSJDb250cmlidXRpb25zIGJ5IERhbmllbCBXaWxsbWFubiwgSmFuIEzDvGJiZSwgU3RlZmFuIFNjaG1pZHRcbiIKKwkiRGlldGVyIFNwYWFyLCBBbmRyZWFzIEV2ZXJzYmVyZywgSG9sZ2VyIEZyZXl0aGVyXG5cbiIKKwkiTGljZW5zZSBHUEx2Mis6IEdOVSBHUEwgdmVyc2lvbiAyIG9yIGxhdGVyIDxodHRwOi8vZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbD5cbiIKKwkiVGhpcyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgYXJlIGZyZWUgdG8gY2hhbmdlIGFuZCByZWRpc3RyaWJ1dGUgaXQuXG4iCisJIlRoZXJlIGlzIE5PIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXcuXG4iOworCitzdGF0aWMgY2hhciAqY29uZmlnX2ZpbGUgPSAib3Ntb19nYnByb3h5LmNmZyI7CitzdHJ1Y3QgZ2Jwcm94eV9jb25maWcgZ2JjZmc7CisKKy8qIFBvaW50ZXIgdG8gdGhlIFNHU04gcGVlciAqLworZXh0ZXJuIHN0cnVjdCBnYnByb3hfcGVlciAqZ2Jwcm94X3BlZXJfc2dzbjsKKworLyogY2FsbC1iYWNrIGZ1bmN0aW9uIGZvciB0aGUgTlMgcHJvdG9jb2wgKi8KK3N0YXRpYyBpbnQgcHJveHlfbnNfY2IoZW51bSBncHJzX25zX2V2dCBldmVudCwgc3RydWN0IGdwcnNfbnN2YyAqbnN2YywKKwkJICAgICAgc3RydWN0IG1zZ2IgKm1zZywgdV9pbnQxNl90IGJ2Y2kpCit7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEdQUlNfTlNfRVZUX1VOSVRfREFUQToKKwkJcmMgPSBnYnByb3hfcmN2bXNnKG1zZywgbnN2YywgYnZjaSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoREdQUlMsIExPR0xfRVJST1IsICJTR1NOOiBVbmtub3duIGV2ZW50ICV1IGZyb20gTlNcbiIsIGV2ZW50KTsKKwkJaWYgKG1zZykKKwkJCXRhbGxvY19mcmVlKG1zZyk7CisJCXJjID0gLUVJTzsKKwkJYnJlYWs7CisJfQorCXJldHVybiByYzsKK30KKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrIGR1bW15X25ldHdvcms7CisJc3RydWN0IGxvZ190YXJnZXQgKnN0ZGVycl90YXJnZXQ7CisJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKKwlpbnQgcmM7CisKKwl0YWxsX2JzY19jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QoTlVMTCwgMCwgIm5zaXBfcHJveHkiKTsKKworCWxvZ19pbml0KCZsb2dfaW5mbyk7CisJc3RkZXJyX3RhcmdldCA9IGxvZ190YXJnZXRfY3JlYXRlX3N0ZGVycigpOworCWxvZ19hZGRfdGFyZ2V0KHN0ZGVycl90YXJnZXQpOworCWxvZ19zZXRfYWxsX2ZpbHRlcihzdGRlcnJfdGFyZ2V0LCAxKTsKKworCXRlbG5ldF9pbml0KCZkdW1teV9uZXR3b3JrLCA0MjQ0KTsKKwlyYyA9IGdicHJveHlfcGFyc2VfY29uZmlnKGNvbmZpZ19maWxlLCAmZ2JjZmcpOworCWlmIChyYyA8IDApIHsKKwkJTE9HUChER1BSUywgTE9HTF9GQVRBTCwgIkNhbm5vdCBwYXJzZSBjb25maWcgZmlsZVxuIik7CisJCWV4aXQoMik7CisJfQorCisJZ2Jwcm94X25zaSA9IGdwcnNfbnNfaW5zdGFudGlhdGUoJnByb3h5X25zX2NiKTsKKwlpZiAoIWdicHJveF9uc2kpIHsKKwkJTE9HUChER1BSUywgTE9HTF9FUlJPUiwgIlVuYWJsZSB0byBpbnN0YW50aWF0ZSBOU1xuIik7CisJCWV4aXQoMSk7CisJfQorCWdiY2ZnLm5zaSA9IGdicHJveF9uc2k7CisJbnNpcF9saXN0ZW4oZ2Jwcm94X25zaSwgZ2JjZmcubnNpcF9saXN0ZW5fcG9ydCk7CisKKwkvKiAnZXN0YWJsaXNoJyB0aGUgb3V0Z29pbmcgY29ubmVjdGlvbiB0byB0aGUgU0dTTiAqLworCXNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlzaW4uc2luX3BvcnQgPSBodG9ucyhnYmNmZy5uc2lwX3Nnc25fcG9ydCk7CisJc2luLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKGdiY2ZnLm5zaXBfc2dzbl9pcCk7CisJbnNpcF9jb25uZWN0KGdicHJveF9uc2ksICZzaW4sIGdiY2ZnLm5zaXBfc2dzbl9uc2VpLAorCQkJZ2JjZmcubnNpcF9zZ3NuX25zdmNpKTsKKworCXdoaWxlICgxKSB7CisJCXJjID0gYnNjX3NlbGVjdF9tYWluKDApOworCQlpZiAocmMgPCAwKQorCQkJZXhpdCgzKTsKKwl9CisKKwlleGl0KDApOworfQorCitzdHJ1Y3QgZ3NtX25ldHdvcms7CitpbnQgYnNjX3Z0eV9pbml0KHN0cnVjdCBnc21fbmV0d29yayAqZHVtbXkpCit7CisJY21kX2luaXQoMSk7CisJdnR5X2luaXQoKTsKKworCW9wZW5ic2NfdnR5X2FkZF9jbWRzKCk7CisgICAgICAgIGdicHJveHlfdnR5X2luaXQoKTsKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3Bycy9nYl9wcm94eV92dHkuYyBiL29wZW5ic2Mvc3JjL2dwcnMvZ2JfcHJveHlfdnR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZmNmExZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dwcnMvZ2JfcHJveHlfdnR5LmMKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiAoQykgMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMTAgYnkgT24tV2F2ZXMKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ2JfcHJveHkuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfbnMuaD4KKworI2luY2x1ZGUgPHZ0eS9jb21tYW5kLmg+CisjaW5jbHVkZSA8dnR5L3Z0eS5oPgorCitzdGF0aWMgc3RydWN0IGdicHJveHlfY29uZmlnICpnX2NmZyA9IE5VTEw7CisKKy8qCisgKiB2dHkgY29kZSBmb3IgbWdjcCBiZWxvdworICovCitzdGF0aWMgc3RydWN0IGNtZF9ub2RlIGdicHJveHlfbm9kZSA9IHsKKwlHQlBST1hZX05PREUsCisJIiVzKGdicHJveHkpIyIsCisJMSwKK307CisKK3N0YXRpYyBpbnQgY29uZmlnX3dyaXRlX2dicHJveHkoc3RydWN0IHZ0eSAqdnR5KQoreworCXN0cnVjdCBpbl9hZGRyIGlhOworCisJdnR5X291dCh2dHksICJnYnByb3h5JXMiLCBWVFlfTkVXTElORSk7CisKKwlpZiAoZ19jZmctPm5zaXBfbGlzdGVuX2lwKSB7CisJCWlhLnNfYWRkciA9IGh0b25sKGdfY2ZnLT5uc2lwX2xpc3Rlbl9pcCk7CisJCXZ0eV9vdXQodnR5LCAiICBuc2lwIGJzcyBsb2NhbCBpcCAlcyVzIiwgaW5ldF9udG9hKGlhKSwKKwkJCVZUWV9ORVdMSU5FKTsKKwl9CisJdnR5X291dCh2dHksICIgIG5zaXAgYnNzIGxvY2FsIHBvcnQgJXUlcyIsIGdfY2ZnLT5uc2lwX2xpc3Rlbl9wb3J0LAorCQlWVFlfTkVXTElORSk7CisJaWEuc19hZGRyID0gaHRvbmwoZ19jZmctPm5zaXBfc2dzbl9pcCk7CisJdnR5X291dCh2dHksICIgIG5zaXAgc2dzbiByZW1vdGUgaXAgJXMlcyIsIGluZXRfbnRvYShpYSksCisJCVZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgbnNpcCBzZ3NuIHJlbW90ZSBwb3J0ICV1JXMiLCBnX2NmZy0+bnNpcF9zZ3NuX3BvcnQsCisJCVZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgbnNpcCBzZ3NuIG5zZWkgJXUlcyIsIGdfY2ZnLT5uc2lwX3Nnc25fbnNlaSwKKwkJVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBuc2lwIHNnc24gbnN2Y2kgJXUlcyIsIGdfY2ZnLT5uc2lwX3Nnc25fbnN2Y2ksCisJCVZUWV9ORVdMSU5FKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oc2hvd19nYnByb3h5LCBzaG93X2dicHJveHlfY21kLCAic2hvdyBnYnByb3h5IiwKKyAgICAgIFNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IHRoZSBHYiBwcm94eSIpCit7CisJLyogRklYTUU6IGl0ZXJhdGUgb3ZlciBsaXN0IG9mIE5TLVZDJ3MgYW5kIGRpc3BsYXkgdGhlaXIgc3RhdGUgKi8KKwlzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2kgPSBnX2NmZy0+bnNpOworCXN0cnVjdCBncHJzX25zdmMgKm5zdmM7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShuc3ZjLCAmbnNpLT5ncHJzX25zdmNzLCBsaXN0KSB7CisJCXZ0eV9vdXQodnR5LCAiTlNFSSAlNXUsIE5TLVZDICU1dSwgJXMtbW9kZSwgJXMgJXMlcyIsCisJCQluc3ZjLT5uc2VpLCBuc3ZjLT5uc3ZjaSwKKwkJCW5zdmMtPnJlbW90ZV9lbmRfaXNfc2dzbiA/ICJCU1MiIDogIlNHU04iLAorCQkJbnN2Yy0+c3RhdGUgJiBOU0VfU19BTElWRSA/ICJBTElWRSIgOiAiREVBRCIsCisJCQluc3ZjLT5zdGF0ZSAmIE5TRV9TX0JMT0NLRUQgPyAiQkxPQ0tFRCIgOiAiVU5CTE9DS0VEIiwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJaWYgKG5zdmMtPm5zaS0+bGwgPT0gR1BSU19OU19MTF9VRFApCisJCQl2dHlfb3V0KHZ0eSwgIiAgcmVtb3RlIHBlZXIgJXM6JXUlcyIsCisJCQkJaW5ldF9udG9hKG5zdmMtPmlwLmJ0c19hZGRyLnNpbl9hZGRyKSwKKwkJCQludG9ocyhuc3ZjLT5pcC5idHNfYWRkci5zaW5fcG9ydCksIFZUWV9ORVdMSU5FKTsKKwl9CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19nYnByb3h5LAorICAgICAgY2ZnX2dicHJveHlfY21kLAorICAgICAgImdicHJveHkiLAorICAgICAgIkNvbmZpZ3VyZSB0aGUgR2IgcHJveHkiKQoreworCXZ0eS0+bm9kZSA9IEdCUFJPWFlfTk9ERTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uc2lwX2Jzc19sb2NhbF9pcCwKKyAgICAgIGNmZ19uc2lwX2Jzc19sb2NhbF9pcF9jbWQsCisgICAgICAibnNpcCBic3MgbG9jYWwgaXAgQS5CLkMuRCIsCisgICAgICAiU2V0IHRoZSBJUCBhZGRyZXNzIG9uIHdoaWNoIHdlIGxpc3RlbiBmb3IgQlNTIGNvbm5lY3RzIikKK3sKKwlzdHJ1Y3QgaW5fYWRkciBpYTsKKworCWluZXRfYXRvbihhcmd2WzBdLCAmaWEpOworCWdfY2ZnLT5uc2lwX2xpc3Rlbl9pcCA9IG50b2hsKGlhLnNfYWRkcik7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uc2lwX2Jzc19sb2NhbF9wb3J0LAorICAgICAgY2ZnX25zaXBfYnNzX2xvY2FsX3BvcnRfY21kLAorICAgICAgIm5zaXAgYnNzIGxvY2FsIHBvcnQgPDAtNjU1MzQ+IiwKKyAgICAgICJTZXQgdGhlIFVEUCBwb3J0IG9uIHdoaWNoIHdlIGxpc3RlbiBmb3IgQlNTIGNvbm5lY3RzIikKK3sKKwl1bnNpZ25lZCBpbnQgcG9ydCA9IGF0b2koYXJndlswXSk7CisKKwlnX2NmZy0+bnNpcF9saXN0ZW5fcG9ydCA9IHBvcnQ7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisKK0RFRlVOKGNmZ19uc2lwX3Nnc25faXAsCisgICAgICBjZmdfbnNpcF9zZ3NuX2lwX2NtZCwKKyAgICAgICJuc2lwIHNnc24gcmVtb3RlIGlwIEEuQi5DLkQiLAorICAgICAgIlNldCB0aGUgSVAgb2YgdGhlIFNHU04gdG8gd2hpY2ggdGhlIHByb3h5IHNoYWxsIGNvbm5lY3QiKQoreworCXN0cnVjdCBpbl9hZGRyIGlhOworCisJaW5ldF9hdG9uKGFyZ3ZbMF0sICZpYSk7CisJZ19jZmctPm5zaXBfc2dzbl9pcCA9IG50b2hsKGlhLnNfYWRkcik7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uc2lwX3Nnc25fcG9ydCwKKyAgICAgIGNmZ19uc2lwX3Nnc25fcG9ydF9jbWQsCisgICAgICAibnNpcCBzZ3NuIHJlbW90ZSBwb3J0IDwwLTY1NTM0PiIsCisgICAgICAiU2V0IHRoZSBVRFAgcG9ydCBvZiB0aGUgU0dTTiB0byB3aGljaCB0aGUgcHJveHkgc2hhbGwgY29ubmVjdCIpCit7CisJdW5zaWduZWQgaW50IHBvcnQgPSBhdG9pKGFyZ3ZbMF0pOworCisJZ19jZmctPm5zaXBfc2dzbl9wb3J0ID0gcG9ydDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uc2lwX3Nnc25fbnNlaSwKKyAgICAgIGNmZ19uc2lwX3Nnc25fbnNlaV9jbWQsCisgICAgICAibnNpcCBzZ3NuIG5zZWkgPDAtNjU1MzQ+IiwKKyAgICAgICJTZXQgdGhlIE5TRUkgdG8gYmUgdXNlZCBpbiB0aGUgY29ubmVjdGlvbiB3aXRoIHRoZSBTR1NOIikKK3sKKwl1bnNpZ25lZCBpbnQgcG9ydCA9IGF0b2koYXJndlswXSk7CisKKwlnX2NmZy0+bnNpcF9zZ3NuX25zZWkgPSBwb3J0OworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25zaXBfc2dzbl9uc3ZjaSwKKyAgICAgIGNmZ19uc2lwX3Nnc25fbnN2Y2lfY21kLAorICAgICAgIm5zaXAgc2dzbiBuc3ZjaSA8MC02NTUzND4iLAorICAgICAgIlNldCB0aGUgTlNWQ0kgdG8gYmUgdXNlZCBpbiB0aGUgY29ubmVjdGlvbiB3aXRoIHRoZSBTR1NOIikKK3sKKwl1bnNpZ25lZCBpbnQgcG9ydCA9IGF0b2koYXJndlswXSk7CisKKwlnX2NmZy0+bnNpcF9zZ3NuX25zdmNpID0gcG9ydDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKworaW50IGdicHJveHlfdnR5X2luaXQodm9pZCkKK3sKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc2hvd19nYnByb3h5X2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZjZmdfZ2Jwcm94eV9jbWQpOworCWluc3RhbGxfbm9kZSgmZ2Jwcm94eV9ub2RlLCBjb25maWdfd3JpdGVfZ2Jwcm94eSk7CisJaW5zdGFsbF9kZWZhdWx0KEdCUFJPWFlfTk9ERSk7CisJaW5zdGFsbF9lbGVtZW50KEdCUFJPWFlfTk9ERSwgJmNmZ19uc2lwX2Jzc19sb2NhbF9pcF9jbWQpOworCWluc3RhbGxfZWxlbWVudChHQlBST1hZX05PREUsICZjZmdfbnNpcF9ic3NfbG9jYWxfcG9ydF9jbWQpOworCWluc3RhbGxfZWxlbWVudChHQlBST1hZX05PREUsICZjZmdfbnNpcF9zZ3NuX2lwX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdCUFJPWFlfTk9ERSwgJmNmZ19uc2lwX3Nnc25fcG9ydF9jbWQpOworCWluc3RhbGxfZWxlbWVudChHQlBST1hZX05PREUsICZjZmdfbnNpcF9zZ3NuX25zZWlfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR0JQUk9YWV9OT0RFLCAmY2ZnX25zaXBfc2dzbl9uc3ZjaV9jbWQpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBnYnByb3h5X3BhcnNlX2NvbmZpZyhjb25zdCBjaGFyICpjb25maWdfZmlsZSwgc3RydWN0IGdicHJveHlfY29uZmlnICpjZmcpCit7CisJaW50IHJjOworCisJZ19jZmcgPSBjZmc7CisJcmMgPSB2dHlfcmVhZF9jb25maWdfZmlsZShjb25maWdfZmlsZSk7CisJaWYgKHJjIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBwYXJzZSB0aGUgY29uZmlnIGZpbGU6ICclcydcbiIsIGNvbmZpZ19maWxlKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ncHJzL2dwcnNfYnNzZ3AuYyBiL29wZW5ic2Mvc3JjL2dwcnMvZ3Byc19ic3NncC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NDczOGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ncHJzL2dwcnNfYnNzZ3AuYwpAQCAtMCwwICsxLDUzNyBAQAorLyogR1BSUyBCU1NHUCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBhcyBwZXIgM0dQUCBUUyAwOC4xOCAqLworCisvKiAoQykgMjAwOS0yMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOF9ncHJzLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX2Jzc2dwLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX2xsYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19ucy5oPgorCisvKiBnbG9iYWwgcG9pbnRlciB0byB0aGUgZ3NtIG5ldHdvcmsgZGF0YSBzdHJ1Y3R1cmUgKi8KKy8qIEZJWE1FOiB0aGlzIG11c3QgZ28hICovCitleHRlcm4gc3RydWN0IGdzbV9uZXR3b3JrICpic2NfZ3NtbmV0Oworc3RydWN0IGdwcnNfbnNfaW5zdCAqYnNzZ3BfbnNpOworCit2b2lkICpic3NncF90YWxsX2N0eCA9IE5VTEw7CisKKy8qIEJTU0dQIFByb3RvY29sIHNwZWNpZmljLCBub3QgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgKi8KKy8qIEZJWE1FOiBUaGlzIG5lZWRzIHRvIGdvIGludG8gbGlib3Ntb2NvcmUgYWZ0ZXIgZmluaXNoZWQgKi8KKworLyogQ2hhcHRlciAxMS4zLjkgLyBUYWJsZSAxMS4xMDogQ2F1c2UgY29kaW5nICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBic3NncF9jYXVzZV9zdHJpbmdzW10gPSB7CisJeyBCU1NHUF9DQVVTRV9QUk9DX09WRVJMT0FELAkiUHJvY2Vzc29yIG92ZXJsb2FkIiB9LAorCXsgQlNTR1BfQ0FVU0VfRVFVSVBfRkFJTCwJIkVxdWlwbWVudCBGYWlsdXJlIiB9LAorCXsgQlNTR1BfQ0FVU0VfVFJBU0lUX05FVF9GQUlMLAkiVHJhbnNpdCBuZXRvd2tyIHNlcnZpY2UgZmFpbHVyZSIgfSwKKwl7IEJTU0dQX0NBVVNFX0NBUEFfR1JFQVRFUl8wS1BCUywiVHJhbnNtaXNzaW9uIGNhcGFjaXR5IG1vZGlmaWVkIiB9LAorCXsgQlNTR1BfQ0FVU0VfVU5LTk9XTl9NUywJIlVua25vd24gTVMiIH0sCisJeyBCU1NHUF9DQVVTRV9VTktOT1dOX0JWQ0ksCSJVbmtub3duIEJWQ0kiIH0sCisJeyBCU1NHUF9DQVVTRV9DRUxMX1RSQUZfQ09ORywJIkNlbGwgdHJhZmZpYyBjb25nZXN0aW9uIiB9LAorCXsgQlNTR1BfQ0FVU0VfU0dTTl9DT05HLAkiU0dTTiBjb25nZXN0aW9uIiB9LAorCXsgQlNTR1BfQ0FVU0VfT01MX0lOVEVSViwJIk8mTSBpbnRlcnZlbnRpb24iIH0sCisJeyBCU1NHUF9DQVVTRV9CVkNJX0JMT0NLRUQsCSJCVkNJIGJsb2NrZWQiIH0sCisJeyBCU1NHUF9DQVVTRV9QRkNfQ1JFQVRFX0ZBSUwsCSJQRkMgY3JlYXRlIGZhaWx1cmUiIH0sCisJeyBCU1NHUF9DQVVTRV9TRU1fSU5DT1JSX1BEVSwJIlNlbWFudGljYWxseSBpbmNvcnJlY3QgUERVIiB9LAorCXsgQlNTR1BfQ0FVU0VfSU5WX01BTkRfSU5GLAkiSW52YWxpZCBtYW5kYXRvcnkgaW5mb3JtYXRpb24iIH0sCisJeyBCU1NHUF9DQVVTRV9NSVNTSU5HX01BTkRfSUUsCSJNaXNzaW5nIG1hbmRhdG9yeSBJRSIgfSwKKwl7IEJTU0dQX0NBVVNFX01JU1NJTkdfQ09ORF9JRSwJIk1pc3NpbmcgY29uZGl0aW9uYWwgSUUiIH0sCisJeyBCU1NHUF9DQVVTRV9VTkVYUF9DT05EX0lFLAkiVW5leHBlY3RlZCBjb25kaXRpb25hbCBJRSIgfSwKKwl7IEJTU0dQX0NBVVNFX0NPTkRfSUVfRVJSLAkiQ29uZGl0aW9uYWwgSUUgZXJyb3IiIH0sCisJeyBCU1NHUF9DQVVTRV9QRFVfSU5DT01QX1NUQVRFLAkiUERVIGluY29tcGF0aWJsZSB3aXRoIHByb3RvY29sIHN0YXRlIiB9LAorCXsgQlNTR1BfQ0FVU0VfUFJPVE9fRVJSX1VOU1BFQywJIlByb3RvY29sIGVycm9yIC0gdW5zcGVjaWZpZWQiIH0sCisJeyBCU1NHUF9DQVVTRV9QRFVfSU5DT01QX0ZFQVQsIAkiUERVIG5vdCBjb21wYXRpYmxlIHdpdGggZmVhdHVyZSBzZXQiIH0sCisJeyAwLCBOVUxMIH0sCit9OworCitjb25zdCBjaGFyICpic3NncF9jYXVzZV9zdHIoZW51bSBncHJzX2Jzc2dwX2NhdXNlIGNhdXNlKQoreworCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKGJzc2dwX2NhdXNlX3N0cmluZ3MsIGNhdXNlKTsKK30KKworCisvKiBPdXIgYWN0dWFsIGltcGxlbWVudGF0aW9uICovCisKKyNkZWZpbmUgQlZDX0ZfQkxPQ0tFRAkweDAwMDEKKworLyogVGhlIHBlci1CVFMgY29udGV4dCB0aGF0IHdlIGtlZXAgb24gdGhlIFNHU04gc2lkZSBvZiB0aGUgQlNTR1AgbGluayAqLworc3RydWN0IGJzc2dwX2J0c19jdHggeworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisKKwkvKiBwYXJzZWQgUkEgSUQgYW5kIENlbGwgSUQgb2YgdGhlIHJlbW90ZSBCVFMgKi8KKwlzdHJ1Y3QgZ3Byc19yYV9pZCByYV9pZDsKKwl1aW50MTZfdCBjZWxsX2lkOworCisJLyogTlNFSSBhbmQgQlZDSSBvZiB1bmRlcmx5aW5nIEdiIGxpbmsuICBUb2dldGhlciB0aGV5CisJICogdW5pcXVlbHkgaWRlbnRpZnkgYSBsaW5rIHRvIGEgQlRTICg1LjQuNCkgKi8KKwl1aW50MTZfdCBidmNpOworCXVpbnQxNl90IG5zZWk7CisKKwl1aW50MzJfdCBidmNfc3RhdGU7CisKKwkvKiB3ZSBtaWdodCB3YW50IHRvIGFkZCB0aGlzIGFzIGEgc2hvcnRjdXQgbGF0ZXIsIGF2b2lkaW5nIHRoZSBOU1ZDCisJICogbG9va3VwIGZvciBldmVyeSBwYWNrZXQsIHNpbWlsYXIgdG8gYSByb3V0aW5nIGNhY2hlICovCisJLy9zdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjOworfTsKK0xMSVNUX0hFQUQoYnRzX2N0eHRzKTsKKworLyogRmluZCBhIEJUUyBDb250ZXh0IGJhc2VkIG9uIHBhcnNlZCBSQSBJRCBhbmQgQ2VsbCBJRCAqLworc3RydWN0IGJzc2dwX2J0c19jdHggKmJ0c2N0eF9ieV9yYWlkX2NpZChjb25zdCBzdHJ1Y3QgZ3Byc19yYV9pZCAqcmFpZCwgdWludDE2X3QgY2lkKQoreworCXN0cnVjdCBic3NncF9idHNfY3R4ICpiY3R4OworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoYmN0eCwgJmJ0c19jdHh0cywgbGlzdCkgeworCQlpZiAoIW1lbWNtcCgmYmN0eC0+cmFfaWQsIHJhaWQsIHNpemVvZihiY3R4LT5yYV9pZCkpICYmCisJCSAgICBiY3R4LT5jZWxsX2lkID09IGNpZCkKKwkJCXJldHVybiBiY3R4OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogRmluZCBhIEJUUyBjb250ZXh0IGJhc2VkIG9uIEJWQ0krTlNFSSB0dXBsZSAqLworc3RydWN0IGJzc2dwX2J0c19jdHggKmJ0c2N0eF9ieV9idmNpX25zZWkodWludDE2X3QgYnZjaSwgdWludDE2X3QgbnNlaSkKK3sKKwlzdHJ1Y3QgYnNzZ3BfYnRzX2N0eCAqYmN0eDsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGJjdHgsICZidHNfY3R4dHMsIGxpc3QpIHsKKwkJaWYgKGJjdHgtPm5zZWkgPT0gbnNlaSAmJiBiY3R4LT5idmNpID09IGJ2Y2kpCisJCQlyZXR1cm4gYmN0eDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBic3NncF9idHhfY3R4ICpidHNjdHhfYWxsb2ModWludDE2X3QgYnZjaSwgdWludDE2X3QgbnNlaSkKK3sKKwlzdHJ1Y3QgYnNzZ3BfYnRzX2N0eCAqY3R4OworCisJY3R4ID0gdGFsbG9jX3plcm8oYnNzZ3BfdGFsbF9jdHgsIHN0cnVjdCBic3NncF9idHNfY3R4KTsKKwlpZiAoIWN0eCkKKwkJcmV0dXJuIE5VTEw7CisJY3R4LT5idmNpID0gYnZjaTsKKwljdHgtPm5zZWkgPSBuc2VpOworCWxsaXN0X2FkZCgmY3R4LT5saXN0LCAmYnRzX2N0eHRzKTsKKworCXJldHVybiBjdHg7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1zZ2IgKmJzc2dwX21zZ2JfYWxsb2Modm9pZCkKK3sKKwlyZXR1cm4gbXNnYl9hbGxvY19oZWFkcm9vbSg0MDk2LCAxMjgsICJCU1NHUCIpOworfQorCisvKiBUcmFuc21pdCBhIHNpbXBsZSByZXNwb25zZSBzdWNoIGFzIEJMT0NLL1VOQkxPQ0svUkVTRVQgQUNLL05BQ0sgKi8KK3N0YXRpYyBpbnQgYnNzZ3BfdHhfc2ltcGxlX2J2Y2kodWludDhfdCBwZHVfdHlwZSwgdWludDE2X3QgbnNlaSwKKwkJCSAgICAgICAgdWludDE2X3QgYnZjaSwgdWludDE2X3QgbnNfYnZjaSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gYnNzZ3BfbXNnYl9hbGxvYygpOworCXN0cnVjdCBic3NncF9ub3JtYWxfaGRyICpiZ3BoID0KKwkJCShzdHJ1Y3QgYnNzZ3Bfbm9ybWFsX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqYmdwaCkpOworCXVpbnQxNl90IF9idmNpOworCisJbXNnYl9uc2VpKG1zZykgPSBuc2VpOworCW1zZ2JfYnZjaShtc2cpID0gbnNfYnZjaTsKKworCWJncGgtPnBkdV90eXBlID0gcGR1X3R5cGU7CisJX2J2Y2kgPSBodG9ucyhidmNpKTsKKwltc2diX3R2bHZfcHV0KG1zZywgQlNTR1BfSUVfQlZDSSwgMiwgKHVpbnQ4X3QgKikgJl9idmNpKTsKKworCXJldHVybiBncHJzX25zX3NlbmRtc2coYnNzZ3BfbnNpLCBtc2cpOworfQorCisvKiBDaGFwdGVyIDEwLjQuNTogRmxvdyBDb250cm9sIEJWQyBBQ0sgKi8KK3N0YXRpYyBpbnQgYnNzZ3BfdHhfZmNfYnZjX2Fjayh1aW50MTZfdCBuc2VpLCB1aW50OF90IHRhZywgdWludDE2X3QgbnNfYnZjaSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gYnNzZ3BfbXNnYl9hbGxvYygpOworCXN0cnVjdCBic3NncF9ub3JtYWxfaGRyICpiZ3BoID0KKwkJCShzdHJ1Y3QgYnNzZ3Bfbm9ybWFsX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqYmdwaCkpOworCisJbXNnYl9uc2VpKG1zZykgPSBuc2VpOworCW1zZ2JfYnZjaShtc2cpID0gbnNfYnZjaTsKKworCWJncGgtPnBkdV90eXBlID0gQlNTR1BfUERVVF9GTE9XX0NPTlRST0xfQlZDX0FDSzsKKwltc2diX3R2bHZfcHV0KG1zZywgQlNTR1BfSUVfVEFHLCAxLCAmdGFnKTsKKworCXJldHVybiBncHJzX25zX3NlbmRtc2coYnNzZ3BfbnNpLCBtc2cpOworfQorCisvKiBDaGFwdGVyIDEwLjQuMTQ6IFN0YXR1cyAqLworaW50IGJzc2dwX3R4X3N0YXR1cyh1aW50OF90IGNhdXNlLCB1aW50MTZfdCAqYnZjaSwgc3RydWN0IG1zZ2IgKm9yaWdfbXNnKQoreworCXN0cnVjdCBtc2diICptc2cgPSBic3NncF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGJzc2dwX25vcm1hbF9oZHIgKmJncGggPQorCQkJKHN0cnVjdCBic3NncF9ub3JtYWxfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpiZ3BoKSk7CisKKwlERUJVR1BDKERHUFJTLCAiQlNTR1A6IFRYIFNUQVRVUywgY2F1c2U9JXNcbiIsIGJzc2dwX2NhdXNlX3N0cihjYXVzZSkpOworCW1zZ2JfbnNlaShtc2cpID0gbXNnYl9uc2VpKG9yaWdfbXNnKTsKKwltc2diX2J2Y2kobXNnKSA9IDA7CisKKwliZ3BoLT5wZHVfdHlwZSA9IEJTU0dQX1BEVVRfU1RBVFVTOworCW1zZ2JfdHZsdl9wdXQobXNnLCBCU1NHUF9JRV9DQVVTRSwgMSwgJmNhdXNlKTsKKwlpZiAoYnZjaSkgeworCQl1aW50MTZfdCBfYnZjaSA9IGh0b25zKCpidmNpKTsKKwkJbXNnYl90dmx2X3B1dChtc2csIEJTU0dQX0lFX0JWQ0ksIDIsICh1aW50OF90ICopICZfYnZjaSk7CisJfQorCWlmIChvcmlnX21zZykKKwkJbXNnYl90dmx2X3B1dChtc2csIEJTU0dQX0lFX1BEVV9JTl9FUlJPUiwKKwkJCSAgICAgIG1zZ2JfYnNzZ3BfbGVuKG9yaWdfbXNnKSwgbXNnYl9ic3NncGgob3JpZ19tc2cpKTsKKworCXJldHVybiBncHJzX25zX3NlbmRtc2coYnNzZ3BfbnNpLCBtc2cpOworfQorCit1aW50MTZfdCBic3NncF9wYXJzZV9jZWxsX2lkKHN0cnVjdCBncHJzX3JhX2lkICpyYWlkLCBjb25zdCB1aW50OF90ICpidWYpCit7CisJLyogNiBvY3RldHMgUkFDICovCisJZ3NtNDhfcGFyc2VfcmEocmFpZCwgYnVmKTsKKwkvKiAyIG9jdGV0cyBDSUQgKi8KKwlyZXR1cm4gbnRvaHMoKih1aW50MTZfdCAqKSAoYnVmKzYpKTsKK30KKworLyogQ2hhcHRlciA4LjQgQlZDLVJlc2V0IFByb2NlZHVyZSAqLworc3RhdGljIGludCBic3NncF9yeF9idmNfcmVzZXQoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IHRsdl9wYXJzZWQgKnRwLAkKKwkJCSAgICAgIHVpbnQxNl90IG5zX2J2Y2kpCit7CisJc3RydWN0IGJzc2dwX2J0c19jdHggKmJjdHg7CisJdWludDE2X3QgbnNlaSA9IG1zZ2JfbnNlaShtc2cpOworCXVpbnQxNl90IGJ2Y2k7CisJaW50IHJjOworCisJYnZjaSA9IG50b2hzKCoodWludDE2X3QgKilUTFZQX1ZBTCh0cCwgQlNTR1BfSUVfQlZDSSkpOworCURFQlVHUEMoREdQUlMsICJCVkNJPSV1LCBjYXVzZT0lc1xuIiwgYnZjaSwKKwkJYnNzZ3BfY2F1c2Vfc3RyKCpUTFZQX1ZBTCh0cCwgQlNTR1BfSUVfQ0FVU0UpKSk7CisKKwkvKiBsb29rLXVwIG9yIGNyZWF0ZSB0aGUgQlRTIGNvbnRleHQgZm9yIHRoaXMgQlZDICovCisJYmN0eCA9IGJ0c2N0eF9ieV9idmNpX25zZWkoYnZjaSwgbnNlaSk7CisJaWYgKCFiY3R4KQorCQliY3R4ID0gYnRzY3R4X2FsbG9jKGJ2Y2ksIG5zZWkpOworCisJLyogV2hlbiB3ZSByZWNlaXZlIGEgQlZDLVJFU0VUIFBEVSAoYXQgbGVhc3Qgb2YgYSBQVFAgQlZDSSksIHRoZSBCU1MKKwkgKiBpbmZvcm1zIHVzIGFib3V0IGl0cyBSQUMgKyBDZWxsIElELCBzbyB3ZSBjYW4gY3JlYXRlIGEgbWFwcGluZyAqLworCWlmIChidmNpICE9IDAgJiYgYnZjaSAhPSAxKSB7CisJCWlmICghVExWUF9QUkVTRU5UKHRwLCBCU1NHUF9JRV9DRUxMX0lEKSkgeworCQkJTE9HUChER1BSUywgTE9HTF9FUlJPUiwgIkJTU0dQIFJFU0VUIEJWQ0k9JXUgIgorCQkJCSJtaXNzaW5nIG1hbmRhdG9yeSBJRVxuIiwgYnZjaSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkvKiBhY3R1YWxseSBleHRyYWN0IFJBQyAvIENJRCAqLworCQliY3R4LT5jZWxsX2lkID0gYnNzZ3BfcGFyc2VfY2VsbF9pZCgmYmN0eC0+cmFfaWQsCisJCQkJCQlUTFZQX1ZBTCh0cCwgQlNTR1BfSUVfQ0VMTF9JRCkpOworCQlMT0dQKERHUFJTLCBMT0dMX05PVElDRSwgIkNlbGwgJXUtJXUtJXUtJXUgQ0kgJXUgb24gQlZDSSAldVxuIiwKKwkJCWJjdHgtPnJhX2lkLm1jYywgYmN0eC0+cmFfaWQubW5jLCBiY3R4LT5yYV9pZC5sYWMsCisJCQliY3R4LT5yYV9pZC5yYWMsIGJjdHgtPmNlbGxfaWQsIGJ2Y2kpOworCX0KKworCS8qIEFja25vd2xlZGdlIHRoZSBSRVNFVCB0byB0aGUgQlRTICovCisJcmMgPSBic3NncF90eF9zaW1wbGVfYnZjaShCU1NHUF9QRFVUX0JWQ19SRVNFVF9BQ0ssCisJCQkJICBuc2VpLCBidmNpLCBuc19idmNpKTsKKwlyZXR1cm4gMDsKK30KKworLyogVXBsaW5rIHVuaXQtZGF0YSAqLworc3RhdGljIGludCBic3NncF9yeF91bF91ZChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBic3NncF91ZF9oZHIgKmJ1ZGggPSAoc3RydWN0IGJzc2dwX3VkX2hkciAqKSBtc2diX2Jzc2dwaChtc2cpOworCWludCBkYXRhX2xlbiA9IG1zZ2JfYnNzZ3BfbGVuKG1zZykgLSBzaXplb2YoKmJ1ZGgpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCWludCByYzsKKworCURFQlVHUChER1BSUywgIkJTU0dQIFVMLVVEXG4iKTsKKworCS8qIGV4dHJhY3QgVExMSSBhbmQgcGFyc2UgVExWIElFcyAqLworCW1zZ2JfdGxsaShtc2cpID0gbnRvaGwoYnVkaC0+dGxsaSk7CisJcmMgPSBic3NncF90bHZfcGFyc2UoJnRwLCBidWRoLT5kYXRhLCBkYXRhX2xlbik7CisKKwkvKiBDZWxsIElEIGFuZCBMTENfUERVIGFyZSB0aGUgb25seSBtYW5kYXRvcnkgSUUgKi8KKwlpZiAoIVRMVlBfUFJFU0VOVCgmdHAsIEJTU0dQX0lFX0NFTExfSUQpIHx8CisJICAgICFUTFZQX1BSRVNFTlQoJnRwLCBCU1NHUF9JRV9MTENfUERVKSkKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBGSVhNRTogbG9va3VwIGJzc2dwX2J0c19jdHggYmFzZWQgb24gQlZDSSArIE5TRUkgKi8KKworCS8qIHN0b3JlIHBvaW50ZXIgdG8gTExDIGhlYWRlciBhbmQgQ0VMTCBJRCBpbiBtc2diLT5jYiAqLworCW1zZ2JfbGxjaChtc2cpID0gVExWUF9WQUwoJnRwLCBCU1NHUF9JRV9MTENfUERVKTsKKwltc2diX2JjaWQobXNnKSA9IFRMVlBfVkFMKCZ0cCwgQlNTR1BfSUVfQ0VMTF9JRCk7CisKKwlyZXR1cm4gZ3Byc19sbGNfcmN2bXNnKG1zZywgJnRwKTsKK30KKworc3RhdGljIGludCBic3NncF9yeF9zdXNwZW5kKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGJzc2dwX25vcm1hbF9oZHIgKmJncGggPQorCQkJKHN0cnVjdCBic3NncF9ub3JtYWxfaGRyICopIG1zZ2JfYnNzZ3BoKG1zZyk7CisJaW50IGRhdGFfbGVuID0gbXNnYl9ic3NncF9sZW4obXNnKSAtIHNpemVvZigqYmdwaCk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJaW50IHJjOworCisJREVCVUdQKERHUFJTLCAiQlNTR1AgU1VTUEVORFxuIik7CisKKwlyYyA9IGJzc2dwX3Rsdl9wYXJzZSgmdHAsIGJncGgtPmRhdGEsIGRhdGFfbGVuKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlpZiAoIVRMVlBfUFJFU0VOVCgmdHAsIEJTU0dQX0lFX1RMTEkpIHx8CisJICAgICFUTFZQX1BSRVNFTlQoJnRwLCBCU1NHUF9JRV9ST1VURUlOR19BUkVBKSkKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBGSVhNRTogcGFzcyB0aGUgU1VTUEVORCByZXF1ZXN0IHRvIEdNTSAqLworCS8qIFNFTkQgU1VTUEVORF9BQ0sgb3IgU1VTUEVORF9OQUNLICovCit9CisKK3N0YXRpYyBpbnQgYnNzZ3BfcnhfcmVzdW1lKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGJzc2dwX25vcm1hbF9oZHIgKmJncGggPQorCQkJKHN0cnVjdCBic3NncF9ub3JtYWxfaGRyICopIG1zZ2JfYnNzZ3BoKG1zZyk7CisJaW50IGRhdGFfbGVuID0gbXNnYl9ic3NncF9sZW4obXNnKSAtIHNpemVvZigqYmdwaCk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJaW50IHJjOworCisJREVCVUdQKERHUFJTLCAiQlNTR1AgUkVTVU1FXG4iKTsKKworCXJjID0gYnNzZ3BfdGx2X3BhcnNlKCZ0cCwgYmdwaC0+ZGF0YSwgZGF0YV9sZW4pOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCWlmICghVExWUF9QUkVTRU5UKCZ0cCwgQlNTR1BfSUVfVExMSSkgfHwKKwkgICAgIVRMVlBfUFJFU0VOVCgmdHAsIEJTU0dQX0lFX1JPVVRFSU5HX0FSRUEpIHx8CisJICAgICFUTFZQX1BSRVNFTlQoJnRwLCBCU1NHUF9JRV9TVVNQRU5EX1JFRl9OUikpCisJCXJldHVybiAtRUlPOworCisJLyogRklYTUU6IHBhc3MgdGhlIFJFU1VNRSByZXF1ZXN0IHRvIEdNTSAqLworCS8qIFNFTkQgUkVTVU1FX0FDSyBvciBSRVNVTUVfTkFDSyAqLworfQorCitzdGF0aWMgaW50IGJzc2dwX3J4X2ZjX2J2YyhzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgdGx2X3BhcnNlZCAqdHApCit7CisKKwlERUJVR1AoREdQUlMsICJCU1NHUCBGQyBCVkNcbiIpOworCisJaWYgKCFUTFZQX1BSRVNFTlQodHAsIEJTU0dQX0lFX1RBRykgfHwKKwkgICAgIVRMVlBfUFJFU0VOVCh0cCwgQlNTR1BfSUVfQlZDX0JVQ0tFVF9TSVpFKSB8fAorCSAgICAhVExWUF9QUkVTRU5UKHRwLCBCU1NHUF9JRV9CVUNLRVRfTEVBS19SQVRFKSB8fAorCSAgICAhVExWUF9QUkVTRU5UKHRwLCBCU1NHUF9JRV9CTUFYX0RFRkFVTFRfTVMpIHx8CisJICAgICFUTFZQX1BSRVNFTlQodHAsIEJTU0dQX0lFX1JfREVGQVVMVF9NUykpCisJCXJldHVybiBic3NncF90eF9zdGF0dXMoQlNTR1BfQ0FVU0VfTUlTU0lOR19NQU5EX0lFLCBOVUxMLCBtc2cpOworCisJLyogRklYTUU6IGFjdHVhbGx5IGltcGxlbWVudCBmbG93IGNvbnRyb2wgKi8KKworCS8qIFNlbmQgRkxPV19DT05UUk9MX0JWQ19BQ0sgKi8KKwlyZXR1cm4gYnNzZ3BfdHhfZmNfYnZjX2Fjayhtc2diX25zZWkobXNnKSwgKlRMVlBfVkFMKHRwLCBCU1NHUF9JRV9UQUcpLAorCQkJCSAgIG1zZ2JfYnZjaShtc2cpKTsKK30KKworLyogV2UgZXhwZWN0IG1zZ2JfYnNzZ3BoKCkgdG8gcG9pbnQgdG8gdGhlIEJTU0dQIGhlYWRlciAqLworaW50IGdwcnNfYnNzZ3BfcmN2bXNnKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGJzc2dwX25vcm1hbF9oZHIgKmJncGggPQorCQkJKHN0cnVjdCBic3NncF9ub3JtYWxfaGRyICopIG1zZ2JfYnNzZ3BoKG1zZyk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJdWludDhfdCBwZHVfdHlwZSA9IGJncGgtPnBkdV90eXBlOworCWludCBkYXRhX2xlbiA9IG1zZ2JfYnNzZ3BfbGVuKG1zZykgLSBzaXplb2YoKmJncGgpOworCXVpbnQxNl90IGJ2Y2k7CS8qIFBUUCBCVkNJICovCisJdWludDE2X3QgbnNfYnZjaSA9IG1zZ2JfYnZjaShtc2cpOworCWludCByYyA9IDA7CisKKwkvKiBJZGVudGlmaWVycyBmcm9tIERPV046IE5TRUksIEJWQ0kgKGJvdGggaW4gbXNnLT5jYikgKi8KKworCS8qIFVOSVREQVRBIEJTU0dQIGhlYWRlcnMgaGF2ZSBUTExJIGluIGZyb250ICovCisJaWYgKHBkdV90eXBlICE9IEJTU0dQX1BEVVRfVUxfVU5JVERBVEEgJiYKKwkgICAgcGR1X3R5cGUgIT0gQlNTR1BfUERVVF9ETF9VTklUREFUQSkKKwkJcmMgPSBic3NncF90bHZfcGFyc2UoJnRwLCBiZ3BoLT5kYXRhLCBkYXRhX2xlbik7CisKKwlzd2l0Y2ggKHBkdV90eXBlKSB7CisJY2FzZSBCU1NHUF9QRFVUX1VMX1VOSVREQVRBOgorCQkvKiBzb21lIExMQyBkYXRhIGZyb20gdGhlIE1TICovCisJCXJjID0gYnNzZ3BfcnhfdWxfdWQobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBCU1NHUF9QRFVUX1JBX0NBUEFCSUxJVFk6CisJCS8qIEJTUyByZXF1ZXN0cyBSQSBjYXBhYmlsaXR5IG9yIElNU0kgKi8KKwkJREVCVUdQKERHUFJTLCAiQlNTR1AgUkEgQ0FQQUJJTElUWSBVUERBVEVcbiIpOworCQkvKiBGSVhNRTogc2VuZCBSQV9DQVBBX1VQREFURV9BQ0sgKi8KKwkJYnJlYWs7CisJY2FzZSBCU1NHUF9QRFVUX1JBRElPX1NUQVRVUzoKKwkJREVCVUdQKERHUFJTLCAiQlNTR1AgUkFESU8gU1RBVFVTXG4iKTsKKwkJLyogQlNTIGluZm9ybXMgdXMgb2Ygc29tZSBleGNlcHRpb24gKi8KKwkJLyogRklYTUU6IG5vdGlmeSBHTU0gKi8KKwkJYnJlYWs7CisJY2FzZSBCU1NHUF9QRFVUX1NVU1BFTkQ6CisJCS8qIE1TIHdhbnRzIHRvIHN1c3BlbmQgKi8KKwkJcmMgPSBic3NncF9yeF9zdXNwZW5kKG1zZyk7CisJCWJyZWFrOworCWNhc2UgQlNTR1BfUERVVF9SRVNVTUU6CisJCS8qIE1TIHdhbnRzIHRvIHJlc3VtZSAqLworCQlyYyA9IGJzc2dwX3J4X3Jlc3VtZShtc2cpOworCQlicmVhazsKKwljYXNlIEJTU0dQX1BEVVRfRkxVU0hfTEw6CisJCS8qIEJTUyBpbmZvcm1zIE1TIGhhcyBtb3ZlZCB0byBvbmUgY2VsbCB0byBvdGhlciBjZWxsICovCisJCURFQlVHUChER1BSUywgIkJTU0dQIEZMVVNIIExMXG4iKTsKKwkJLyogRklYTUU6IG5vdGlmeSBHTU0gKi8KKwkJLyogU2VuZCBGTFVTSF9MTF9BQ0sgKi8KKwkJYnJlYWs7CisJY2FzZSBCU1NHUF9QRFVUX0xMQ19ESVNDQVJEOgorCQkvKiBCU1MgaW5mb3JtcyB0aGF0IHNvbWUgTExDIFBEVSdzIGhhdmUgYmVlbiBkaXNjYXJkZWQgKi8KKwkJREVCVUdQKERHUFJTLCAiQlNTR1AgTExDIERJU0NBUkRFRFxuIik7CisJCS8qIEZJWE1FOiBub3RpZnkgR01NICovCisJCWJyZWFrOworCWNhc2UgQlNTR1BfUERVVF9GTE9XX0NPTlRST0xfQlZDOgorCQkvKiBCU1MgaW5mb3JtcyB1cyBvZiBhdmFpbGFibGUgYmFuZHdpZHRoIGluIEdiIGludGVyZmFjZSAqLworCQlyYyA9IGJzc2dwX3J4X2ZjX2J2Yyhtc2csICZ0cCk7CisJCWJyZWFrOworCWNhc2UgQlNTR1BfUERVVF9GTE9XX0NPTlRST0xfTVM6CisJCS8qIEJTUyBpbmZvcm1zIHVzIG9mIGF2YWlsYWJsZSBiYW5kd2lkdGggdG8gb25lIE1TICovCisJCURFQlVHUChER1BSUywgIkJTU0dQIEZDIE1TXG4iKTsKKwkJLyogRklYTUU6IGFjdHVhbGx5IGltcGxlbWVudCBmbG93IGNvbnRyb2wgKi8KKwkJLyogRklYTUU6IFNlbmQgRkxPV19DT05UUk9MX01TX0FDSyAqLworCQlicmVhazsKKwljYXNlIEJTU0dQX1BEVVRfQlZDX0JMT0NLOgorCQkvKiBCU1MgdGVsbHMgdXMgdGhhdCBCVkMgc2hhbGwgYmUgYmxvY2tlZCAqLworCQlERUJVR1AoREdQUlMsICJCU1NHUCBCVkMgQkxPQ0sgIik7CisJCWlmICghVExWUF9QUkVTRU5UKCZ0cCwgQlNTR1BfSUVfQlZDSSkgfHwKKwkJICAgICFUTFZQX1BSRVNFTlQoJnRwLCBCU1NHUF9JRV9DQVVTRSkpCisJCQlnb3RvIGVycl9tYW5kX2llOworCQlidmNpID0gbnRvaHMoKih1aW50MTZfdCAqKVRMVlBfVkFMKCZ0cCwgQlNTR1BfSUVfQlZDSSkpOworCQlERUJVR1BDKERHUFJTLCAiQlZDST0ldSwgY2F1c2U9JXNcbiIsIGJ2Y2ksCisJCQlic3NncF9jYXVzZV9zdHIoKlRMVlBfVkFMKCZ0cCwgQlNTR1BfSUVfQ0FVU0UpKSk7CisJCS8qIFdlIGFsd2F5cyBhY2tub3dsZWRnZSB0aGUgQkxPQ0tpbmcgKi8KKwkJcmMgPSBic3NncF90eF9zaW1wbGVfYnZjaShCU1NHUF9QRFVUX0JWQ19CTE9DS19BQ0ssCisJCQkJCSAgbXNnYl9uc2VpKG1zZyksIGJ2Y2ksIG5zX2J2Y2kpOworCQlicmVhazsKKwljYXNlIEJTU0dQX1BEVVRfQlZDX1VOQkxPQ0s6CisJCS8qIEJTUyB0ZWxscyB1cyB0aGF0IEJWQyBzaGFsbCBiZSB1bmJsb2NrZWQgKi8KKwkJREVCVUdQKERHUFJTLCAiQlNTR1AgQlZDIFVOQkxPQ0sgIik7CisJCWlmICghVExWUF9QUkVTRU5UKCZ0cCwgQlNTR1BfSUVfQlZDSSkpCisJCQlnb3RvIGVycl9tYW5kX2llOworCQlidmNpID0gbnRvaHMoKih1aW50MTZfdCAqKVRMVlBfVkFMKCZ0cCwgQlNTR1BfSUVfQlZDSSkpOworCQlERUJVR1BDKERHUFJTLCAiQlZDST0ldVxuIiwgYnZjaSk7CisJCS8qIFdlIGFsd2F5cyBhY2tub3dsZWRnZSB0aGUgdW5CTE9DS2luZyAqLworCQlyYyA9IGJzc2dwX3R4X3NpbXBsZV9idmNpKEJTU0dQX1BEVVRfQlZDX1VOQkxPQ0tfQUNLLAorCQkJCQkgIG1zZ2JfbnNlaShtc2cpLCBidmNpLCBuc19idmNpKTsKKwkJYnJlYWs7CisJY2FzZSBCU1NHUF9QRFVUX0JWQ19SRVNFVDoKKwkJLyogQlNTIHRlbGxzIHVzIHRoYXQgQlZDIGluaXQgaXMgcmVxdWlyZWQgKi8KKwkJREVCVUdQKERHUFJTLCAiQlNTR1AgQlZDIFJFU0VUICIpOworCQlpZiAoIVRMVlBfUFJFU0VOVCgmdHAsIEJTU0dQX0lFX0JWQ0kpIHx8CisJCSAgICAhVExWUF9QUkVTRU5UKCZ0cCwgQlNTR1BfSUVfQ0FVU0UpKQorCQkJZ290byBlcnJfbWFuZF9pZTsKKwkJcmMgPSBic3NncF9yeF9idmNfcmVzZXQobXNnLCAmdHAsIG5zX2J2Y2kpOworCQlicmVhazsKKwljYXNlIEJTU0dQX1BEVVRfU1RBVFVTOgorCQkvKiBTb21lIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQgKi8KKwkJLyogRklYTUU6IG5vdGlmeSBHTU0gKi8KKwljYXNlIEJTU0dQX1BEVVRfRE9XTkxPQURfQlNTX1BGQzoKKwljYXNlIEJTU0dQX1BEVVRfQ1JFQVRFX0JTU19QRkNfQUNLOgorCWNhc2UgQlNTR1BfUERVVF9DUkVBVEVfQlNTX1BGQ19OQUNLOgorCWNhc2UgQlNTR1BfUERVVF9NT0RJRllfQlNTX1BGQzoKKwljYXNlIEJTU0dQX1BEVVRfREVMRVRFX0JTU19QRkNfQUNLOgorCQlERUJVR1AoREdQUlMsICJCU1NHUCBQRFUgdHlwZSAweCUwMnggbm90IFt5ZXRdIGltcGxlbWVudGVkXG4iLAorCQkJcGR1X3R5cGUpOworCQlicmVhazsKKwkvKiB0aG9zZSBvbmx5IGV4aXN0IGluIHRoZSBTR1NOIC0+IEJTUyBkaXJlY3Rpb24gKi8KKwljYXNlIEJTU0dQX1BEVVRfRExfVU5JVERBVEE6CisJY2FzZSBCU1NHUF9QRFVUX1BBR0lOR19QUzoKKwljYXNlIEJTU0dQX1BEVVRfUEFHSU5HX0NTOgorCWNhc2UgQlNTR1BfUERVVF9SQV9DQVBBX1VQREFURV9BQ0s6CisJY2FzZSBCU1NHUF9QRFVUX1NVU1BFTkRfQUNLOgorCWNhc2UgQlNTR1BfUERVVF9TVVNQRU5EX05BQ0s6CisJY2FzZSBCU1NHUF9QRFVUX1JFU1VNRV9BQ0s6CisJY2FzZSBCU1NHUF9QRFVUX1JFU1VNRV9OQUNLOgorCWNhc2UgQlNTR1BfUERVVF9GTFVTSF9MTF9BQ0s6CisJY2FzZSBCU1NHUF9QRFVUX0ZMT1dfQ09OVFJPTF9CVkNfQUNLOgorCWNhc2UgQlNTR1BfUERVVF9GTE9XX0NPTlRST0xfTVNfQUNLOgorCWNhc2UgQlNTR1BfUERVVF9CVkNfQkxPQ0tfQUNLOgorCWNhc2UgQlNTR1BfUERVVF9CVkNfVU5CTE9DS19BQ0s6CisJY2FzZSBCU1NHUF9QRFVUX1NHU05fSU5WT0tFX1RSQUNFOgorCQlERUJVR1AoREdQUlMsICJCU1NHUCBQRFUgdHlwZSAweCUwMnggb25seSBleGlzdHMgaW4gRExcbiIsCisJCQlwZHVfdHlwZSk7CisJCXJjID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREVCVUdQKERHUFJTLCAiQlNTR1AgUERVIHR5cGUgMHglMDJ4IHVua25vd25cbiIsIHBkdV90eXBlKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworZXJyX21hbmRfaWU6CisJcmV0dXJuIGJzc2dwX3R4X3N0YXR1cyhCU1NHUF9DQVVTRV9NSVNTSU5HX01BTkRfSUUsIE5VTEwsIG1zZyk7Cit9CisKKy8qIEVudHJ5IGZ1bmN0aW9uIGZyb20gdXBwZXIgbGV2ZWwgKExMQyksIGFza2luZyB1cyB0byB0cmFuc21pdCBhIEJTU0dQIFBEVQorICogdG8gYSByZW1vdGUgTVMgKGlkZW50aWZpZWQgYnkgVExMSSkgYXQgYSBCVFMgaWRlbnRpZmllZCBieSBpdHMgQlZDSSBhbmQgTlNFSSAqLworaW50IGdwcnNfYnNzZ3BfdHhfZGxfdWQoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYnNzZ3BfYnRzX2N0eCAqYmN0eDsKKwlzdHJ1Y3QgYnNzZ3BfdWRfaGRyICpidWRoOworCXVpbnQ4X3QgbGxjX3BkdV90bHZfaGRyX2xlbiA9IDI7CisJdWludDhfdCAqbGxjX3BkdV90bHYsICpxb3NfcHJvZmlsZTsKKwl1aW50MTZfdCBwZHVfbGlmZXRpbWUgPSAxMDAwOyAvKiBjZW50aS1zZWNvbmRzICovCisJdWludDhfdCBxb3NfcHJvZmlsZV9kZWZhdWx0WzNdID0geyAweDAwLCAweDAwLCAweDIxIH07CisJdWludDE2X3QgbXNnX2xlbiA9IG1zZy0+bGVuOworCXVpbnQxNl90IGJ2Y2kgPSBtc2diX2J2Y2kobXNnKTsKKwl1aW50MTZfdCBuc2VpID0gbXNnYl9uc2VpKG1zZyk7CisKKwkvKiBJZGVudGlmaWVycyBmcm9tIFVQOiBUTExJLCBCVkNJLCBOU0VJIChhbGwgaW4gbXNnYi0+Y2IpICovCisJaWYgKGJ2Y2kgPCAyKSB7CisJCUxPR1AoREdQUlMsIExPR0xfRVJST1IsICJDYW5ub3Qgc2VuZCBETC1VRCB0byBCVkNJICV1XG4iLAorCQkJYnZjaSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWJjdHggPSBidHNjdHhfYnlfYnZjaV9uc2VpKGJ2Y2ksIG5zZWkpOworCWlmICghYmN0eCkKKwkJYmN0eCA9IGJ0c2N0eF9hbGxvYyhidmNpLCBuc2VpKTsKKworCWlmIChtc2ctPmxlbiA+IFRWTFZfTUFYX09ORUJZVEUpCisJCWxsY19wZHVfdGx2X2hkcl9sZW4gKz0gMTsKKworCS8qIHByZXBlbmQgdGhlIHRhZyBhbmQgbGVuZ3RoIG9mIHRoZSBMTEMtUERVIFRMViAqLworCWxsY19wZHVfdGx2ID0gbXNnYl9wdXNoKG1zZywgbGxjX3BkdV90bHZfaGRyX2xlbik7CisJbGxjX3BkdV90bHZbMF0gPSBCU1NHUF9JRV9MTENfUERVOworCWlmIChsbGNfcGR1X3Rsdl9oZHJfbGVuID4gMikgeworCQlsbGNfcGR1X3RsdlsxXSA9IG1zZ19sZW4gPj4gODsKKwkJbGxjX3BkdV90bHZbMl0gPSBtc2dfbGVuICYgMHhmZjsKKwl9IGVsc2UgeworCQlsbGNfcGR1X3RsdlsxXSA9IG1zZ19sZW4gJiAweDNmOworCQlsbGNfcGR1X3RsdlsxXSB8PSAweDgwOworCX0KKworCS8qIEZJWE1FOiBvcHRpb25hbCBlbGVtZW50cyAqLworCisJLyogcHJlcGVuZCB0aGUgcGR1IGxpZmV0aW1lICovCisJcGR1X2xpZmV0aW1lID0gaHRvbnMocGR1X2xpZmV0aW1lKTsKKwltc2diX3R2bHZfcHVzaChtc2csIEJTU0dQX0lFX1BEVV9MSUZFVElNRSwgMiwgKHVpbnQ4X3QgKikmcGR1X2xpZmV0aW1lKTsKKworCS8qIHByZXBlbmQgdGhlIFFvUyBwcm9maWxlLCBUTExJIGFuZCBwZHUgdHlwZSAqLworCWJ1ZGggPSAoc3RydWN0IGJzc2dwX3VkX2hkciAqKSBtc2diX3B1c2gobXNnLCBzaXplb2YoKmJ1ZGgpKTsKKwltZW1jcHkoYnVkaC0+cW9zX3Byb2ZpbGUsIHFvc19wcm9maWxlX2RlZmF1bHQsIHNpemVvZihxb3NfcHJvZmlsZV9kZWZhdWx0KSk7CisJYnVkaC0+dGxsaSA9IGh0b25sKG1zZ2JfdGxsaShtc2cpKTsKKwlidWRoLT5wZHVfdHlwZSA9IEJTU0dQX1BEVVRfRExfVU5JVERBVEE7CisKKwkvKiBJZGVudGlmaWVycyBkb3duOiBCVkNJLCBOU0VJIChpbiBtc2diLT5jYikgKi8KKworCXJldHVybiBncHJzX25zX3NlbmRtc2coYnNzZ3BfbnNpLCBtc2cpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX2xsYy5jIGIvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX2xsYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNzVhM2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ncHJzL2dwcnNfbGxjLmMKQEAgLTAsMCArMSw1NDkgQEAKKy8qIEdQUlMgTExDIHByb3RvY29sIGltcGxlbWVudGF0aW9uIGFzIHBlciAzR1BQIFRTIDA0LjY0ICovCisKKy8qIChDKSAyMDA5LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGltZXIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX2Jzc2dwLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX2xsYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvY3JjMjQuaD4KKworLyogU2VjdGlvbiA0LjUuMiBMb2dpY2FsIExpbmsgU3RhdGVzICsgQW5uZXggQy4yICovCitlbnVtIGdwcnNfbGxjX2xsX3N0YXRlIHsKKwlHUFJTX0xMU19VTkFTU0lHTkVECT0gMSwJLyogTm8gVExMSSB5ZXQgKi8KKwlHUFJTX0xMU19BU1NJR05FRF9BRE0JPSAyLAkvKiBUTExJIGFzc2lnbmVkICovCisJR1BSU19MTFNfTE9DQUxfRVNUCT0gMywJLyogTG9jYWwgRXN0YWJsaXNobWVudCAqLworCUdQUlNfTExTX1JFTU9URV9FU1QJPSA0LAkvKiBSZW1vdGUgRXN0YWJsaXNobWVudCAqLworCUdQUlNfTExTX0FCTQkJPSA1LAorCUdQUlNfTExTX0xPQ0FMX1JFTAk9IDYsCS8qIExvY2FsIFJlbGVhc2UgKi8KKwlHUFJTX0xMU19USU1FUl9SRUMgCT0gNywJLyogVGltZXIgUmVjb3ZlcnkgKi8KK307CisKKy8qIFNlY3Rpb24gNC43LjE6IExvZ2ljYWwgTGluayBFbnRpdHk6IE9uZSBwZXIgRExDSSAoVExMSSArIFNBUEkpICovCitzdHJ1Y3QgZ3Byc19sbGNfbGxlIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCB0aW1lcl9saXN0IHQyMDA7CisJc3RydWN0IHRpbWVyX2xpc3QgdDIwMTsJLyogd2FpdCBmb3IgYWNrbm93bGVkZ2VtZW50ICovCisKKwllbnVtIGdwcnNfbGxjX2xsX3N0YXRlIHN0YXRlOworCisJdWludDMyX3QgdGxsaTsKKwl1aW50MzJfdCBzYXBpOworCisJdWludDhfdCB2X3NlbnQ7CisJdWludDhfdCB2X2FjazsKKwl1aW50OF90IHZfcmVjdjsKKworCXVuc2lnbmVkIGludCBuMjAwOworCXVuc2lnbmVkIGludCByZXRyYW5zX2N0cjsKKworCS8qIG92ZXIgd2hpY2ggQlNTR1AgQlRTIGN0eCBkbyB3ZSBuZWVkIHRvIHRyYW5zbWl0ICovCisJdWludDE2X3QgYnZjaTsKKwl1aW50MTZfdCBuc2VpOworfTsKKworc3RhdGljIExMSVNUX0hFQUQoZ3Byc19sbGNfbGxlcyk7Cit2b2lkICpsbGNfdGFsbF9jdHg7CisKKy8qIGxvb2t1cCBMTEMgRW50aXR5IGJhc2VkIG9uIERMQ0kgKFRMTEkrU0FQSSB0dXBsZSkgKi8KK3N0YXRpYyBzdHJ1Y3QgZ3Byc19sbGNfbGxlICpsbGVfYnlfdGxsaV9zYXBpKHVpbnQzMl90IHRsbGksIHVpbnQzMl90IHNhcGkpCit7CisJc3RydWN0IGdwcnNfbGxjX2xsZSAqbGxlOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkobGxlLCAmZ3Byc19sbGNfbGxlcywgbGlzdCkgeworCQlpZiAobGxlLT50bGxpID09IHRsbGkgJiYgbGxlLT5zYXBpID09IHNhcGkpCisJCQlyZXR1cm4gbGxlOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBncHJzX2xsY19sbGUgKmxsZV9hbGxvYyh1aW50MzJfdCB0bGxpLCB1aW50MzJfdCBzYXBpKQoreworCXN0cnVjdCBncHJzX2xsY19sbGUgKmxsZTsKKworCWxsZSA9IHRhbGxvY196ZXJvKGxsY190YWxsX2N0eCwgc3RydWN0IGdwcnNfbGxjX2xsZSk7CisJaWYgKCFsbGUpCisJCXJldHVybiBOVUxMOworCisJbGxlLT50bGxpID0gdGxsaTsKKwlsbGUtPnNhcGkgPSBzYXBpOworCWxsZS0+c3RhdGUgPSBHUFJTX0xMU19VTkFTU0lHTkVEOworCWxsaXN0X2FkZCgmbGxlLT5saXN0LCAmZ3Byc19sbGNfbGxlcyk7CisKKwlyZXR1cm4gbGxlOworfQorCitlbnVtIGdwcnNfbGxjX2NtZCB7CisJR1BSU19MTENfTlVMTCwKKwlHUFJTX0xMQ19SUiwKKwlHUFJTX0xMQ19BQ0ssCisJR1BSU19MTENfUk5SLAorCUdQUlNfTExDX1NBQ0ssCisJR1BSU19MTENfRE0sCisJR1BSU19MTENfRElTQywKKwlHUFJTX0xMQ19VQSwKKwlHUFJTX0xMQ19TQUJNLAorCUdQUlNfTExDX0ZSTVIsCisJR1BSU19MTENfWElELAorfTsKKworc3RydWN0IGdwcnNfbGxjX2hkcl9wYXJzZWQgeworCXVpbnQ4X3Qgc2FwaTsKKwl1aW50OF90IGlzX2NtZDoxLAorCQkgYWNrX3JlcToxLAorCQkgaXNfZW5jcnlwdGVkOjE7CisJdWludDMyX3Qgc2VxX3J4OworCXVpbnQzMl90IHNlcV90eDsKKwl1aW50MzJfdCBmY3M7CisJdWludDMyX3QgZmNzX2NhbGM7CisJdWludDhfdCAqZGF0YTsKKwl1aW50MTZfdCBkYXRhX2xlbjsKKwllbnVtIGdwcnNfbGxjX2NtZCBjbWQ7Cit9OworCisjZGVmaW5lIExMQ19BTExPQ19TSVpFIDE2Mzg0CisjZGVmaW5lIFVJX0hEUl9MRU4JMworI2RlZmluZSBOMjAyCQk0CisjZGVmaW5lIENSQzI0X0xFTkdUSAkzCisKK3N0YXRpYyBpbnQgZ3Byc19sbGNfZmNzKHVpbnQ4X3QgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pCit7CisJdWludDMyX3QgZmNzX2NhbGM7CisKKwlmY3NfY2FsYyA9IGNyYzI0X2NhbGMoSU5JVF9DUkMyNCwgZGF0YSwgbGVuKTsKKwlmY3NfY2FsYyA9IH5mY3NfY2FsYzsKKwlmY3NfY2FsYyAmPSAweGZmZmZmZjsKKworCXJldHVybiBmY3NfY2FsYzsKK30KKworc3RhdGljIHZvaWQgdDIwMF9leHBpcmVkKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGdwcnNfbGxjX2xsZSAqbGxlID0gZGF0YTsKKworCS8qIDguNS4xLjM6IEV4cGlyeSBvZiBUMjAwICovCisKKwlpZiAobGxlLT5yZXRyYW5zX2N0ciA+PSBsbGUtPm4yMDApIHsKKwkJLyogRklYTUU6IExMR00tU1RBVFVTLUlORCwgTEwtUkVMRUFTRS1JTkQvQ05GICovCisJCWxsZS0+c3RhdGUgPSBHUFJTX0xMU19BU1NJR05FRF9BRE07CisJfQorCisJc3dpdGNoIChsbGUtPnN0YXRlKSB7CisJY2FzZSBHUFJTX0xMU19MT0NBTF9FU1Q6CisJCS8qIHJldHJhbnNtaXQgU0FCTSAqLworCQkvKiByZS1zdGFydCBUMjAwICovCisJCWxsZS0+cmV0cmFuc19jdHIrKzsKKwkJYnJlYWs7CisJY2FzZSBHUFJTX0xMU19MT0NBTF9SRUw6CisJCS8qIHJldHJhbnNtaXQgRElTQyAqLworCQkvKiByZS1zdGFydCBUMjAwICovCisJCWxsZS0+cmV0cmFuc19jdHIrKzsKKwkJYnJlYWs7CisJfQorCit9CisKK3N0YXRpYyB2b2lkIHQyMDFfZXhwaXJlZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBncHJzX2xsY19sbGUgKmxsZSA9IGRhdGE7CisKKwlpZiAobGxlLT5yZXRyYW5zX2N0ciA8IGxsZS0+bjIwMCkgeworCQkvKiB0cmFuc21pdCBhcHJvcHJpYXRlIHN1cGVydmlzb3J5IGZyYW1lICg4LjYuNC4xKSAqLworCQkvKiBzZXQgdGltZXIgVDIwMSAqLworCQlsbGUtPnJldHJhbnNfY3RyKys7CisJfQorfQorCitpbnQgZ3Byc19sbGNfdHhfdShzdHJ1Y3QgbXNnYiAqbXNnLCB1aW50OF90IHNhcGksIGludCBjb21tYW5kLAorCQkgIGVudW0gZ3Byc19sbGNfdV9jbWQgdV9jbWQsIGludCBwZl9iaXQpCit7CisJdWludDhfdCAqZmNzLCAqbGxjaDsKKwl1aW50OF90IGFkZHIsIGN0cmw7CisJdWludDMyX3QgZmNzX2NhbGM7CisKKwkvKiBJZGVudGlmaWVycyBmcm9tIFVQOiAoVExMSSwgU0FQSSkgKyAoQlZDSSwgTlNFSSkgKi8KKworCS8qIEFkZHJlc3MgRmllbGQgKi8KKwlhZGRyID0gc2FwaSAmIDB4ZjsKKwlpZiAoY29tbWFuZCkKKwkJYWRkciB8PSAweDQwOworCisJLyogNi4zIEZpZ3VyZSA4ICovCisJY3RybCA9IDB4ZTAgfCB1X2NtZDsKKwlpZiAocGZfYml0KQorCQljdHJsIHw9IDB4MTA7CisKKwkvKiBwcmVwZW5kIExMQyBVSSBoZWFkZXIgKi8KKwlsbGNoID0gbXNnYl9wdXNoKG1zZywgMik7CisJbGxjaFswXSA9IGFkZHI7CisJbGxjaFsxXSA9IGN0cmw7CisKKwkvKiBhcHBlbmQgRkNTIHRvIGVuZCBvZiBmcmFtZSAqLworCWZjcyA9IG1zZ2JfcHV0KG1zZywgMyk7CisJZmNzX2NhbGMgPSBncHJzX2xsY19mY3MobGxjaCwgZmNzIC0gbGxjaCk7CisJZmNzWzBdID0gZmNzX2NhbGMgJiAweGZmOworCWZjc1sxXSA9IChmY3NfY2FsYyA+PiA4KSAmIDB4ZmY7CisJZmNzWzJdID0gKGZjc19jYWxjID4+IDE2KSAmIDB4ZmY7CisKKwkvKiBJZGVudGlmaWVycyBwYXNzZWQgZG93bjogKEJWQ0ksIE5TRUkpICovCisKKwlyZXR1cm4gZ3Byc19ic3NncF90eF9kbF91ZChtc2cpOworfQorCisvKiBTZW5kIFhJRCByZXNwb25zZSB0byBMTEUgKi8KK3N0YXRpYyBpbnQgZ3Byc19sbGNfdHhfeGlkKHN0cnVjdCBncHJzX2xsY19sbGUgKmxsZSwgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwkvKiBjb3B5IGlkZW50aWZpZXJzIGZyb20gTExFIHRvIGVuc3VyZSBsb3dlciBsYXllcnMgY2FuIHJvdXRlICovCisJbXNnYl90bGxpKG1zZykgPSBsbGUtPnRsbGk7CisJbXNnYl9idmNpKG1zZykgPSBsbGUtPmJ2Y2k7CisJbXNnYl9uc2VpKG1zZykgPSBsbGUtPm5zZWk7CisKKwlyZXR1cm4gZ3Byc19sbGNfdHhfdShtc2csIGxsZS0+c2FwaSwgMCwgR1BSU19MTENfVV9YSUQsIDEpOworfQorCisvKiBUcmFuc21pdCBhIFVJIGZyYW1lIG92ZXIgdGhlIGdpdmVuIFNBUEkgKi8KK2ludCBncHJzX2xsY190eF91aShzdHJ1Y3QgbXNnYiAqbXNnLCB1aW50OF90IHNhcGksIGludCBjb21tYW5kKQoreworCXN0cnVjdCBncHJzX2xsY19sbGUgKmxsZTsKKwl1aW50OF90ICpmY3MsICpsbGNoOworCXVpbnQ4X3QgYWRkciwgY3RybFsyXTsKKwl1aW50MzJfdCBmY3NfY2FsYzsKKwl1aW50MTZfdCBudSA9IDA7CisKKwkvKiBJZGVudGlmaWVycyBmcm9tIFVQOiAoVExMSSwgU0FQSSkgKyAoQlZDSSwgTlNFSSkgKi8KKworCS8qIGxvb2stdXAgb3IgY3JlYXRlIHRoZSBMTCBFbnRpdHkgZm9yIHRoaXMgKFRMTEksIFNBUEkpIHR1cGxlICovCisJbGxlID0gbGxlX2J5X3RsbGlfc2FwaShtc2diX3RsbGkobXNnKSwgc2FwaSk7CisJaWYgKCFsbGUpCisJCWxsZSA9IGxsZV9hbGxvYyhtc2diX3RsbGkobXNnKSwgc2FwaSk7CisJLyogVXBkYXRlIExMRSdzIChCVkNJLCBOU0VJKSB0dXBsZSAqLworCWxsZS0+YnZjaSA9IG1zZ2JfYnZjaShtc2cpOworCWxsZS0+bnNlaSA9IG1zZ2JfbnNlaShtc2cpOworCisJLyogQWRkcmVzcyBGaWVsZCAqLworCWFkZHIgPSBzYXBpICYgMHhmOworCWlmIChjb21tYW5kKQorCQlhZGRyIHw9IDB4NDA7CisKKwkvKiBDb250cm9sIEZpZWxkICovCisJY3RybFswXSA9IDB4YzA7CisJY3RybFswXSB8PSBudSA+PiA2OworCWN0cmxbMV0gPSAobnUgPDwgMikgJiAweGZjOworCWN0cmxbMV0gfD0gMHgwMTsgLyogUHJvdGVjdGVkIE1vZGUgKi8KKworCS8qIHByZXBlbmQgTExDIFVJIGhlYWRlciAqLworCWxsY2ggPSBtc2diX3B1c2gobXNnLCAzKTsKKwlsbGNoWzBdID0gYWRkcjsKKwlsbGNoWzFdID0gY3RybFswXTsKKwlsbGNoWzJdID0gY3RybFsxXTsKKworCS8qIGFwcGVuZCBGQ1MgdG8gZW5kIG9mIGZyYW1lICovCisJZmNzID0gbXNnYl9wdXQobXNnLCAzKTsKKwlmY3NfY2FsYyA9IGdwcnNfbGxjX2ZjcyhsbGNoLCBmY3MgLSBsbGNoKTsKKwlmY3NbMF0gPSBmY3NfY2FsYyAmIDB4ZmY7CisJZmNzWzFdID0gKGZjc19jYWxjID4+IDgpICYgMHhmZjsKKwlmY3NbMl0gPSAoZmNzX2NhbGMgPj4gMTYpICYgMHhmZjsKKworCS8qIElkZW50aWZpZXJzIHBhc3NlZCBkb3duOiAoQlZDSSwgTlNFSSkgKi8KKworCXJldHVybiBncHJzX2Jzc2dwX3R4X2RsX3VkKG1zZyk7Cit9CisKK3N0YXRpYyBpbnQgZ3Byc19sbGNfaGRyX2R1bXAoc3RydWN0IGdwcnNfbGxjX2hkcl9wYXJzZWQgKmdwaCkKK3sKKwlERUJVR1AoREdQUlMsICJMTEMgU0FQST0ldSAlYyAlYyBGQ1M9MHglMDZ4KCVzKSAiLAorCQlncGgtPnNhcGksIGdwaC0+aXNfY21kID8gJ0MnIDogJ1InLCBncGgtPmFja19yZXEgPyAnQScgOiAnICcsCisJCWdwaC0+ZmNzLCBncGgtPmZjc19jYWxjID09IGdwaC0+ZmNzID8gImNvcnJlY3QiIDogIldST05HIik7CisKKwlpZiAoZ3BoLT5jbWQpCisJCURFQlVHUEMoREdQUlMsICJDTUQ9JXUgIiwgZ3BoLT5jbWQpOworCisJaWYgKGdwaC0+ZGF0YSkKKwkJREVCVUdQQyhER1BSUywgIkRBVEEgIik7CisKKwlERUJVR1BDKERHUFJTLCAiXG4iKTsKK30KK3N0YXRpYyBpbnQgZ3Byc19sbGNfaGRyX3J4KHN0cnVjdCBncHJzX2xsY19oZHJfcGFyc2VkICpncGgsCisJCQkgICBzdHJ1Y3QgZ3Byc19sbGNfbGxlICpsbGUpCit7CisJc3dpdGNoIChncGgtPmNtZCkgeworCWNhc2UgR1BSU19MTENfU0FCTTogLyogU2VjdGlvbiA2LjQuMS4xICovCisJCWxsZS0+dl9zZW50ID0gbGxlLT52X2FjayA9IGxsZS0+dl9yZWN2ID0gMDsKKwkJaWYgKGxsZS0+c3RhdGUgPT0gR1BSU19MTFNfQVNTSUdORURfQURNKSB7CisJCQkvKiBzdGFydCByZS1lc3RhYmxpc2htZW50ICg4LjcuMSkgKi8KKwkJfQorCQlsbGUtPnN0YXRlID0gR1BSU19MTFNfUkVNT1RFX0VTVDsKKwkJLyogRklYTUU6IFNlbmQgVUEgKi8KKwkJbGxlLT5zdGF0ZSA9IEdQUlNfTExTX0FCTTsKKwkJLyogRklYTUU6IHByb2Nlc3MgZGF0YSAqLworCQlicmVhazsKKwljYXNlIEdQUlNfTExDX0RJU0M6IC8qIFNlY3Rpb24gNi40LjEuMiAqLworCQkvKiBGSVhNRTogU2VuZCBVQSAqLworCQkvKiB0ZXJtaW5hdGUgQUJNICovCisJCWxsZS0+c3RhdGUgPSBHUFJTX0xMU19BU1NJR05FRF9BRE07CisJCWJyZWFrOworCWNhc2UgR1BSU19MTENfVUE6IC8qIFNlY3Rpb24gNi40LjEuMyAqLworCQlpZiAobGxlLT5zdGF0ZSA9PSBHUFJTX0xMU19MT0NBTF9FU1QpCisJCQlsbGUtPnN0YXRlID0gR1BSU19MTFNfQUJNOworCQlicmVhazsKKwljYXNlIEdQUlNfTExDX0RNOiAvKiBTZWN0aW9uIDYuNC4xLjQ6IEFCTSBjYW5ub3QgYmUgcGVyZm9ybWVkICovCisJCWlmIChsbGUtPnN0YXRlID09IEdQUlNfTExTX0xPQ0FMX0VTVCkKKwkJCWxsZS0+c3RhdGUgPSBHUFJTX0xMU19BU1NJR05FRF9BRE07CisJCWJyZWFrOworCWNhc2UgR1BSU19MTENfRlJNUjogLyogU2VjdGlvbiA2LjQuMS41ICovCisJCWJyZWFrOworCWNhc2UgR1BSU19MTENfWElEOiAvKiBTZWN0aW9uIDYuNC4xLjYgKi8KKwkJLyogRklYTUU6IGltcGxlbWVudCBYSUQgbmVnb3RpYXRpb24gdXNpbmcgU05EQ1AgKi8KKwkJeworCQkJc3RydWN0IG1zZ2IgKnJlc3A7CisJCQl1aW50OF90ICp4aWQ7CisJCQlyZXNwID0gbXNnYl9hbGxvY19oZWFkcm9vbSg0MDk2LCAxMDI0LCAiTExDX1hJRCIpOworCQkJeGlkID0gbXNnYl9wdXQocmVzcCwgZ3BoLT5kYXRhX2xlbik7CisJCQltZW1jcHkoeGlkLCBncGgtPmRhdGEsIGdwaC0+ZGF0YV9sZW4pOworCQkJZ3Byc19sbGNfdHhfeGlkKGxsZSwgcmVzcCk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHBhcnNlIGEgR1BSUyBMTEMgaGVhZGVyLCBhbHNvIGNoZWNrIGZvciBpbnZhbGlkIGZyYW1lcyAqLworc3RhdGljIGludCBncHJzX2xsY19oZHJfcGFyc2Uoc3RydWN0IGdwcnNfbGxjX2hkcl9wYXJzZWQgKmdocCwKKwkJCSAgICAgIGNvbnN0IHVpbnQ4X3QgKmxsY19oZHIsIGludCBsZW4pCit7CisJdWludDhfdCAqY3RybCA9IGxsY19oZHIrMTsKKwlpbnQgaXNfc2FjayA9IDA7CisJdW5zaWduZWQgaW50IGNyY19sZW5ndGg7CisJdWludDMyX3QgZmNzX2NhbGM7CisKKwlpZiAobGVuIDw9IENSQzI0X0xFTkdUSCkKKwkJcmV0dXJuIC1FSU87CisKKwljcmNfbGVuZ3RoID0gbGVuIC0gQ1JDMjRfTEVOR1RIOworCisJZ2hwLT5hY2tfcmVxID0gMDsKKworCS8qIFNlY3Rpb24gNS41OiBGQ1MgKi8KKwlnaHAtPmZjcyA9ICoobGxjX2hkciArIGxlbiAtIDMpOworCWdocC0+ZmNzIHw9ICoobGxjX2hkciArIGxlbiAtIDIpIDw8IDg7CisJZ2hwLT5mY3MgfD0gKihsbGNfaGRyICsgbGVuIC0gMSkgPDwgMTY7CisKKwkvKiBTZWN0aW9uIDYuMi4xOiBpbnZhbGlkIFBEIGZpZWxkICovCisJaWYgKGxsY19oZHJbMF0gJiAweDgwKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIFRoaXMgb25seSB3b3JrcyBmb3IgdGhlIE1TLT5TR1NOIGRpcmVjdGlvbiAqLworCWlmIChsbGNfaGRyWzBdICYgMHg0MCkKKwkJZ2hwLT5pc19jbWQgPSAwOworCWVsc2UKKwkJZ2hwLT5pc19jbWQgPSAxOworCisJZ2hwLT5zYXBpID0gbGxjX2hkclswXSAmIDB4ZjsKKworCS8qIFNlY3Rpb24gNi4yLjM6IGNoZWNrIGZvciByZXNlcnZlZCBTQVBJICovCisJc3dpdGNoIChnaHAtPnNhcGkpIHsKKwljYXNlIDA6CisJY2FzZSA0OgorCWNhc2UgNjoKKwljYXNlIDB4YToKKwljYXNlIDB4YzoKKwljYXNlIDB4ZDoKKwljYXNlIDB4ZjoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKChjdHJsWzBdICYgMHg4MCkgPT0gMCkgeworCQkvKiBJIChJbmZvcm1hdGlvbiB0cmFuc2ZlciArIFN1cGVydmlzb3J5KSBmb3JtYXQgKi8KKwkJdWludDhfdCBrOworCisJCWdocC0+ZGF0YSA9IGN0cmwgKyAzOworCisJCWlmIChjdHJsWzBdICYgMHg0MCkKKwkJCWdocC0+YWNrX3JlcSA9IDE7CisKKwkJZ2hwLT5zZXFfdHggID0gKGN0cmxbMF0gJiAweDFmKSA8PCA0OworCQlnaHAtPnNlcV90eCB8PSAoY3RybFsxXSA+PiA0KTsKKworCQlnaHAtPnNlcV9yeCAgPSAoY3RybFsxXSAmIDB4NykgPDwgNjsKKwkJZ2hwLT5zZXFfcnggfD0gKGN0cmxbMl0gPj4gMik7CisKKwkJc3dpdGNoIChjdHJsWzJdICYgMHgwMykgeworCQljYXNlIDA6CisJCQlnaHAtPmNtZCA9IEdQUlNfTExDX1JSOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWdocC0+Y21kID0gR1BSU19MTENfQUNLOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWdocC0+Y21kID0gR1BSU19MTENfUk5SOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWdocC0+Y21kID0gR1BSU19MTENfU0FDSzsKKwkJCWsgPSBjdHJsWzNdICYgMHgxZjsKKwkJCWdocC0+ZGF0YSArPSAxICsgazsKKwkJCWJyZWFrOworCQl9CisJCWdocC0+ZGF0YV9sZW4gPSAobGxjX2hkciArIGxlbiAtIDMpIC0gZ2hwLT5kYXRhOworCX0gZWxzZSBpZiAoKGN0cmxbMF0gJiAweGMwKSA9PSAweDgwKSB7CisJCS8qIFMgKFN1cGVydmlzb3J5KSBmb3JtYXQgKi8KKwkJZ2hwLT5kYXRhID0gTlVMTDsKKwkJZ2hwLT5kYXRhX2xlbiA9IDA7CisKKwkJaWYgKGN0cmxbMF0gJiAweDIwKQorCQkJZ2hwLT5hY2tfcmVxID0gMTsKKwkJZ2hwLT5zZXFfcnggID0gKGN0cmxbMF0gJiAweDcpIDw8IDY7CisJCWdocC0+c2VxX3J4IHw9IChjdHJsWzFdID4+IDIpOworCisJCXN3aXRjaCAoY3RybFsxXSAmIDB4MDMpIHsKKwkJY2FzZSAwOgorCQkJZ2hwLT5jbWQgPSBHUFJTX0xMQ19SUjsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlnaHAtPmNtZCA9IEdQUlNfTExDX0FDSzsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlnaHAtPmNtZCA9IEdQUlNfTExDX1JOUjsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlnaHAtPmNtZCA9IEdQUlNfTExDX1NBQ0s7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSBpZiAoKGN0cmxbMF0gJiAweGUwKSA9PSAweGMwKSB7CisJCS8qIFVJIChVbmNvbmZpcm1lZCBJbmZvcmFtdGlvbikgZm9ybWF0ICovCisJCWdocC0+ZGF0YSA9IGN0cmwgKyAyOworCQlnaHAtPmRhdGFfbGVuID0gKGxsY19oZHIgKyBsZW4gLSAzKSAtIGdocC0+ZGF0YTsKKworCQlnaHAtPnNlcV90eCAgPSAoY3RybFswXSAmIDB4NykgPDwgNjsKKwkJZ2hwLT5zZXFfdHggfD0gKGN0cmxbMV0gPj4gMik7CisJCWlmIChjdHJsWzFdICYgMHgwMikgeworCQkJZ2hwLT5pc19lbmNyeXB0ZWQgPSAxOworCQkJLyogRklYTUU6IGVuY3J5cHRpb24gKi8KKwkJfQorCQlpZiAoY3RybFsxXSAmIDB4MDEpIHsKKwkJCS8qIEZDUyBvdmVyIGhkciArIGFsbCBpbmYgZmllbGRzICovCisJCX0gZWxzZSB7CisJCQkvKiBGQ1Mgb3ZlciBoZHIgKyBOMjAyIG9jdGV0cyAoNCkgKi8KKwkJCWlmIChjcmNfbGVuZ3RoID4gVUlfSERSX0xFTiArIE4yMDIpCisJCQkJY3JjX2xlbmd0aCA9IFVJX0hEUl9MRU4gKyBOMjAyOworCQl9CisJfSBlbHNlIHsKKwkJLyogVSAoVW5udW1iZXJlZCkgZm9ybWF0OiAxIDEgMSBQL0YgTTQgTTMgTTIgTTEgKi8KKwkJZ2hwLT5kYXRhID0gTlVMTDsKKwkJZ2hwLT5kYXRhX2xlbiA9IDA7CisKKwkJc3dpdGNoIChjdHJsWzBdICYgMHhmKSB7CisJCWNhc2UgR1BSU19MTENfVV9OVUxMX0NNRDoKKwkJCWdocC0+Y21kID0gR1BSU19MTENfTlVMTDsKKwkJCWJyZWFrOworCQljYXNlIEdQUlNfTExDX1VfRE1fUkVTUDoKKwkJCWdocC0+Y21kID0gR1BSU19MTENfRE07CisJCQlicmVhazsKKwkJY2FzZSBHUFJTX0xMQ19VX0RJU0NfQ01EOgorCQkJZ2hwLT5jbWQgPSBHUFJTX0xMQ19ESVNDOworCQkJYnJlYWs7CisJCWNhc2UgR1BSU19MTENfVV9VQV9SRVNQOgorCQkJZ2hwLT5jbWQgPSBHUFJTX0xMQ19VQTsKKwkJCWJyZWFrOworCQljYXNlIEdQUlNfTExDX1VfU0FCTV9DTUQ6CisJCQlnaHAtPmNtZCA9IEdQUlNfTExDX1NBQk07CisJCQlicmVhazsKKwkJY2FzZSBHUFJTX0xMQ19VX0ZSTVJfUkVTUDoKKwkJCWdocC0+Y21kID0gR1BSU19MTENfRlJNUjsKKwkJCWJyZWFrOworCQljYXNlIEdQUlNfTExDX1VfWElEOgorCQkJZ2hwLT5jbWQgPSBHUFJTX0xMQ19YSUQ7CisJCQlnaHAtPmRhdGEgPSBjdHJsICsgMTsKKwkJCWdocC0+ZGF0YV9sZW4gPSAobGxjX2hkciArIGxlbiAtIDMpIC0gZ2hwLT5kYXRhOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKworCS8qIGNhbGN1bGF0ZSB3aGF0IEZDUyB3ZSBleHBlY3QgKi8KKwlnaHAtPmZjc19jYWxjID0gZ3Byc19sbGNfZmNzKGxsY19oZHIsIGNyY19sZW5ndGgpOworCisJLyogRklYTUU6IHBhcnNlIHNhY2sgZnJhbWUgKi8KK30KKworLyogcmVjZWl2ZSBhbiBpbmNvbWluZyBMTEMgUERVIChCU1NHUC1VTC1VTklUREFUQS1JTkQsIDcuMi40LjIpICovCitpbnQgZ3Byc19sbGNfcmN2bXNnKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCB0bHZfcGFyc2VkICp0dikKK3sKKwlzdHJ1Y3QgYnNzZ3BfdWRfaGRyICp1ZGggPSAoc3RydWN0IGJzc2dwX3VkX2hkciAqKSBtc2diX2Jzc2dwaChtc2cpOworCXN0cnVjdCBncHJzX2xsY19oZHIgKmxoID0gbXNnYl9sbGNoKG1zZyk7CisJc3RydWN0IGdwcnNfbGxjX2hkcl9wYXJzZWQgbGxocDsKKwlzdHJ1Y3QgZ3Byc19sbGNfbGxlICpsbGU7CisJaW50IHJjID0gMDsKKworCS8qIElkZW50aWZpZXJzIGZyb20gRE9XTjogTlNFSSwgQlZDSSwgVExMSSAqLworCisJcmMgPSBncHJzX2xsY19oZHJfcGFyc2UoJmxsaHAsIGxoLCBUTFZQX0xFTih0diwgQlNTR1BfSUVfTExDX1BEVSkpOworCS8qIEZJWE1FICovCisKKwlncHJzX2xsY19oZHJfZHVtcCgmbGxocCk7CisKKwkvKiBmaW5kIHRoZSBMTEMgRW50aXR5IGZvciB0aGlzIFRMTEkrU0FQSSB0dXBsZSAqLworCWxsZSA9IGxsZV9ieV90bGxpX3NhcGkobXNnYl90bGxpKG1zZyksIGxsaHAuc2FwaSk7CisJLyogYWxsb2NhdGUgYSBuZXcgTExFIGlmIG5lZWRlZCAqLworCWlmICghbGxlKQorCQlsbGUgPSBsbGVfYWxsb2MobXNnYl90bGxpKG1zZyksIGxsaHAuc2FwaSk7CisKKwkvKiBVcGRhdGUgTExFJ3MgKEJWQ0ksIE5TRUkpIHR1cGxlICovCisJbGxlLT5idmNpID0gbXNnYl9idmNpKG1zZyk7CisJbGxlLT5uc2VpID0gbXNnYl9uc2VpKG1zZyk7CisKKwlyYyA9IGdwcnNfbGxjX2hkcl9yeCgmbGxocCwgbGxlKTsKKwkvKiBGSVhNRSAqLworCisJaWYgKGxsaHAuZGF0YSkgeworCQltc2diX2dtbWgobXNnKSA9IGxsaHAuZGF0YTsKKwkJc3dpdGNoIChsbGhwLnNhcGkpIHsKKwkJY2FzZSBHUFJTX1NBUElfR01NOgorCQkJcmMgPSBnc20wNDA4X2dwcnNfcmN2bXNnKG1zZyk7CisJCQlicmVhazsKKwkJY2FzZSBHUFJTX1NBUElfVE9NMjoKKwkJY2FzZSBHUFJTX1NBUElfVE9NODoKKwkJCS8qIEZJWE1FICovCisJCWNhc2UgR1BSU19TQVBJX1NORENQMzoKKwkJY2FzZSBHUFJTX1NBUElfU05EQ1A1OgorCQljYXNlIEdQUlNfU0FQSV9TTkRDUDk6CisJCWNhc2UgR1BSU19TQVBJX1NORENQMTE6CisJCQkvKiBGSVhNRSAqLworCQljYXNlIEdQUlNfU0FQSV9TTVM6CisJCQkvKiBGSVhNRSAqLworCQlkZWZhdWx0OgorCQkJTE9HUChER1BSUywgTE9HTF9OT1RJQ0UsICJVbnN1cHBvcnRlZCBTQVBJICV1XG4iLCBsbGhwLnNhcGkpOworCQkJcmMgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ncHJzL2dwcnNfbnMuYyBiL29wZW5ic2Mvc3JjL2dwcnMvZ3Byc19ucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkOWJiODkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ncHJzL2dwcnNfbnMuYwpAQCAtMCwwICsxLDY0NCBAQAorLyogR1BSUyBOZXR3b3JrcyBTZXJ2aWNlIChOUykgbWVzc2FnZXMgb24gdGhlIEdiIGludGVyZmFjZWJ2Y2kgPSBtc2diX2J2Y2kobXNnKTsKKyAqIDNHUFAgVFMgMDguMTYgdmVyc2lvbiA4LjAuMSBSZWxlYXNlIDE5OTkgLyBFVFNJIFRTIDEwMSAyOTkgVjguMC4xICgyMDAyLTA1KSAqLworCisvKiAoQykgMjAwOS0yMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKy8qIFNvbWUgaW50cm9kdWN0aW9uIGludG8gTlM6ICBOUyBpcyB1c2VkIHR5cGljYWxseSBvbiB0b3Agb2YgZnJhbWUgcmVsYXksCisgKiBidXQgaW4gdGhlIGlwLmFjY2VzcyB3b3JsZCBpdCBpcyBlbmNhcHN1bGF0ZWQgaW4gVURQIHBhY2tldHMuICBJdCBzZXJ2ZXMKKyAqIGFzIGFuIGludGVybWVkaWF0ZSBzaGltIGJldHdlbiBCU1NHUCBhbmQgdGhlIHVuZGVybHlpbmcgbWVkaXVtLiAgSXQgZG9lc24ndAorICogZG8gbXVjaCwgYXBhcnQgZnJvbSBwcm92aWRpbmcgY29uZ2VzdGlvbiBub3RpZmljYXRpb24gYW5kIHN0YXR1cyBpbmRpY2F0aW9uLgorICoKKyAqIFRlcm1zOgorICogCU5TCQlOZXR3b3JrIFNlcnZpY2UKKyAqCU5TVkMJCU5TIFZpcnR1YWwgQ29ubmVjdGlvbgorICoJTlNFSQkJTlMgRW50aXR5IElkZW50aWZpZXIKKyAqCU5TVkwJCU5TIFZpcnR1YWwgTGluaworICoJTlNWTEkJCU5TIFZpcnR1YWwgTGluayBJZGVudGlmaWVyCisgKglCVkMJCUJTU0dQIFZpcnR1YWwgQ29ubmVjdGlvbgorICoJQlZDSQkJQlNTR1AgVmlydHVhbCBDb25uZWN0aW9uIElkZW50aWZpZXIKKyAqCU5TVkNHCQlOUyBWaXJ0dWFsIENvbm5lY3Rpb24gR291cAorICoJQmxvY2tlZAkJTlMtVkMgY2Fubm90IGJlIHVzZWQgZm9yIHVzZXIgdHJhZmZpYworICoJQWxpdmUJCUFiaWxpdHkgb2YgYSBOUy1WQyB0byBwcm92aWRlIGNvbW11bmljYXRpb24KKyAqCisgKiAgVGhlcmUgY2FuIGJlIG11bHRpcGxlIEJTU0dQIHZpcnR1YWwgY29ubmVjdGlvbnMgb3ZlciBvbmUgKGdyb3VwIG9mKSBOU1ZDJ3MuICBCU1NHUCB3aWxsCisgKiB0aGVyZWZvcmUgaWRlbnRpZnkgdGhlIEJTU0dQIHZpcnR1YWwgY29ubmVjdGlvbiBieSBhIEJWQ0kgcGFzc2VkIGRvd24gdG8gTlMuCisgKiBOUyB0aGVuIGhhcyB0byBmaXJndXJlIG91dCB3aGljaCBOU1ZDJ3MgYXJlIHJlc3BvbnNpYmxlIGZvciB0aGlzIEJWQ0kuCisgKiBUaG9zZSBtYXBwaW5ncyBhcmUgYWRtaW5pc3RyYXRpdmVseSBjb25maWd1cmVkLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfbnMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfYnNzZ3AuaD4KKworI2RlZmluZSBOU19BTExPQ19TSVpFCTEwMjQKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0bHZfZGVmaW5pdGlvbiBuc19hdHRfdGx2ZGVmID0geworCS5kZWYgPSB7CisJCVtOU19JRV9DQVVTRV0JPSB7IFRMVl9UWVBFX1R2TFYsIDAgfSwKKwkJW05TX0lFX1ZDSV0JPSB7IFRMVl9UWVBFX1R2TFYsIDAgfSwKKwkJW05TX0lFX1BEVV0JPSB7IFRMVl9UWVBFX1R2TFYsIDAgfSwKKwkJW05TX0lFX0JWQ0ldCT0geyBUTFZfVFlQRV9UdkxWLCAwIH0sCisJCVtOU19JRV9OU0VJXQk9IHsgVExWX1RZUEVfVHZMViwgMCB9LAorCX0sCit9OworCisvKiBMb29rdXAgc3RydWN0IGdwcnNfbnN2YyBiYXNlZCBvbiBOU1ZDSSAqLworc3RhdGljIHN0cnVjdCBncHJzX25zdmMgKm5zdmNfYnlfbnN2Y2koc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpLAorCQkJCQl1aW50MTZfdCBuc3ZjaSkKK3sKKwlzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjOworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KG5zdmMsICZuc2ktPmdwcnNfbnN2Y3MsIGxpc3QpIHsKKwkJaWYgKG5zdmMtPm5zdmNpID09IG5zdmNpKQorCQkJcmV0dXJuIG5zdmM7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiBMb29rdXAgc3RydWN0IGdwcnNfbnN2YyBiYXNlZCBvbiBOU1ZDSSAqLworc3RhdGljIHN0cnVjdCBncHJzX25zdmMgKm5zdmNfYnlfbnNlaShzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2ksCisJCQkJCXVpbnQxNl90IG5zZWkpCit7CisJc3RydWN0IGdwcnNfbnN2YyAqbnN2YzsKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShuc3ZjLCAmbnNpLT5ncHJzX25zdmNzLCBsaXN0KSB7CisJCWlmIChuc3ZjLT5uc2VpID09IG5zZWkpCisJCQlyZXR1cm4gbnN2YzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKworLyogTG9va3VwIHN0cnVjdCBncHJzX25zdmMgYmFzZWQgb24gcmVtb3RlIHBlZXIgc29ja2V0IGFkZHIgKi8KK3N0YXRpYyBzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjX2J5X3JlbV9hZGRyKHN0cnVjdCBncHJzX25zX2luc3QgKm5zaSwKKwkJCQkJICBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbikKK3sKKwlzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjOworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KG5zdmMsICZuc2ktPmdwcnNfbnN2Y3MsIGxpc3QpIHsKKwkJaWYgKCFtZW1jbXAoJm5zdmMtPmlwLmJ0c19hZGRyLCBzaW4sIHNpemVvZigqc2luKSkpCisJCQlyZXR1cm4gbnN2YzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGdwcnNfbnNfdGltZXJfY2Iodm9pZCAqZGF0YSk7CisKK3N0YXRpYyBzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjX2NyZWF0ZShzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2ksIHVpbnQxNl90IG5zdmNpKQoreworCXN0cnVjdCBncHJzX25zdmMgKm5zdmM7CisKKwluc3ZjID0gdGFsbG9jX3plcm8obnNpLCBzdHJ1Y3QgZ3Byc19uc3ZjKTsKKwluc3ZjLT5uc3ZjaSA9IG5zdmNpOworCS8qIGJlZm9yZSBSRVNFVCBwcm9jZWR1cmU6IEJMT0NLRUQgYW5kIERFQUQgKi8KKwluc3ZjLT5zdGF0ZSA9IE5TRV9TX0JMT0NLRUQ7CisJbnN2Yy0+bnNpID0gbnNpOworCW5zdmMtPnRpbWVyLmNiID0gZ3Byc19uc190aW1lcl9jYjsKKwluc3ZjLT50aW1lci5kYXRhID0gbnN2YzsKKworCWxsaXN0X2FkZCgmbnN2Yy0+bGlzdCwgJm5zaS0+Z3Byc19uc3Zjcyk7CisKKwlyZXR1cm4gbnN2YzsKK30KKworLyogU2VjdGlvbiAxMC4zLjIsIFRhYmxlIDEzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBuc19jYXVzZV9zdHJbXSA9IHsKKwl7IE5TX0NBVVNFX1RSQU5TSVRfRkFJTCwJIlRyYW5zaXQgbmV0d29yayBmYWlsdXJlIiB9LAorCXsgTlNfQ0FVU0VfT01fSU5URVJWRU5USU9OLCAJIk8mTSBpbnRlcnZlbnRpb24iIH0sCisJeyBOU19DQVVTRV9FUVVJUF9GQUlMLAkJIkVxdWlwbWVudCBmYWlsdXJlIiB9LAorCXsgTlNfQ0FVU0VfTlNWQ19CTE9DS0VELAkiTlMtVkMgYmxvY2tlZCIgfSwKKwl7IE5TX0NBVVNFX05TVkNfVU5LTk9XTiwJIk5TLVZDIHVua25vd24iIH0sCisJeyBOU19DQVVTRV9CVkNJX1VOS05PV04sCSJCVkNJIHVua25vd24iIH0sCisJeyBOU19DQVVTRV9TRU1fSU5DT1JSX1BEVSwJIlNlbWFudGljYWxseSBpbmNvcnJlY3QgUERVIiB9LAorCXsgTlNfQ0FVU0VfUERVX0lOQ09NUF9QU1RBVEUsCSJQRFUgbm90IGNvbXBhdGlibGUgd2l0aCBwcm90b2NvbCBzdGF0ZSIgfSwKKwl7IE5TX0NBVVNFX1BST1RPX0VSUl9VTlNQRUMsCSJQcm90b2NvbCBlcnJvciwgdW5zcGVjaWZpZWQiIH0sCisJeyBOU19DQVVTRV9JTlZBTF9FU1NFTlRfSUUsCSJJbnZhbGlkIGVzc2VudGlhbCBJRSIgfSwKKwl7IE5TX0NBVVNFX01JU1NJTkdfRVNTRU5UX0lFLAkiTWlzc2luZyBlc3NlbnRpYWwgSUUiIH0sCisJeyAwLCBOVUxMIH0KK307CisKK2NvbnN0IGNoYXIgKmdwcnNfbnNfY2F1c2Vfc3RyKGVudW0gbnNfY2F1c2UgY2F1c2UpCit7CisJcmV0dXJuIGdldF92YWx1ZV9zdHJpbmcobnNfY2F1c2Vfc3RyLCBjYXVzZSk7Cit9CisKK3N0YXRpYyBpbnQgbnNpcF9zZW5kbXNnKHN0cnVjdCBncHJzX25zdmMgKm5zdmMsIHN0cnVjdCBtc2diICptc2cpOworCitzdGF0aWMgaW50IGdwcnNfbnNfdHgoc3RydWN0IGdwcnNfbnN2YyAqbnN2Yywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlpbnQgcmV0OworCisJc3dpdGNoIChuc3ZjLT5uc2ktPmxsKSB7CisJY2FzZSBHUFJTX05TX0xMX1VEUDoKKwkJcmV0ID0gbnNpcF9zZW5kbXNnKG5zdmMsIG1zZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoREdQUlMsIExPR0xfRVJST1IsICJ1bnN1cHBvcnRlZCBOUyBsaW5rbGF5ZXIgJXVcbiIsIG5zdmMtPm5zaS0+bGwpOworCQltc2diX2ZyZWUobXNnKTsKKwkJcmV0ID0gLUVJTzsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ3Byc19uc190eF9zaW1wbGUoc3RydWN0IGdwcnNfbnN2YyAqbnN2YywgdWludDhfdCBwZHVfdHlwZSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9hbGxvYyhOU19BTExPQ19TSVpFLCAiR1BSUy9OUyIpOworCXN0cnVjdCBncHJzX25zX2hkciAqbnNoOworCisJaWYgKCFtc2cpCisJCXJldHVybiAtRU5PTUVNOworCisJbnNoID0gKHN0cnVjdCBncHJzX25zX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqbnNoKSk7CisKKwluc2gtPnBkdV90eXBlID0gcGR1X3R5cGU7CisKKwlyZXR1cm4gZ3Byc19uc190eChuc3ZjLCBtc2cpOworfQorCitzdGF0aWMgaW50IGdwcnNfbnNfdHhfcmVzZXQoc3RydWN0IGdwcnNfbnN2YyAqbnN2YywgdWludDhfdCBjYXVzZSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9hbGxvYyhOU19BTExPQ19TSVpFLCAiR1BSUy9OUyIpOworCXN0cnVjdCBncHJzX25zX2hkciAqbnNoOworCXVpbnQxNl90IG5zdmNpID0gaHRvbnMobnN2Yy0+bnN2Y2kpOworCXVpbnQxNl90IG5zZWkgPSBodG9ucyhuc3ZjLT5uc2VpKTsKKworCWlmICghbXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW5zaCA9IChzdHJ1Y3QgZ3Byc19uc19oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKm5zaCkpOworCW5zaC0+cGR1X3R5cGUgPSBOU19QRFVUX1JFU0VUOworCisJbXNnYl90dmx2X3B1dChtc2csIE5TX0lFX0NBVVNFLCAxLCAmY2F1c2UpOworCW1zZ2JfdHZsdl9wdXQobXNnLCBOU19JRV9WQ0ksIDIsICh1aW50OF90ICopICZuc3ZjaSk7CisJbXNnYl90dmx2X3B1dChtc2csIE5TX0lFX05TRUksIDIsICh1aW50OF90ICopICZuc2VpKTsKKworCXJldHVybiBncHJzX25zX3R4KG5zdmMsIG1zZyk7CisKK30KKworI2RlZmluZSBOU19BTElWRV9SRVRSSUVTICAxMAkvKiBhZnRlciAzIGZhaWxlZCByZXRyYW5zbWl0IHdlIGRlY2xhcmUgQlRTIGFzIGRlYWQgKi8KKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdGltZXJfbW9kZV90b3V0W19OU1ZDX1RJTUVSX05SXSA9IHsKKwlbTlNWQ19USU1FUl9UTlNfUkVTRVRdCT0gNjAsCisJW05TVkNfVElNRVJfVE5TX0FMSVZFXQk9IDMsCisJW05TVkNfVElNRVJfVE5TX1RFU1RdCT0gMzAsCit9OworCitzdGF0aWMgdm9pZCBuc3ZjX3N0YXJ0X3RpbWVyKHN0cnVjdCBncHJzX25zdmMgKm5zdmMsIGVudW0gbnN2Y190aW1lcl9tb2RlIG1vZGUpCit7CisJbnN2Yy0+YWxpdmVfcmV0cmllcyA9IDA7CisKKwlpZiAoYnNjX3RpbWVyX3BlbmRpbmcoJm5zdmMtPnRpbWVyKSkKKwkJYnNjX2RlbF90aW1lcigmbnN2Yy0+dGltZXIpOworCisJbnN2Yy0+dGltZXJfbW9kZSA9IG1vZGU7CisJYnNjX3NjaGVkdWxlX3RpbWVyKCZuc3ZjLT50aW1lciwgdGltZXJfbW9kZV90b3V0W21vZGVdLCAwKTsKK30KKworc3RhdGljIHZvaWQgZ3Byc19uc190aW1lcl9jYih2b2lkICpkYXRhKQoreworCXN0cnVjdCBncHJzX25zdmMgKm5zdmMgPSBkYXRhOworCisJc3dpdGNoIChuc3ZjLT50aW1lcl9tb2RlKSB7CisJY2FzZSBOU1ZDX1RJTUVSX1ROU19BTElWRToKKwkJLyogVG5zLWFsaXZlIGNhc2U6IHdlIGV4cGlyZWQgd2l0aG91dCByZXNwb25zZSAhICovCisJCW5zdmMtPmFsaXZlX3JldHJpZXMrKzsKKwkJaWYgKG5zdmMtPmFsaXZlX3JldHJpZXMgPiBOU19BTElWRV9SRVRSSUVTKSB7CisJCQkvKiBtYXJrIGFzIGRlYWQgYW5kIGJsb2NrZWQgKi8KKwkJCW5zdmMtPnN0YXRlID0gTlNFX1NfQkxPQ0tFRDsKKwkJCURFQlVHUChER1BSUywgIk5TRUk9JXUgVG5zLWFsaXZlIGV4cGlyZWQgbW9yZSB0aGVuICIKKwkJCQkiJXUgdGltZXMsIGJsb2NraW5nIE5TLVZDXG4iLCBuc3ZjLT5uc2VpLAorCQkJCU5TX0FMSVZFX1JFVFJJRVMpOworCQkJLyogRklYTUU6IGluZm9ybSBoaWdoZXIgbGF5ZXJzICovCisJCQlyZXR1cm47CisJCX0KKwkJbnN2Y19zdGFydF90aW1lcihuc3ZjLCBOU1ZDX1RJTUVSX1ROU19BTElWRSk7CisJCWJyZWFrOworCWNhc2UgTlNWQ19USU1FUl9UTlNfVEVTVDoKKwkJLyogVG5zLXRlc3QgY2FzZTogc2VuZCBOUy1BTElWRSBQRFUgKi8KKwkJZ3Byc19uc190eF9zaW1wbGUobnN2YywgTlNfUERVVF9BTElWRSk7CisJCS8qIHN0YXJ0IFRucy1hbGl2ZSB0aW1lciAqLworCQluc3ZjX3N0YXJ0X3RpbWVyKG5zdmMsIE5TVkNfVElNRVJfVE5TX0FMSVZFKTsKKwkJYnJlYWs7CisJY2FzZSBOU1ZDX1RJTUVSX1ROU19SRVNFVDoKKwkJLyogQ2hhcHRlciA3LjM6IFJlLXNlbmQgdGhlIFJFU0VUICovCisJCWdwcnNfbnNfdHhfcmVzZXQobnN2YywgTlNfQ0FVU0VfT01fSU5URVJWRU5USU9OKTsKKwkJbnN2Y19zdGFydF90aW1lcihuc3ZjLCBOU1ZDX1RJTUVSX1ROU19SRVNFVCk7CisJCWJyZWFrOworCX0KK30KKworLyogU2VjdGlvbiA5LjIuNiAqLworc3RhdGljIGludCBncHJzX25zX3R4X3Jlc2V0X2FjayhzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjKQoreworCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jKE5TX0FMTE9DX1NJWkUsICJHUFJTL05TIik7CisJc3RydWN0IGdwcnNfbnNfaGRyICpuc2g7CisJdWludDE2X3QgbnN2Y2ksIG5zZWk7CisKKwlpZiAoIW1zZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwluc3ZjaSA9IGh0b25zKG5zdmMtPm5zdmNpKTsKKwluc2VpID0gaHRvbnMobnN2Yy0+bnNlaSk7CisKKwluc2ggPSAoc3RydWN0IGdwcnNfbnNfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpuc2gpKTsKKworCW5zaC0+cGR1X3R5cGUgPSBOU19QRFVUX1JFU0VUX0FDSzsKKworCURFQlVHUChER1BSUywgIk5TRUk9JXUgVHggTlMgUkVTRVQgQUNLIChOU1ZDST0ldSlcbiIsCisJCW5zdmMtPm5zZWksIG5zdmMtPm5zdmNpKTsKKworCW1zZ2JfdHZsdl9wdXQobXNnLCBOU19JRV9WQ0ksIDIsICh1aW50OF90ICopJm5zdmNpKTsKKwltc2diX3R2bHZfcHV0KG1zZywgTlNfSUVfTlNFSSwgMiwgKHVpbnQ4X3QgKikmbnNlaSk7CisKKwlyZXR1cm4gZ3Byc19uc190eChuc3ZjLCBtc2cpOworfQorCisvKiBTZWN0aW9uIDkuMi4xMDogdHJhbnNtaXQgc2lkZSAvIE5TLVVOSVREQVRBLVJFUVVFU1QgcHJpbWl0aXZlICovCitpbnQgZ3Byc19uc19zZW5kbXNnKHN0cnVjdCBncHJzX25zX2luc3QgKm5zaSwgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjOworCXN0cnVjdCBncHJzX25zX2hkciAqbnNoOworCXVpbnQxNl90IGJ2Y2kgPSBtc2diX2J2Y2kobXNnKTsKKworCW5zdmMgPSBuc3ZjX2J5X25zZWkobnNpLCBtc2diX25zZWkobXNnKSk7CisJaWYgKCFuc3ZjKSB7CisJCUxPR1AoREdQUlMsIExPR0xfRVJST1IsICJVbmFibGUgdG8gcmVzb2x2ZSBOU0VJICV1ICIKKwkJCSJ0byBOUy1WQyFcbiIsIG1zZ2JfbnNlaShtc2cpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCEobnN2Yy0+c3RhdGUgJiBOU0VfU19BTElWRSkpIHsKKwkJTE9HUChER1BSUywgTE9HTF9FUlJPUiwgIk5TRUk9JXUgaXMgbm90IGFsaXZlLCBjYW5ub3Qgc2VuZFxuIiwKKwkJCW5zdmMtPm5zZWkpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlpZiAobnN2Yy0+c3RhdGUgJiBOU0VfU19CTE9DS0VEKSB7CisJCUxPR1AoREdQUlMsIExPR0xfRVJST1IsICJOU0VJPSV1IGlzIGJsb2NrZWQsIGNhbm5vdCBzZW5kXG4iLAorCQkJbnN2Yy0+bnNlaSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJbnNoID0gKHN0cnVjdCBncHJzX25zX2hkciAqKSBtc2diX3B1c2gobXNnLCBzaXplb2YoKm5zaCkgKyAzKTsKKwlpZiAoIW5zaCkgeworCQlMT0dQKERHUFJTLCBMT0dMX0VSUk9SLCAiTm90IGVub3VnaCBoZWFkcm9vbSBmb3IgTlMgaGVhZGVyXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJbnNoLT5wZHVfdHlwZSA9IE5TX1BEVVRfVU5JVERBVEE7CisJLyogc3BhcmUgb2N0ZXQgaW4gZGF0YVswXSAqLworCW5zaC0+ZGF0YVsxXSA9IGJ2Y2kgPj4gODsKKwluc2gtPmRhdGFbMl0gPSBidmNpICYgMHhmZjsKKworCXJldHVybiBncHJzX25zX3R4KG5zdmMsIG1zZyk7Cit9CisKKy8qIFNlY3Rpb24gOS4yLjEwOiByZWNlaXZlIHNpZGUgKi8KK3N0YXRpYyBpbnQgZ3Byc19uc19yeF91bml0ZGF0YShzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBncHJzX25zX2hkciAqbnNoID0gKHN0cnVjdCBncHJzX25zX2hkciAqKW1zZy0+bDJoOworCXVpbnQxNl90IGJ2Y2k7CisKKwkvKiBzcGFyZSBvY3RldCBpbiBkYXRhWzBdICovCisJYnZjaSA9IG5zaC0+ZGF0YVsxXSA8PCA4IHwgbnNoLT5kYXRhWzJdOworCW1zZ2JfYnNzZ3BoKG1zZykgPSAmbnNoLT5kYXRhWzNdOworCW1zZ2JfYnZjaShtc2cpID0gYnZjaTsKKworCS8qIGNhbGwgdXBwZXIgbGF5ZXIgKEJTU0dQKSAqLworCXJldHVybiBuc3ZjLT5uc2ktPmNiKEdQUlNfTlNfRVZUX1VOSVRfREFUQSwgbnN2YywgbXNnLCBidmNpKTsKK30KKworLyogU2VjdGlvbiA5LjIuNyAqLworc3RhdGljIGludCBncHJzX25zX3J4X3N0YXR1cyhzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBncHJzX25zX2hkciAqbnNoID0gKHN0cnVjdCBncHJzX25zX2hkciAqKSBtc2ctPmwyaDsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwl1aW50OF90IGNhdXNlOworCWludCByYzsKKworCURFQlVHUChER1BSUywgIk5TRUk9JXUgTlMgU1RBVFVTICIsIG5zdmMtPm5zZWkpOworCisJcmMgPSB0bHZfcGFyc2UoJnRwLCAmbnNfYXR0X3RsdmRlZiwgbnNoLT5kYXRhLCBtc2diX2wybGVuKG1zZyksIDAsIDApOworCisJaWYgKCFUTFZQX1BSRVNFTlQoJnRwLCBOU19JRV9DQVVTRSkpIHsKKwkJREVCVUdQQyhER1BSUywgIm1pc3NpbmcgY2F1c2UgSUVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljYXVzZSA9ICpUTFZQX1ZBTCgmdHAsIE5TX0lFX0NBVVNFKTsKKwlERUJVR1BDKERHUFJTLCAiY2F1c2U9JXNcbiIsIGdwcnNfbnNfY2F1c2Vfc3RyKGNhdXNlKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogU2VjdGlvbiA3LjMgKi8KK3N0YXRpYyBpbnQgZ3Byc19uc19yeF9yZXNldChzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBncHJzX25zX2hkciAqbnNoID0gKHN0cnVjdCBncHJzX25zX2hkciAqKSBtc2ctPmwyaDsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwl1aW50OF90ICpjYXVzZTsKKwl1aW50MTZfdCAqbnN2Y2ksICpuc2VpOworCWludCByYzsKKworCXJjID0gdGx2X3BhcnNlKCZ0cCwgJm5zX2F0dF90bHZkZWYsIG5zaC0+ZGF0YSwgbXNnYl9sMmxlbihtc2cpLCAwLCAwKTsKKworCWlmICghVExWUF9QUkVTRU5UKCZ0cCwgTlNfSUVfQ0FVU0UpIHx8CisJICAgICFUTFZQX1BSRVNFTlQoJnRwLCBOU19JRV9WQ0kpIHx8CisJICAgICFUTFZQX1BSRVNFTlQoJnRwLCBOU19JRV9OU0VJKSkgeworCQkvKiBGSVhNRTogcmVzcG9uZCB3aXRoIE5TX0NBVVNFX01JU1NJTkdfRVNTRU5UX0lFICovCisJCUxPR1AoREdQUlMsIExPR0xfRVJST1IsICJOUyBSRVNFVCBNaXNzaW5nIG1hbmRhdG9yeSBJRVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNhdXNlID0gKHVpbnQ4X3QgKikgVExWUF9WQUwoJnRwLCBOU19JRV9DQVVTRSk7CisJbnN2Y2kgPSAodWludDE2X3QgKikgVExWUF9WQUwoJnRwLCBOU19JRV9WQ0kpOworCW5zZWkgPSAodWludDE2X3QgKikgVExWUF9WQUwoJnRwLCBOU19JRV9OU0VJKTsKKworCURFQlVHUChER1BSUywgIk5TRUk9JXUgTlMgUkVTRVQgKE5TVkNJPSV1LCBjYXVzZT0lcylcbiIsCisJCW5zdmMtPm5zdmNpLCBuc3ZjLT5uc2VpLCBncHJzX25zX2NhdXNlX3N0cigqY2F1c2UpKTsKKworCW5zdmMtPnN0YXRlID0gTlNFX1NfQkxPQ0tFRCB8IE5TRV9TX0FMSVZFOworCW5zdmMtPm5zZWkgPSBudG9ocygqbnNlaSk7CisJbnN2Yy0+bnN2Y2kgPSBudG9ocygqbnN2Y2kpOworCisJLyogbWFyayB0aGUgTlMtVkMgYXMgYmxvY2tlZCBhbmQgYWxpdmUgKi8KKwkvKiBzdGFydCB0aGUgdGVzdCBwcm9jZWR1cmUgKi8KKwluc3ZjX3N0YXJ0X3RpbWVyKG5zdmMsIE5TVkNfVElNRVJfVE5TX0FMSVZFKTsKKworCXJldHVybiBncHJzX25zX3R4X3Jlc2V0X2Fjayhuc3ZjKTsKK30KKworLyogbWFpbiBlbnRyeSBwb2ludCwgaGVyZSBpbmNvbWluZyBOUyBmcmFtZXMgZW50ZXIgKi8KK2ludCBncHJzX25zX3Jjdm1zZyhzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2ksIHN0cnVjdCBtc2diICptc2csCisJCSAgIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2FkZHIpCit7CisJc3RydWN0IGdwcnNfbnNfaGRyICpuc2ggPSAoc3RydWN0IGdwcnNfbnNfaGRyICopIG1zZy0+bDJoOworCXN0cnVjdCBncHJzX25zdmMgKm5zdmM7CisJaW50IHJjID0gMDsKKworCS8qIGxvb2sgdXAgdGhlIE5TVkMgYmFzZWQgb24gc291cmNlIGFkZHJlc3MgKi8KKwluc3ZjID0gbnN2Y19ieV9yZW1fYWRkcihuc2ksIHNhZGRyKTsKKwlpZiAoIW5zdmMpIHsKKwkJLyogT25seSB0aGUgUkVTRVQgcHJvY2VkdXJlIGNyZWF0ZXMgYSBuZXcgTlNWQyAqLworCQlpZiAobnNoLT5wZHVfdHlwZSAhPSBOU19QRFVUX1JFU0VUKSB7CisJCQlMT0dQKERHUFJTLCBMT0dMX0lORk8sICJJZ25vcmluZyBOUyBQRFUgdHlwZSAweCUweCAiCisJCQkJImZyb20gJXMgZm9yIG5vbi1leGlzdGluZyBOUy1WQ1xuIiwKKwkJCQluc2gtPnBkdV90eXBlLCBpbmV0X250b2Eoc2FkZHItPnNpbl9hZGRyKSk7CisJCQkvL2dwcnNfbnNfdHhfcmVzZXQobnN2YywgTlNfQ0FVU0VfTlNWQ19VTktOT1dOKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCUxPR1AoREdQUlMsIExPR0xfSU5GTywgIkNyZWF0aW5nIE5TLVZDIGZvciBCU1MgYXQgJXM6JXVcbiIsCisJCQlpbmV0X250b2Eoc2FkZHItPnNpbl9hZGRyKSwgbnRvaHMoc2FkZHItPnNpbl9wb3J0KSk7CisJCW5zdmMgPSBuc3ZjX2NyZWF0ZShuc2ksIDB4ZmZmZik7CisJCW5zdmMtPmlwLmJ0c19hZGRyID0gKnNhZGRyOworCX0gZWxzZQorCQltc2diX25zZWkobXNnKSA9IG5zdmMtPm5zZWk7CisKKwlzd2l0Y2ggKG5zaC0+cGR1X3R5cGUpIHsKKwljYXNlIE5TX1BEVVRfQUxJVkU6CisJCS8qIHJlbW90ZSBlbmQgaW5xdWlyZXMgd2hldGhlciB3ZSdyZSBzdGlsbCBhbGl2ZSwKKwkJICogd2UgbmVlZCB0byByZXNwb25kIHdpdGggQUxJVkVfQUNLICovCisJCXJjID0gZ3Byc19uc190eF9zaW1wbGUobnN2YywgTlNfUERVVF9BTElWRV9BQ0spOworCQlicmVhazsKKwljYXNlIE5TX1BEVVRfQUxJVkVfQUNLOgorCQkvKiBzdG9wIFRucy1hbGl2ZSAqLworCQlic2NfZGVsX3RpbWVyKCZuc3ZjLT50aW1lcik7CisJCS8qIHN0YXJ0IFRucy10ZXN0ICovCisJCW5zdmNfc3RhcnRfdGltZXIobnN2YywgTlNWQ19USU1FUl9UTlNfVEVTVCk7CisJCWlmIChuc3ZjLT5yZW1vdGVfZW5kX2lzX3Nnc24pIHsKKwkJCS8qIEZJWE1FOiB0aGlzIHNob3VsZCBiZSBvbmUgbGV2ZWwgaGlnaGVyICovCisJCQlpZiAobnN2Yy0+c3RhdGUgJiBOU0VfU19CTE9DS0VEKQorCQkJCXJjID0gZ3Byc19uc190eF9zaW1wbGUobnN2YywgTlNfUERVVF9VTkJMT0NLKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5TX1BEVVRfVU5JVERBVEE6CisJCS8qIGFjdHVhbCB1c2VyIGRhdGEgKi8KKwkJcmMgPSBncHJzX25zX3J4X3VuaXRkYXRhKG5zdmMsIG1zZyk7CisJCWJyZWFrOworCWNhc2UgTlNfUERVVF9TVEFUVVM6CisJCXJjID0gZ3Byc19uc19yeF9zdGF0dXMobnN2YywgbXNnKTsKKwkJYnJlYWs7CisJY2FzZSBOU19QRFVUX1JFU0VUOgorCQlyYyA9IGdwcnNfbnNfcnhfcmVzZXQobnN2YywgbXNnKTsKKwkJYnJlYWs7CisJY2FzZSBOU19QRFVUX1JFU0VUX0FDSzoKKwkJREVCVUdQKERHUFJTLCAiTlNFST0ldSBSeCBOUyBSRVNFVCBBQ0tcbiIsIG5zdmMtPm5zZWkpOworCQkvKiBtYXJrIHJlbW90ZSBOUy1WQyBhcyBibG9ja2VkICsgYWN0aXZlICovCisJCW5zdmMtPnJlbW90ZV9zdGF0ZSA9IE5TRV9TX0JMT0NLRUQgfCBOU0VfU19BTElWRTsKKwkJaWYgKG5zdmMtPnJlbW90ZV9lbmRfaXNfc2dzbikgeworCQkJLyogc3RvcCBSRVNFVCB0aW1lciAqLworCQkJYnNjX2RlbF90aW1lcigmbnN2Yy0+dGltZXIpOworCQkJLyogc2VuZCBBTElWRSBQRFUgKi8KKwkJCXJjID0gZ3Byc19uc190eF9zaW1wbGUobnN2YywgTlNfUERVVF9BTElWRSk7CisJCQluc3ZjX3N0YXJ0X3RpbWVyKG5zdmMsIE5TVkNfVElNRVJfVE5TX0FMSVZFKTsKKwkJCS8qIG1hcmsgbG9jYWwgc3RhdGUgYXMgQkxPQ0tFRCArIEFMSVZFICovCisJCQluc3ZjLT5zdGF0ZSA9IE5TRV9TX0JMT0NLRUQgfCBOU0VfU19BTElWRTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5TX1BEVVRfVU5CTE9DSzoKKwkJLyogU2VjdGlvbiA3LjI6IHVuYmxvY2tpbmcgcHJvY2VkdXJlICovCisJCURFQlVHUChER1BSUywgIk5TRUk9JXUgUnggTlMgVU5CTE9DS1xuIiwgbnN2Yy0+bnNlaSk7CisJCW5zdmMtPnN0YXRlICY9IH5OU0VfU19CTE9DS0VEOworCQlyYyA9IGdwcnNfbnNfdHhfc2ltcGxlKG5zdmMsIE5TX1BEVVRfVU5CTE9DS19BQ0spOworCQlicmVhazsKKwljYXNlIE5TX1BEVVRfVU5CTE9DS19BQ0s6CisJCURFQlVHUChER1BSUywgIk5TRUk9JXUgUnggTlMgVU5CTE9DSyBBQ0tcbiIsIG5zdmMtPm5zZWkpOworCQkvKiBtYXJrIHJlbW90ZSBOUy1WQyBhcyB1bmJsb2NrZWQgKyBhY3RpdmUgKi8KKwkJbnN2Yy0+cmVtb3RlX3N0YXRlID0gTlNFX1NfQUxJVkU7CisJCWlmIChuc3ZjLT5yZW1vdGVfZW5kX2lzX3Nnc24pCisJCQluc3ZjLT5zdGF0ZSA9IE5TRV9TX0FMSVZFOworCQlicmVhazsKKwljYXNlIE5TX1BEVVRfQkxPQ0s6CisJCURFQlVHUChER1BSUywgIk5TRUk9JXUgUnggTlMgQkxPQ0tcbiIsIG5zdmMtPm5zZWkpOworCQluc3ZjLT5zdGF0ZSB8PSBOU0VfU19CTE9DS0VEOworCQlyYyA9IGdwcnNfbnNfdHhfc2ltcGxlKG5zdmMsIE5TX1BEVVRfVU5CTE9DS19BQ0spOworCQlicmVhazsKKwljYXNlIE5TX1BEVVRfQkxPQ0tfQUNLOgorCQlERUJVR1AoREdQUlMsICJOU0VJPSV1IFJ4IE5TIEJMT0NLIEFDS1xuIiwgbnN2Yy0+bnNlaSk7CisJCS8qIG1hcmsgcmVtb3RlIE5TLVZDIGFzIGJsb2NrZWQgKyBhY3RpdmUgKi8KKwkJbnN2Yy0+cmVtb3RlX3N0YXRlID0gTlNFX1NfQkxPQ0tFRCB8IE5TRV9TX0FMSVZFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR1AoREdQUlMsICJOU0VJPSV1IFJ4IFVua25vd24gTlMgUERVIHR5cGUgMHglMDJ4XG4iLAorCQkJbnN2Yy0+bnNlaSwgbnNoLT5wZHVfdHlwZSk7CisJCXJjID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCXJldHVybiByYzsKK30KKworc3RydWN0IGdwcnNfbnNfaW5zdCAqZ3Byc19uc19pbnN0YW50aWF0ZShncHJzX25zX2NiX3QgKmNiKQoreworCXN0cnVjdCBncHJzX25zX2luc3QgKm5zaSA9IHRhbGxvY196ZXJvKHRhbGxfYnNjX2N0eCwgc3RydWN0IGdwcnNfbnNfaW5zdCk7CisKKwluc2ktPmNiID0gY2I7CisJSU5JVF9MTElTVF9IRUFEKCZuc2ktPmdwcnNfbnN2Y3MpOworCisJcmV0dXJuIG5zaTsKK30KKwordm9pZCBncHJzX25zX2Rlc3Ryb3koc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpKQoreworCS8qIEZJWE1FOiBjbGVhciBhbGwgdGltZXJzICovCisKKwkvKiByZWN1cnNpdmVseSBmcmVlIHRoZSBOU0kgYW5kIGFsbCBpdHMgTlNWQ3MgKi8KKwl0YWxsb2NfZnJlZShuc2kpOworfQorCisKKy8qIE5TLW92ZXItSVAgY29kZSwgYWNjb3JkaW5nIHRvIDNHUFAgVFMgNDguMDE2IENoYXB0ZXIgNi4yCisgKiBXZSBkb24ndCBzdXBwb3J0IFNpemUgUHJvY2VkdXJlLCBDb25maWd1cmF0aW9uIFByb2NlZHVyZSwgQ2hhbmdlV2VpZ2h0IFByb2NlZHVyZSAqLworCisvKiBSZWFkIGEgc2luZ2xlIE5TLW92ZXItSVAgbWVzc2FnZSAqLworc3RhdGljIHN0cnVjdCBtc2diICpyZWFkX25zaXBfbXNnKHN0cnVjdCBic2NfZmQgKmJmZCwgaW50ICplcnJvciwKKwkJCQkgIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2FkZHIpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2MoTlNfQUxMT0NfU0laRSwgIkFiaXMvSVAvR1BSUy1OUyIpOworCWludCByZXQgPSAwOworCXNvY2tsZW5fdCBzYWRkcl9sZW4gPSBzaXplb2YoKnNhZGRyKTsKKworCWlmICghbXNnKSB7CisJCSplcnJvciA9IC1FTk9NRU07CisJCXJldHVybiBOVUxMOworCX0KKworCXJldCA9IHJlY3Zmcm9tKGJmZC0+ZmQsIG1zZy0+ZGF0YSwgTlNfQUxMT0NfU0laRSwgMCwKKwkJCShzdHJ1Y3Qgc29ja2FkZHIgKilzYWRkciwgJnNhZGRyX2xlbik7CisJaWYgKHJldCA8IDApIHsKKwkJTE9HUChER1BSUywgTE9HTF9FUlJPUiwgInJlY3YgZXJyb3IgJXMgZHVyaW5nIE5TSVAgcmVjdlxuIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCW1zZ2JfZnJlZShtc2cpOworCQkqZXJyb3IgPSByZXQ7CisJCXJldHVybiBOVUxMOworCX0gZWxzZSBpZiAocmV0ID09IDApIHsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCSplcnJvciA9IHJldDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbXNnLT5sMmggPSBtc2ctPmRhdGE7CisJbXNnYl9wdXQobXNnLCByZXQpOworCisJcmV0dXJuIG1zZzsKK30KKworc3RhdGljIGludCBoYW5kbGVfbnNpcF9yZWFkKHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlpbnQgZXJyb3I7CisJc3RydWN0IHNvY2thZGRyX2luIHNhZGRyOworCXN0cnVjdCBncHJzX25zX2luc3QgKm5zaSA9IGJmZC0+ZGF0YTsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gcmVhZF9uc2lwX21zZyhiZmQsICZlcnJvciwgJnNhZGRyKTsKKworCWlmICghbXNnKQorCQlyZXR1cm4gZXJyb3I7CisKKwlyZXR1cm4gZ3Byc19uc19yY3Ztc2cobnNpLCBtc2csICZzYWRkcik7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX25zaXBfd3JpdGUoc3RydWN0IGJzY19mZCAqYmZkKQoreworCS8qIEZJWE1FOiBhY3R1YWxseSBzZW5kIHRoZSBkYXRhIGhlcmUgaW5zdGVhZCBvZiBuc2lwX3NlbmRtc2coKSAqLworCXJldHVybiAtRUlPOworfQorCitpbnQgbnNpcF9zZW5kbXNnKHN0cnVjdCBncHJzX25zdmMgKm5zdmMsIHN0cnVjdCBtc2diICptc2cpCit7CisJaW50IHJjOworCXN0cnVjdCBncHJzX25zX2luc3QgKm5zaSA9IG5zdmMtPm5zaTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmRhZGRyID0gJm5zdmMtPmlwLmJ0c19hZGRyOworCisJcmMgPSBzZW5kdG8obnNpLT5uc2lwLmZkLmZkLCBtc2ctPmRhdGEsIG1zZy0+bGVuLCAwLAorCQkgIChzdHJ1Y3Qgc29ja2FkZHIgKilkYWRkciwgc2l6ZW9mKCpkYWRkcikpOworCisJdGFsbG9jX2ZyZWUobXNnKTsKKworCXJldHVybiByYzsKK30KKworLyogVURQIFBvcnQgMjMwMDAgY2FycmllcyB0aGUgTExDLWluLUJTU0dQLWluLU5TIHByb3RvY29sIHN0YWNrICovCitzdGF0aWMgaW50IG5zaXBfZmRfY2Ioc3RydWN0IGJzY19mZCAqYmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKHdoYXQgJiBCU0NfRkRfUkVBRCkKKwkJcmMgPSBoYW5kbGVfbnNpcF9yZWFkKGJmZCk7CisJaWYgKHdoYXQgJiBCU0NfRkRfV1JJVEUpCisJCXJjID0gaGFuZGxlX25zaXBfd3JpdGUoYmZkKTsKKworCXJldHVybiByYzsKK30KKworCisvKiBGSVhNRTogdGhpcyBpcyBjdXJyZW50bHkgaW4gaW5wdXQvaXBhY2Nlc3MuYyAqLworZXh0ZXJuIGludCBtYWtlX3NvY2soc3RydWN0IGJzY19mZCAqYmZkLCBpbnQgcHJvdG8sIHVpbnQxNl90IHBvcnQsCisJCSAgICAgaW50ICgqY2IpKHN0cnVjdCBic2NfZmQgKmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkpOworCisvKiBMaXN0ZW4gZm9yIGluY29taW5nIEdQUlMgcGFja2V0cyAqLworaW50IG5zaXBfbGlzdGVuKHN0cnVjdCBncHJzX25zX2luc3QgKm5zaSwgdWludDE2X3QgdWRwX3BvcnQpCit7CisJaW50IHJldDsKKworCXJldCA9IG1ha2Vfc29jaygmbnNpLT5uc2lwLmZkLCBJUFBST1RPX1VEUCwgdWRwX3BvcnQsIG5zaXBfZmRfY2IpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJbnNpLT5sbCA9IEdQUlNfTlNfTExfVURQOworCW5zaS0+bnNpcC5mZC5kYXRhID0gbnNpOworCisJcmV0dXJuIHJldDsKK30KKworLyogRXN0YWJsaXNoIGEgY29ubmVjdGlvbiAoZnJvbSB0aGUgQlNTKSB0byB0aGUgU0dTTiAqLworc3RydWN0IGdwcnNfbnN2YyAqbnNpcF9jb25uZWN0KHN0cnVjdCBncHJzX25zX2luc3QgKm5zaSwKKwkJCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmRlc3QsIHVpbnQxNl90IG5zZWksCisJCQkJdWludDE2X3QgbnN2Y2kpCit7CisJc3RydWN0IGdwcnNfbnN2YyAqbnN2YzsKKworCW5zdmMgPSBuc3ZjX2J5X3JlbV9hZGRyKG5zaSwgZGVzdCk7CisJaWYgKCFuc3ZjKSB7CisJCW5zdmMgPSBuc3ZjX2NyZWF0ZShuc2ksIG5zdmNpKTsKKwkJbnN2Yy0+aXAuYnRzX2FkZHIgPSAqZGVzdDsKKwl9CisJbnN2Yy0+bnNlaSA9IG5zZWk7CisJbnN2Yy0+bnN2Y2kgPSBuc3ZjaTsKKwluc3ZjLT5yZW1vdGVfZW5kX2lzX3Nnc24gPSAxOworCisJLyogSW5pdGlhdGUgYSBSRVNFVCBwcm9jZWR1cmUgKi8KKwlpZiAoZ3Byc19uc190eF9yZXNldChuc3ZjLCBOU19DQVVTRV9PTV9JTlRFUlZFTlRJT04pIDwgMCkgeworCQlMT0dQKERHUFJTLCBMT0dMX0VSUk9SLCAiTlNFST0ldSwgZXJyb3IgcmVzZXR0aW5nIE5TLVZDXG4iLAorCQkJbnNlaSk7CisJfQorCS8qIHJ1biBhIHRpbWVyIGFuZCByZS10cmFuc21pdCB0aGUgcmVzZXQgcmVxdWVzdD8gKi8KKwluc3ZjX3N0YXJ0X3RpbWVyKG5zdmMsIE5TVkNfVElNRVJfVE5TX1JFU0VUKTsKKworCXJldHVybiBuc3ZjOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX3Nnc24uYyBiL29wZW5ic2Mvc3JjL2dwcnMvZ3Byc19zZ3NuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE0NjcxOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dwcnMvZ3Byc19zZ3NuLmMKQEAgLTAsMCArMSw5NiBAQAorLyogR1BSUyBTR1NOIGZ1bmN0aW9uYWxpdHkgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGltZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19zZ3NuLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX25zLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX2Jzc2dwLmg+CisKK3N0YXRpYyBMTElTVF9IRUFEKHNnc25fbW1fY3R4dHMpOworCitzdGF0aWMgaW50IHJhX2lkX2VxdWFscyhjb25zdCBzdHJ1Y3QgZ3Byc19yYV9pZCAqaWQxLAorCQkJY29uc3Qgc3RydWN0IGdwcnNfcmFfaWQgKmlkMikKK3sKKwlyZXR1cm4gKGlkMS0+bWNjID09IGlkMi0+bWNjICYmIGlkMS0+bW5jID09IGlkMi0+bW5jICYmCisJCWlkMS0+bGFjID09IGlkMi0+bGFjICYmIGlkMS0+cmFjID09IGlkMi0+cmFjKTsKK30KKworLyogbG9vay11cCBhIFNHU04gTU0gY29udGV4dCBiYXNlZCBvbiBUTExJICsgUkFJICovCitzdHJ1Y3Qgc2dzbl9tbV9jdHggKnNnc25fbW1fY3R4X2J5X3RsbGkodWludDMyX3QgdGxsaSwKKwkJCQkJY29uc3Qgc3RydWN0IGdwcnNfcmFfaWQgKnJhaWQpCit7CisJc3RydWN0IHNnc25fbW1fY3R4ICpjdHg7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShjdHgsICZzZ3NuX21tX2N0eHRzLCBsaXN0KSB7CisJCWlmICh0bGxpID09IGN0eC0+dGxsaSAmJgorCQkgICAgcmFfaWRfZXF1YWxzKHJhaWQsICZjdHgtPnJhKSkKKwkJCXJldHVybiBjdHg7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3Qgc2dzbl9tbV9jdHggKnNnc25fbW1fY3R4X2J5X3B0bXNpKHVpbnQzMl90IHBfdG1zaSkKK3sKKwlzdHJ1Y3Qgc2dzbl9tbV9jdHggKmN0eDsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGN0eCwgJnNnc25fbW1fY3R4dHMsIGxpc3QpIHsKKwkJaWYgKHBfdG1zaSA9PSBjdHgtPnBfdG1zaSkKKwkJCXJldHVybiBjdHg7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3Qgc2dzbl9tbV9jdHggKnNnc25fbW1fY3R4X2J5X2ltc2koY29uc3QgY2hhciAqaW1zaSkKK3sKKwlzdHJ1Y3Qgc2dzbl9tbV9jdHggKmN0eDsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGN0eCwgJnNnc25fbW1fY3R4dHMsIGxpc3QpIHsKKwkJaWYgKCFzdHJjbXAoaW1zaSwgY3R4LT5pbXNpKSkKKwkJCXJldHVybiBjdHg7CisJfQorCXJldHVybiBOVUxMOworCit9CisKKy8qIEFsbG9jYXRlIGEgbmV3IFNHU04gTU0gY29udGV4dCAqLworc3RydWN0IHNnc25fbW1fY3R4ICpzZ3NuX21tX2N0eF9hbGxvYyh1aW50MzJfdCB0bGxpLAorCQkJCQljb25zdCBzdHJ1Y3QgZ3Byc19yYV9pZCAqcmFpZCkKK3sKKwlzdHJ1Y3Qgc2dzbl9tbV9jdHggKmN0eCA9IHRhbGxvY196ZXJvKE5VTEwsIHN0cnVjdCBzZ3NuX21tX2N0eCk7CisKKwlpZiAoIWN0eCkKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1jcHkoJmN0eC0+cmEsIHJhaWQsIHNpemVvZihjdHgtPnJhKSk7CisJY3R4LT50bGxpID0gdGxsaTsKKwljdHgtPm1tX3N0YXRlID0gR01NX0RFUkVHSVNURVJFRDsKKworCWxsaXN0X2FkZCgmY3R4LT5saXN0LCAmc2dzbl9tbV9jdHh0cyk7CisKKwlyZXR1cm4gY3R4OworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX3NuZGNwLmMgYi9vcGVuYnNjL3NyYy9ncHJzL2dwcnNfc25kY3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDFhMzkwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX3NuZGNwLmMKQEAgLTAsMCArMSw3MCBAQAorLyogR1BSUyBTTkRDUCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBhcyBwZXIgM0dQUCBUUyAwNC42NSAqLworCisvKiAoQykgMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90aW1lci5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfYnNzZ3AuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfbGxjLmg+CisKKy8qIENoYXB0ZXIgNy4yOiBTTi1QRFUgRm9ybWF0cyAqLworc3RydWN0IHNuZGNwX2NvbW1vbl9oZHIgeworCS8qIG9jdGV0IDEgKi8KKwl1aW50OF90IG5zYXBpOjQ7CisJdWludDhfdCBtb3JlOjE7CisJdWludDhfdCB0eXBlOjE7CisJdWludDhfdCBmaXJzdDoxOworCXVpbnQ4X3Qgc3BhcmU6MTsKKwkvKiBvY3RldCAyICovCisJdWludDhfdCBwY29tcDsKKwl1aW50OF90IGRjb21wOworfTsKKworc3RydWN0IHNuZGNwX3VkYXRhX2hkciB7CisJLyogb2N0ZXQgMyAqLworCXVpbnQ4X3QgbnBkdV9oaWdoOjQ7CisJdWludDhfdCBzZWdfbnI6NDsKKwkvKiBvY3RldCA0ICovCisJdWludDhfdCBucGR1X2xvdzsKK307CisKKy8qIEVudHJ5IHBvaW50IGZvciB0aGUgTEwtVU5JVERBVEEuaW5kaWNhdGlvbiAqLworaW50IHNuZGNwX3VuaXRkYXRhX2luZChzdHJ1Y3QgbXNnYiAqbXNnLCB1aW50OF90IHNhcGksIHVpbnQ4X3QgKmhkciwgdWludDhfdCBsZW4pCit7CisJc3RydWN0IHNuZGNwX3VkYXRhX2hkciAqc3VoOworCXVpbnQxNl90IG5wZHU7CisKKwlpZiAoc3VoLT50eXBlID09IDApIHsKKwkJTE9HUChER1BSUywgTE9HTF9FUlJPUiwgIlNOLURBVEEgUERVIGF0IHVuaXRkYXRhX2luZCgpIGZ1bmN0aW9uXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbnBkdSA9IChzdWgtPm5wZHVfaGlnaCA8PCA4KSB8IHN1aC0+bnBkdV9sb3c7Cit9CisKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dwcnMvZ3NtXzA0XzA4X2dwcnMuYyBiL29wZW5ic2Mvc3JjL2dwcnMvZ3NtXzA0XzA4X2dwcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTQyMTEzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3Bycy9nc21fMDRfMDhfZ3Bycy5jCkBAIC0wLDAgKzEsNzYyIEBACisvKiBHU00gTW9iaWxlIFJhZGlvIEludGVyZmFjZSBMYXllciAzIG1lc3NhZ2VzIG9uIHRoZSBBLWJpcyBpbnRlcmZhY2UKKyAqIDNHUFAgVFMgMDQuMDggdmVyc2lvbiA3LjIxLjAgUmVsZWFzZSAxOTk4IC8gRVRTSSBUUyAxMDAgOTQwIFY3LjIxLjAgKi8KKworLyogKEMpIDIwMDktMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9kYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc21fdXRpbHMuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zaWduYWwuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDhfZ3Bycy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcGFnaW5nLmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmFuc2FjdGlvbi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19ic3NncC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19sbGMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfc2dzbi5oPgorCisvKiAxMC41LjUuMTQgR1BSUyBNTSBDYXVzZSAvIFRhYmxlIDEwLjUuMTQ3ICovCitzdHJ1Y3QgdmFsdWVfc3RyaW5nIGdtbV9jYXVzZV9uYW1lc1tdID0geworCS8qIEZJWE1FICovCisJeyBHTU1fQ0FVU0VfU0VNX0lOQ09SUl9NU0csICJTZW1hbnRpY2FsbHkgaW5jb3JyZWN0IG1lc3NhZ2UiIH0sCisJeyBHTU1fQ0FVU0VfSU5WX01BTkRfSU5GTywgIkludmFsaWQgbWFuZGF0b3J5IGluZm9ybWF0aW9uIiB9LAorCXsgR01NX0NBVVNFX01TR1RfTk9URVhJU1RfTk9USU1QTCwKKwkJCSJNZXNzYWdlIHR5cGUgbm9uLWV4aXN0YW50IG9yIG5vdCBpbXBsZW1lbnRlZCIgfSwKKwl7IEdNTV9DQVVTRV9NU0dUX0lOQ09NUF9QX1NUQVRFLAorCQkJIk1lc3NhZ2UgdHlwZSBub3QgY29tcGF0aWJsZSB3aXRoIHByb3RvY29sIHN0YXRlIiB9LAorCXsgR01NX0NBVVNFX0lFX05PVEVYSVNUX05PVElNUEwsCisJCQkiSW5mb3JtYXRpb24gZWxlbWVudCBub24tZXhpc3RlbnQgb3Igbm90IGltcGxlbWVudGVkIiB9LAorCXsgR01NX0NBVVNFX0NPTkRfSUVfRVJSLCAiQ29uZGl0aW9uYWwgSUUgZXJyb3IiIH0sCisJeyBHTU1fQ0FVU0VfTVNHX0lOQ09NUF9QX1NUQVRFLAorCQkJCSJNZXNzYWdlIG5vdCBjb21wYXRpYmxlIHdpdGggcHJvdG9jb2wgc3RhdGUgIiB9LAorCXsgR01NX0NBVVNFX1BST1RPX0VSUl9VTlNQRUMsICJQcm90b2NvbCBlcnJvciwgdW5zcGVjaWZpZWQiIH0sCisJeyAwLCBOVUxMIH0KK307CisKKy8qIDEwLjUuNi42IFNNIENhdXNlIC8gVGFibGUgMTAuNS4xNTcgKi8KK3N0cnVjdCB2YWx1ZV9zdHJpbmcgZ3NtX2NhdXNlX25hbWVzW10gPSB7CisJeyBHU01fQ0FVU0VfSU5TVUZGX1JTUkMsICJJbnN1ZmZpY2llbnQgcmVzb3VyY2VzIiB9LAorCXsgR1NNX0NBVVNFX01JU1NJTkdfQVBOLCAiTWlzc2luZyBvciB1bmtub3duIEFQTiIgfSwKKwl7IEdTTV9DQVVTRV9VTktOT1dOX1BEUCwgIlVua25vd24gUERQIGFkZHJlc3Mgb3IgUERQIHR5cGUiIH0sCisJeyBHU01fQ0FVU0VfQVVUSF9GQUlMRUQsICJVc2VyIEF1dGhlbnRpY2F0aW9uIGZhaWxlZCIgfSwKKwl7IEdTTV9DQVVTRV9BQ1RfUkVKX0dHU04sICJBY3RpdmF0aW9uIHJlamVjdGVkIGJ5IEdHU04iIH0sCisJeyBHU01fQ0FVU0VfQUNUX1JFSl9VTlNQRUMsICJBY3RpdmF0aW9uIHJlamVjdGVkLCB1bnNwZWNpZmllZCIgfSwKKwl7IEdTTV9DQVVTRV9TRVJWX09QVF9OT1RTVVBQLCAiU2VydmljZSBvcHRpb24gbm90IHN1cHBvcnRlZCIgfSwKKwl7IEdTTV9DQVVTRV9SRVFfU0VSVl9PUFRfTk9UU1VCLAorCQkJCSJSZXF1ZXN0ZWQgc2VydmljZSBvcHRpb24gbm90IHN1YnNjcmliZWQiIH0sCisJeyBHU01fQ0FVU0VfU0VSVl9PUFRfVEVNUF9PT08sCisJCQkJIlNlcnZpY2Ugb3B0aW9uIHRlbXBvcmFyaWx5IG91dCBvZiBvcmRlciIgfSwKKwl7IEdTTV9DQVVTRV9OU0FQSV9JTl9VU0UsICJOU0FQSSBhbHJlYWR5IHVzZWQiIH0sCisJeyBHU01fQ0FVU0VfREVBQ1RfUkVHVUxBUiwgIlJlZ3VsYXIgZGVhY3RpdmF0aW9uIiB9LAorCXsgR1NNX0NBVVNFX1FPU19OT1RfQUNDRVBURUQsICJRb1Mgbm90IGFjY2VwdGVkIiB9LAorCXsgR1NNX0NBVVNFX05FVF9GQUlMLCAiTmV0d29yayBGYWlsdXJlIiB9LAorCXsgR1NNX0NBVVNFX1JFQUNUX1JRRCwgIlJlYWN0aXZhdGlvbiByZXF1aXJlZCIgfSwKKwl7IEdTTV9DQVVTRV9GRUFUVVJFX05PVFNVUFAsICJGZWF0dXJlIG5vdCBzdXBwb3J0ZWQgIiB9LAorCXsgR1NNX0NBVVNFX0lOVkFMSURfVFJBTlNfSUQsICJJbnZhbGlkIHRyYW5zYWN0aW9uIGlkZW50aWZpZXIiIH0sCisJeyBHU01fQ0FVU0VfU0VNX0lOQ09SUl9NU0csICJTZW1hbnRpY2FsbHkgaW5jb3JyZWN0IG1lc3NhZ2UiIH0sCisJeyBHU01fQ0FVU0VfSU5WX01BTkRfSU5GTywgIkludmFsaWQgbWFuZGF0b3J5IGluZm9ybWF0aW9uIiB9LAorCXsgR1NNX0NBVVNFX01TR1RfTk9URVhJU1RfTk9USU1QTCwKKwkJCSJNZXNzYWdlIHR5cGUgbm9uLWV4aXN0YW50IG9yIG5vdCBpbXBsZW1lbnRlZCIgfSwKKwl7IEdTTV9DQVVTRV9NU0dUX0lOQ09NUF9QX1NUQVRFLAorCQkJIk1lc3NhZ2UgdHlwZSBub3QgY29tcGF0aWJsZSB3aXRoIHByb3RvY29sIHN0YXRlIiB9LAorCXsgR1NNX0NBVVNFX0lFX05PVEVYSVNUX05PVElNUEwsCisJCQkiSW5mb3JtYXRpb24gZWxlbWVudCBub24tZXhpc3RlbnQgb3Igbm90IGltcGxlbWVudGVkIiB9LAorCXsgR1NNX0NBVVNFX0NPTkRfSUVfRVJSLCAiQ29uZGl0aW9uYWwgSUUgZXJyb3IiIH0sCisJeyBHU01fQ0FVU0VfTVNHX0lOQ09NUF9QX1NUQVRFLAorCQkJCSJNZXNzYWdlIG5vdCBjb21wYXRpYmxlIHdpdGggcHJvdG9jb2wgc3RhdGUgIiB9LAorCXsgR1NNX0NBVVNFX1BST1RPX0VSUl9VTlNQRUMsICJQcm90b2NvbCBlcnJvciwgdW5zcGVjaWZpZWQiIH0sCisJeyAwLCBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBjaGFyICphdHRfbmFtZSh1aW50OF90IHR5cGUpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBHUFJTX0FUVF9UX0FUVEFDSDoKKwkJcmV0dXJuICJHUFJTIGF0dGFjaCI7CisJY2FzZSBHUFJTX0FUVF9UX0FUVF9XSElMRV9JTVNJOgorCQlyZXR1cm4gIkdQUlMgYXR0YWNoIHdoaWxlIElNU0kgYXR0YWNoZWQiOworCWNhc2UgR1BSU19BVFRfVF9DT01CSU5FRDoKKwkJcmV0dXJuICJDb21iaW5lZCBHUFJTL0lNU0kgYXR0YWNoIjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gInVua25vd24iOworCX0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnVwZF9uYW1lKHVpbnQ4X3QgdHlwZSkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEdQUlNfVVBEX1RfUkE6CisJCXJldHVybiAiUkEgdXBkYXRpbmciOworCWNhc2UgR1BSU19VUERfVF9SQV9MQToKKwkJcmV0dXJuICJjb21iaW5lZCBSQS9MQSB1cGRhdGluZyI7CisJY2FzZSBHUFJTX1VQRF9UX1JBX0xBX0lNU0lfQVRUOgorCQlyZXR1cm4gImNvbWJpbmVkIFJBL0xBIHVwZGF0aW5nICsgSU1TSSBhdHRhY2giOworCWNhc2UgR1BSU19VUERfVF9QRVJJT0RJQzoKKwkJcmV0dXJuICJwZXJpb2RpYyB1cGRhdGluZyI7CisJfQorCXJldHVybiAidW5rbm93biI7Cit9CisKKy8qIFNlbmQgYSBtZXNzYWdlIHRocm91Z2ggdGhlIHVuZGVybHlpbmcgbGF5ZXIgKi8KK3N0YXRpYyBpbnQgZ3NtNDhfZ21tX3NlbmRtc2coc3RydWN0IG1zZ2IgKm1zZywgaW50IGNvbW1hbmQpCit7CisJLyogY2FsbGVyIG5lZWRzIHRvIHByb3ZpZGUgVExMSSwgQlZDSSBhbmQgTlNFSSAqLworCXJldHVybiBncHJzX2xsY190eF91aShtc2csIEdQUlNfU0FQSV9HTU0sIGNvbW1hbmQpOworfQorCisvKiBjb3B5IGlkZW50aWZpZXJzIGZyb20gb2xkIG1lc3NhZ2UgdG8gbmV3IG1lc3NhZ2UsIHRoaXMKKyAqIGlzIHJlcXVpcmVkIHNvIGxvd2VyIGxheWVycyBjYW4gcm91dGUgaXQgY29ycmVjdGx5ICovCitzdGF0aWMgdm9pZCBnbW1fY29weV9pZChzdHJ1Y3QgbXNnYiAqbXNnLCBjb25zdCBzdHJ1Y3QgbXNnYiAqb2xkKQoreworCW1zZ2JfdGxsaShtc2cpID0gbXNnYl90bGxpKG9sZCk7CisJbXNnYl9idmNpKG1zZykgPSBtc2diX2J2Y2kob2xkKTsKKwltc2diX25zZWkobXNnKSA9IG1zZ2JfbnNlaShvbGQpOworfQorCitzdGF0aWMgc3RydWN0IGdzbTQ4X3FvcyBkZWZhdWx0X3FvcyA9IHsKKwkuZGVsYXlfY2xhc3MgPSA0LAkvKiBiZXN0IGVmZm9ydCAqLworCS5yZWxpYWJfY2xhc3MgPSBHU000OF9RT1NfUkNfTExDX1VOX1JMQ19BQ0tfREFUQV9QUk9ULAorCS5wZWFrX3RwdXQgPSBHU000OF9RT1NfUEVBS19UUFVUXzMyMDAwYnBzLAorCS5wcmVjZWRfY2xhc3MgPSBHU000OF9RT1NfUENfTk9STUFMLAorCS5tZWFuX3RwdXQgPSBHU000OF9RT1NfTUVBTl9UUFVUX0JFU1RfRUZGT1JULAorCS50cmFmX2NsYXNzID0gR1NNNDhfUU9TX1RDX0lOVEVSQUNUSVZFLAorCS5kZWxpdl9vcmRlciA9IEdTTTQ4X1FPU19ET19VTk9SREVSRUQsCisJLmRlbGl2X2Vycl9zZHUgPSBHU000OF9RT1NfRVJSU0RVX1lFUywKKwkubWF4X3NkdV9zaXplID0gR1NNNDhfUU9TX01BWFNEVV8xNTIwLAorCS5tYXhfYml0cmF0ZV91cCA9IEdTTTQ4X1FPU19NQlJBVEVfNjNrLAorCS5tYXhfYml0cmF0ZV9kb3duID0gR1NNNDhfUU9TX01CUkFURV82M2ssCisJLnJlc2lkX2JlciA9IEdTTTQ4X1FPU19SQkVSXzVlXzIsCisJLnNkdV9lcnJfcmF0aW8gPSBHU000OF9RT1NfU0VSUl8xZV8yLAorCS5oYW5kbGluZ19wcmlvID0gMywKKwkueGZlcl9kZWxheSA9IDB4MTAsCS8qIDIwMG1zICovCisJLmd1YXJfYml0cmF0ZV91cCA9IEdTTTQ4X1FPU19NQlJBVEVfMGssCisJLmd1YXJfYml0cmF0ZV9kb3duID0gR1NNNDhfUU9TX01CUkFURV8waywKKwkuc2lnX2luZCA9IDAsCS8qIG5vdCBvcHRpbWlzZWQgZm9yIHNpZ25hbGxpbmcgKi8KKwkubWF4X2JpdHJhdGVfZG93bl9leHQgPSAwLAkvKiB1c2Ugb2N0ZXQgOSAqLworCS5ndWFyX2JpdHJhdGVfZG93bl9leHQgPSAwLAkvKiB1c2Ugb2N0ZXQgMTMgKi8KK307CisKKy8qIENoYXB0ZXIgOS40LjI6IEF0dGFjaCBhY2NlcHQgKi8KK3N0YXRpYyBpbnQgZ3NtNDhfdHhfZ21tX2F0dF9hY2soc3RydWN0IG1zZ2IgKm9sZF9tc2cpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaDsKKwlzdHJ1Y3QgZ3NtNDhfYXR0YWNoX2FjayAqYWE7CisJc3RydWN0IGdwcnNfcmFfaWQgcmFfaWQ7CisKKwlERUJVR1AoRE1NLCAiPC0gR1BSUyBBVFRBQ0ggQUNDRVBUXG4iKTsKKworCWdtbV9jb3B5X2lkKG1zZywgb2xkX21zZyk7CisKKwlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX01NX0dQUlM7CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfR01NX0FUVEFDSF9BQ0s7CisKKwlhYSA9IChzdHJ1Y3QgZ3NtNDhfYXR0YWNoX2FjayAqKSBtc2diX3B1dChtc2csIHNpemVvZigqYWEpKTsKKwlhYS0+Zm9yY2Vfc3RieSA9IDA7CS8qIG5vdCBpbmRpY2F0ZWQgKi8KKwlhYS0+YXR0X3Jlc3VsdCA9IDE7CS8qIEdQUlMgb25seSAqLworCWFhLT5yYV91cGRfdGltZXIgPSBHUFJTX1RNUl9NSU5VVEUgfCAxMDsKKwlhYS0+cmFkaW9fcHJpbyA9IDQ7CS8qIGxvd2VzdCAqLworCWJzc2dwX3BhcnNlX2NlbGxfaWQoJnJhX2lkLCBtc2diX2JjaWQob2xkX21zZykpOworCWdzbTQ4X2NvbnN0cnVjdF9yYShhYS0+cmFfaWQuZGlnaXRzLCAmcmFfaWQpOworCisJLyogT3B0aW9uOiBQLVRNU0kgc2lnbmF0dXJlLCBhbGxvY2F0ZWQgUC1UTVNJLCBNUyBJRCwgLi4uICovCisJcmV0dXJuIGdzbTQ4X2dtbV9zZW5kbXNnKG1zZywgMCk7Cit9CisKKy8qIENoYXB0ZXIgOS40LjU6IEF0dGFjaCByZWplY3QgKi8KK3N0YXRpYyBpbnQgZ3NtNDhfdHhfZ21tX2F0dF9yZWooc3RydWN0IG1zZ2IgKm9sZF9tc2csIHVpbnQ4X3QgZ21tX2NhdXNlKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisKKwlERUJVR1AoRE1NLCAiPC0gR1BSUyBBVFRBQ0ggUkVKRUNUXG4iKTsKKworCWdtbV9jb3B5X2lkKG1zZywgb2xkX21zZyk7CisKKwlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkgKyAxKTsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19NTV9HUFJTOworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0dNTV9BVFRBQ0hfUkVKOworCWdoLT5kYXRhWzBdID0gZ21tX2NhdXNlOworCisJcmV0dXJuIGdzbTQ4X2dtbV9zZW5kbXNnKG1zZywgMCk7Cit9CisKKy8qIFRyYW5zbWl0IENoYXB0ZXIgOS40LjEyIElkZW50aXR5IFJlcXVlc3QgKi8KK3N0YXRpYyBpbnQgZ3NtNDhfdHhfZ21tX2lkX3JlcShzdHJ1Y3QgbXNnYiAqb2xkX21zZywgdWludDhfdCBpZF90eXBlKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisKKwlERUJVR1AoRE1NLCAiLT4gR1BSUyBJREVOVElUWSBSRVFVRVNUOiBtaV90eXBlPSUwMnhcbiIsIGlkX3R5cGUpOworCisJZ21tX2NvcHlfaWQobXNnLCBvbGRfbXNnKTsKKworCWdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSArIDEpOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX01NX0dQUlM7CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfR01NX0lEX1JFUTsKKwkvKiAxMC41LjUuOSBJRCB0eXBlIDIgKyBpZGVudGl0eSB0eXBlIGFuZCAxMC41LjUuNyAnZm9yY2UgdG8gc3RhbmRieScgSUUgKi8KKwlnaC0+ZGF0YVswXSA9IGlkX3R5cGUgJiAweGY7CisKKwlyZXR1cm4gZ3NtNDhfZ21tX3NlbmRtc2cobXNnLCAwKTsKK30KKworLyogQ2hlY2sgaWYgd2UgY2FuIGFscmVhZHkgYXV0aG9yaXplIGEgc3Vic2NyaWJlciAqLworc3RhdGljIGludCBnc200OF9nbW1fYXV0aG9yaXplKHN0cnVjdCBzZ3NuX21tX2N0eCAqY3R4LCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCWlmIChzdHJsZW4oY3R4LT5pbWVpKSAmJiBzdHJsZW4oY3R4LT5pbXNpKSkgeworCQljdHgtPm1tX3N0YXRlID0gR01NX1JFR0lTVEVSRURfTk9STUFMOworCQlyZXR1cm4gZ3NtNDhfdHhfZ21tX2F0dF9hY2sobXNnKTsKKwl9IAorCWlmICghc3RybGVuKGN0eC0+aW1laSkpCisJCXJldHVybiBnc200OF90eF9nbW1faWRfcmVxKG1zZywgR1NNX01JX1RZUEVfSU1FSSk7CisKKwlpZiAoIXN0cmxlbihjdHgtPmltc2kpKQorCQlyZXR1cm4gZ3NtNDhfdHhfZ21tX2lkX3JlcShtc2csIEdTTV9NSV9UWVBFX0lNU0kpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFBhcnNlIENoYXB0ZXIgOS40LjEzIElkZW50aXR5IFJlc3BvbnNlICovCitzdGF0aWMgaW50IGdzbTQ4X3J4X2dtbV9pZF9yZXNwKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX2dtbWgobXNnKTsKKwl1aW50OF90IG1pX3R5cGUgPSBnaC0+ZGF0YVsxXSAmIEdTTV9NSV9UWVBFX01BU0s7CisJY2hhciBtaV9zdHJpbmdbR1NNNDhfTUlfU0laRV07CisJc3RydWN0IGdwcnNfcmFfaWQgcmFfaWQ7CisJc3RydWN0IHNnc25fbW1fY3R4ICpjdHg7CisKKwlnc200OF9taV90b19zdHJpbmcobWlfc3RyaW5nLCBzaXplb2YobWlfc3RyaW5nKSwgJmdoLT5kYXRhWzFdLCBnaC0+ZGF0YVswXSk7CisJREVCVUdQKERNTSwgIkdNTSBJREVOVElUWSBSRVNQT05TRTogbWlfdHlwZT0weCUwMnggTUkoJXMpICIsCisJCW1pX3R5cGUsIG1pX3N0cmluZyk7CisKKwlic3NncF9wYXJzZV9jZWxsX2lkKCZyYV9pZCwgbXNnYl9iY2lkKG1zZykpOworCWN0eCA9IHNnc25fbW1fY3R4X2J5X3RsbGkobXNnYl90bGxpKG1zZyksICZyYV9pZCk7CisJaWYgKCFjdHgpIHsKKwkJREVCVUdQKERNTSwgImZyb20gdW5rbm93biBUTExJIDB4JTA4eD8hP1xuIiwgbXNnYl90bGxpKG1zZykpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKG1pX3R5cGUpIHsKKwljYXNlIEdTTV9NSV9UWVBFX0lNU0k6CisJCS8qIHdlIGFscmVhZHkgaGF2ZSBhIG1tIGNvbnRleHQgd2l0aCBjdXJyZW50IFRMTEksIGJ1dCBubworCQkgKiBQLVRNU0kgLyBJTVNJIHlldC4gIFdoYXQgd2Ugbm93IG5lZWQgdG8gZG8gaXMgdG8gZmlsbAorCQkgKiB0aGlzIGluaXRpYWwgY29udGV4dCB3aXRoIGRhdGEgZnJvbSB0aGUgSExSICovCisJCXN0cm5jcHkoY3R4LT5pbXNpLCBtaV9zdHJpbmcsIHNpemVvZihjdHgtPmltZWkpKTsKKwkJYnJlYWs7CisJY2FzZSBHU01fTUlfVFlQRV9JTUVJOgorCQlzdHJuY3B5KGN0eC0+aW1laSwgbWlfc3RyaW5nLCBzaXplb2YoY3R4LT5pbWVpKSk7CisJCWJyZWFrOworCWNhc2UgR1NNX01JX1RZUEVfSU1FSVNWOgorCQlicmVhazsKKwl9CisKKwlERUJVR1BDKERNTSwgIlxuIik7CisJLyogQ2hlY2sgaWYgd2UgY2FuIGxldCB0aGUgbW9iaWxlIHN0YXRpb24gZW50ZXIgKi8KKwlyZXR1cm4gZ3NtNDhfZ21tX2F1dGhvcml6ZShjdHgsIG1zZyk7Cit9CisKK3N0YXRpYyB2b2lkIGF0dGFjaF9yZWpfY2Iodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc2dzbl9tbV9jdHggKmN0eCA9IGRhdGE7CisKKwkvKiBGSVhNRTogZGV0ZXJtaW5lIHRocm91Z2ggd2hpY2ggQlRTL1RSWCB0byBzZW5kIHRoaXMgKi8KKwkvL2dzbTQ4X3R4X2dtbV9hdHRfcmVqKGN0eC0+dGxsaSwgR01NX0NBVVNFX01TX0lEX05PVF9ERVJJVkVEKTsKKwljdHgtPm1tX3N0YXRlID0gR01NX0RFUkVHSVNURVJFRDsKKwkvKiBGSVhNRTogcmVsZWFzZSB0aGUgY29udGV4dCAqLworfQorCitzdGF0aWMgdm9pZCBzY2hlZHVsZV9yZWplY3Qoc3RydWN0IHNnc25fbW1fY3R4ICpjdHgpCit7CisJY3R4LT5UID0gMzM3MDsKKwljdHgtPnRpbWVyLmNiID0gYXR0YWNoX3Jlal9jYjsKKwljdHgtPnRpbWVyLmRhdGEgPSBjdHg7CisJYnNjX3NjaGVkdWxlX3RpbWVyKCZjdHgtPnRpbWVyLCA2LCAwKTsKK30KKworLyogU2VjdGlvbiA5LjQuMSBBdHRhY2ggcmVxdWVzdCAqLworc3RhdGljIGludCBnc200OF9yeF9nbW1fYXR0X3JlcShzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9nbW1oKG1zZyk7CisJdWludDhfdCAqY3VyID0gZ2gtPmRhdGEsICptc25jLCAqbWksICpvbGRfcmFfaW5mbzsKKwl1aW50OF90IG1zbmNfbGVuLCBhdHRfdHlwZSwgbWlfbGVuLCBtaV90eXBlOworCXVpbnQxNl90IGRyeF9wYXI7CisJdWludDMyX3QgdG1zaTsKKwljaGFyIG1pX3N0cmluZ1tHU000OF9NSV9TSVpFXTsKKwlzdHJ1Y3QgZ3Byc19yYV9pZCByYV9pZDsKKwl1aW50MTZfdCBjaWQ7CisJc3RydWN0IHNnc25fbW1fY3R4ICpjdHg7CisKKwlERUJVR1AoRE1NLCAiR01NIEFUVEFDSCBSRVFVRVNUICIpOworCisJLyogQXMgcGVyIFRTIDA0LjA4IENoYXB0ZXIgNC43LjEuNCwgdGhlIGF0dGFjaCByZXF1ZXN0IGFycml2ZXMgZWl0aGVyCisJICogd2l0aCBhIGZvcmVpZ24gVExMSSAoUC1UTVNJIHRoYXQgd2FzIGFsbG9jYXRlZCB0byB0aGUgTVMgYmVmb3JlKSwKKwkgKiBvciB3aXRoIHJhbmRvbSBUTExJLiAqLworCisJY2lkID0gYnNzZ3BfcGFyc2VfY2VsbF9pZCgmcmFfaWQsIG1zZ2JfYmNpZChtc2cpKTsKKworCS8qIE1TIG5ldHdvcmsgY2FwYWJpbGl0eSAxMC41LjUuMTIgKi8KKwltc25jX2xlbiA9ICpjdXIrKzsKKwltc25jID0gY3VyOworCWlmIChtc25jX2xlbiA+IDIpCisJCWdvdG8gZXJyX2ludmFsOworCWN1ciArPSBtc25jX2xlbjsKKworCS8qIGFUVEFDSCBUeXBlIDEwLjUuNS4yICovCisJYXR0X3R5cGUgPSAqY3VyKysgJiAweDBmOworCisJLyogRFJYIHBhcmFtZXRlciAxMC41LjUuNiAqLworCWRyeF9wYXIgPSAqY3VyKys7CisJZHJ4X3BhciB8PSAqY3VyKysgPDwgODsKKworCS8qIE1vYmlsZSBJZGVudGl0eSAoUC1UTVNJIG9yIElNU0kpIDEwLjUuMS40ICovCisJbWlfbGVuID0gKmN1cisrOworCW1pID0gY3VyOworCWlmIChtaV9sZW4gPiA4KQorCQlnb3RvIGVycl9pbnZhbDsKKwltaV90eXBlID0gKm1pICYgR1NNX01JX1RZUEVfTUFTSzsKKwljdXIgKz0gbWlfbGVuOworCisJZ3NtNDhfbWlfdG9fc3RyaW5nKG1pX3N0cmluZywgc2l6ZW9mKG1pX3N0cmluZyksIG1pLCBtaV9sZW4pOworCisJREVCVUdQQyhETU0sICJNSSglcykgdHlwZT1cIiVzXCIgIiwgbWlfc3RyaW5nLCBhdHRfbmFtZShhdHRfdHlwZSkpOworCisJLyogT2xkIHJvdXRpbmcgYXJlYSBpZGVudGlmaWNhdGlvbiAxMC41LjUuMTUgKi8KKwlvbGRfcmFfaW5mbyA9IGN1cjsKKwljdXIgKz0gNjsKKworCS8qIE1TIFJhZGlvIEFjY2VzcyBDYXBhYmlsaXR5IDEwLjUuNS4xMmEgKi8KKworCS8qIE9wdGlvbmFsOiBPbGQgUC1UTVNJIFNpZ25hdHVyZSwgUmVxdWVzdGVkIFJFQURZIHRpbWVyLCBUTVNJIFN0YXR1cyAqLworCisJc3dpdGNoIChtaV90eXBlKSB7CisJY2FzZSBHU01fTUlfVFlQRV9JTVNJOgorCQkvKiBUcnkgdG8gZmluZCBNTSBjb250ZXh0IGJhc2VkIG9uIElNU0kgKi8KKwkJY3R4ID0gc2dzbl9tbV9jdHhfYnlfaW1zaShtaV9zdHJpbmcpOworCQlpZiAoIWN0eCkgeworI2lmIDAKKwkJCXJldHVybiBnc200OF90eF9nbW1fYXR0X3Jlaihtc2csIEdNTV9DQVVTRV9JTVNJX1VOS05PV04pOworI2Vsc2UKKwkJCS8qIEFzIGEgdGVtb3JhcnkgaGFjaywgd2Ugc2ltcGx5IGFzc3VtZSB0aGF0IHRoZSBJTVNJIGV4aXN0cyAqLworCQkJY3R4ID0gc2dzbl9tbV9jdHhfYWxsb2MoMCwgJnJhX2lkKTsKKwkJCWlmICghY3R4KQorCQkJCXJldHVybiBnc200OF90eF9nbW1fYXR0X3Jlaihtc2csIEdNTV9DQVVTRV9ORVRfRkFJTCk7CisJCQlzdHJuY3B5KGN0eC0+aW1zaSwgbWlfc3RyaW5nLCBzaXplb2YoY3R4LT5pbXNpKSk7CisjZW5kaWYKKwkJfQorCQkvKiBGSVhNRTogU3RhcnQgc29tZSB0aW1lciAqLworCQljdHgtPm1tX3N0YXRlID0gR01NX0NPTU1PTl9QUk9DX0lOSVQ7CisJCWN0eC0+dGxsaSA9IG1zZ2JfdGxsaShtc2cpOworCQlicmVhazsKKwljYXNlIEdTTV9NSV9UWVBFX1RNU0k6CisJCXRtc2kgPSBzdHJ0b3VsKG1pX3N0cmluZywgTlVMTCwgMTApOworCQkvKiBUcnkgdG8gZmluZCBNTSBjb250ZXh0IGJhc2VkIG9uIFAtVE1TSSAqLworCQljdHggPSBzZ3NuX21tX2N0eF9ieV9wdG1zaSh0bXNpKTsKKwkJaWYgKCFjdHgpIHsKKwkJCWN0eCA9IHNnc25fbW1fY3R4X2FsbG9jKG1zZ2JfdGxsaShtc2cpLCAmcmFfaWQpOworCQkJLyogRklYTUU6IFN0YXJ0IHNvbWUgdGltZXIgKi8KKwkJCWN0eC0+bW1fc3RhdGUgPSBHTU1fQ09NTU9OX1BST0NfSU5JVDsKKwkJCWN0eC0+dGxsaSA9IG1zZ2JfdGxsaShtc2cpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKwkvKiBVcGRhdGUgTU0gQ29udGV4dCB3aXRoIGN1cnJpZW50IFJBIGFuZCBDZWxsIElEICovCisJY3R4LT5yYSA9IHJhX2lkOworCWN0eC0+Y2VsbF9pZCA9IGNpZDsKKworCS8qIEZJWE1FOiBhbGxvY2F0ZSBhIG5ldyBQLVRNU0kgKCsgUC1UTVNJIHNpZ25hdHVyZSkgKi8KKwkvKiBGSVhNRTogdXBkYXRlIHRoZSBUTExJIHdpdGggdGhlIG5ldyBsb2NhbCBUTExJIGJhc2VkIG9uIHRoZSBQLVRNU0kgKi8KKworCURFQlVHUEMoRE1NLCAiXG4iKTsKKworCXJldHVybiBjdHggPyBnc200OF9nbW1fYXV0aG9yaXplKGN0eCwgbXNnKSA6IDA7CisKK2Vycl9pbnZhbDoKKwlERUJVR1BDKERNTSwgIlxuIik7CisJcmV0dXJuIGdzbTQ4X3R4X2dtbV9hdHRfcmVqKG1zZywgR01NX0NBVVNFX1NFTV9JTkNPUlJfTVNHKTsKK30KKworLyogQ2hhcHRlciA5LjQuMTU6IFJvdXRpbmcgYXJlYSB1cGRhdGUgYWNjZXB0ICovCitzdGF0aWMgaW50IGdzbTQ4X3R4X2dtbV9yYV91cGRfYWNrKHN0cnVjdCBtc2diICpvbGRfbXNnKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisJc3RydWN0IGdzbTQ4X3JhX3VwZF9hY2sgKnJ1YTsKKwlzdHJ1Y3QgZ3Byc19yYV9pZCByYV9pZDsKKworCURFQlVHUChETU0sICI8LSBST1VUSU5HIEFSRUEgVVBEQVRFIEFDQ0VQVFxuIik7CisKKwlnbW1fY29weV9pZChtc2csIG9sZF9tc2cpOworCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19NTV9HUFJTOworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0dNTV9SQV9VUERfQUNLOworCisJcnVhID0gKHN0cnVjdCBnc200OF9yYV91cGRfYWNrICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpydWEpKTsKKwlydWEtPmZvcmNlX3N0YnkgPSAwOwkvKiBub3QgaW5kaWNhdGVkICovCisJcnVhLT51cGRfcmVzdWx0ID0gMDsJLyogUkEgdXBkYXRlZCAqLworCXJ1YS0+cmFfdXBkX3RpbWVyID0gR1BSU19UTVJfTUlOVVRFIHwgMTA7CisKKwlic3NncF9wYXJzZV9jZWxsX2lkKCZyYV9pZCwgbXNnYl9iY2lkKG9sZF9tc2cpKTsKKwlnc200OF9jb25zdHJ1Y3RfcmEocnVhLT5yYV9pZC5kaWdpdHMsICZyYV9pZCk7CisKKwkvKiBPcHRpb246IFAtVE1TSSBzaWduYXR1cmUsIGFsbG9jYXRlZCBQLVRNU0ksIE1TIElELCAuLi4gKi8KKwlyZXR1cm4gZ3NtNDhfZ21tX3NlbmRtc2cobXNnLCAwKTsKK30KKworLyogQ2hhcHRlciA5LjQuMTc6IFJvdXRpbmcgYXJlYSB1cGRhdGUgcmVqZWN0ICovCitzdGF0aWMgaW50IGdzbTQ4X3R4X2dtbV9yYV91cGRfcmVqKHN0cnVjdCBtc2diICpvbGRfbXNnLCB1aW50OF90IGNhdXNlKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisKKwlERUJVR1AoRE1NLCAiPC0gUk9VVElORyBBUkVBIFVQREFURSBSRUpFQ1RcbiIpOworCisJZ21tX2NvcHlfaWQobXNnLCBvbGRfbXNnKTsKKworCWdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSArIDIpOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX01NX0dQUlM7CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfR01NX1JBX1VQRF9SRUo7CisJZ2gtPmRhdGFbMF0gPSBjYXVzZTsKKwlnaC0+ZGF0YVsxXSA9IDA7IC8qID8gKi8KKworCS8qIE9wdGlvbjogUC1UTVNJIHNpZ25hdHVyZSwgYWxsb2NhdGVkIFAtVE1TSSwgTVMgSUQsIC4uLiAqLworCXJldHVybiBnc200OF9nbW1fc2VuZG1zZyhtc2csIDApOworfQorCisvKiBDaGFwdGVyIDkuNC4xNDogUm91dGluZyBhcmVhIHVwZGF0ZSByZXF1ZXN0ICovCitzdGF0aWMgaW50IGdzbTQ4X3J4X2dtbV9yYV91cGRfcmVxKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX2dtbWgobXNnKTsKKwlzdHJ1Y3Qgc2dzbl9tbV9jdHggKm1tY3R4OworCXVpbnQ4X3QgKmN1ciA9IGdoLT5kYXRhOworCXN0cnVjdCBncHJzX3JhX2lkIG9sZF9yYV9pZDsKKwl1aW50OF90IHVwZF90eXBlOworCisJLyogVXBkYXRlIFR5cGUgMTAuNS41LjE4ICovCisJdXBkX3R5cGUgPSAqY3VyKysgJiAweDBmOworCisJREVCVUdQKERNTSwgIkdNTSBSQSBVUERBVEUgUkVRVUVTVCB0eXBlPVwiJXNcIiAiLCB1cGRfbmFtZSh1cGRfdHlwZSkpOworCisJLyogT2xkIHJvdXRpbmcgYXJlYSBpZGVudGlmaWNhdGlvbiAxMC41LjUuMTUgKi8KKwlnc200OF9wYXJzZV9yYSgmb2xkX3JhX2lkLCBjdXIpOworCWN1ciArPSA2OworCisJLyogTVMgUmFkaW8gQWNjZXNzIENhcGFiaWxpdHkgMTAuNS41LjEyYSAqLworCisJLyogT3B0aW9uYWw6IE9sZCBQLVRNU0kgU2lnbmF0dXJlLCBSZXF1ZXN0ZWQgUkVBRFkgdGltZXIsIFRNU0kgU3RhdHVzLAorCSAqIERSWCBwYXJhbWV0ZXIsIE1TIG5ldHdvcmsgY2FwYWJpbGl0eSAqLworCisJc3dpdGNoICh1cGRfdHlwZSkgeworCWNhc2UgR1BSU19VUERfVF9SQV9MQToKKwljYXNlIEdQUlNfVVBEX1RfUkFfTEFfSU1TSV9BVFQ6CisJCURFQlVHUEMoRE1NLCAiIHVuc3VwcG9ydGVkIGluIE1vZGUgSUlJLCBpcyB5b3VyIFNJMTMgY29ycnVwdD9cbiIpOworCQlyZXR1cm4gZ3NtNDhfdHhfZ21tX3JhX3VwZF9yZWoobXNnLCBHTU1fQ0FVU0VfUFJPVE9fRVJSX1VOU1BFQyk7CisJCWJyZWFrOworCWNhc2UgR1BSU19VUERfVF9SQToKKwljYXNlIEdQUlNfVVBEX1RfUEVSSU9ESUM6CisJCWJyZWFrOworCX0KKworCS8qIExvb2stdXAgdGhlIE1NIGNvbnRleHQgYmFzZWQgb24gb2xkIFJBLUlEIGFuZCBUTExJICovCisJbW1jdHggPSBzZ3NuX21tX2N0eF9ieV90bGxpKG1zZ2JfdGxsaShtc2cpLCAmb2xkX3JhX2lkKTsKKwlpZiAoIW1tY3R4IHx8IG1tY3R4LT5tbV9zdGF0ZSA9PSBHTU1fREVSRUdJU1RFUkVEKSB7CisJCS8qIFRoZSBNUyBoYXMgdG8gcGVyZm9ybSBHUFJTIGF0dGFjaCAqLworCQlERUJVR1BDKERNTSwgIiBSRUpFQ1RcbiIpOworCQlyZXR1cm4gZ3NtNDhfdHhfZ21tX3JhX3VwZF9yZWoobXNnLCBHTU1fQ0FVU0VfSU1QTF9ERVRBQ0hFRCk7CisJfQorCisJLyogVXBkYXRlIHRoZSBNTSBjb250ZXh0IHdpdGggdGhlIG5ldyBSQS1JRCAqLworCWJzc2dwX3BhcnNlX2NlbGxfaWQoJm1tY3R4LT5yYSwgbXNnYl9iY2lkKG1zZykpOworCS8qIFVwZGF0ZSB0aGUgTU0gY29udGV4dCB3aXRoIHRoZSBuZXcgVExMSSAqLworCW1tY3R4LT50bGxpID0gbXNnYl90bGxpKG1zZyk7CisJLyogRklYTUU6IFVwZGF0ZSB0aGUgTU0gY29udGV4dCB3aXRoIHRoZSBNUyByYWRpbyBhY2MgY2FwYWJpbGl0aWVzICovCisJLyogRklYTUU6IFVwZGF0ZSB0aGUgTU0gY29udGV4dCB3aXRoIHRoZSBNUyBuZXR3b3JrIGNhcGFiaWxpdGllcyAqLworCisJREVCVUdQQyhETU0sICIgQUNDRVBUXG4iKTsKKwlyZXR1cm4gZ3NtNDhfdHhfZ21tX3JhX3VwZF9hY2sobXNnKTsKK30KKworc3RhdGljIGludCBnc200OF9yeF9nbW1fc3RhdHVzKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisKKwlERUJVR1AoRE1NLCAiR1BSUyBNTSBTVEFUVVMgKGNhdXNlOiAlcylcbiIsCisJCWdldF92YWx1ZV9zdHJpbmcoZ21tX2NhdXNlX25hbWVzLCBnaC0+ZGF0YVswXSkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEdQUlMgTW9iaWxpdHkgTWFuYWdlbWVudCAqLworc3RhdGljIGludCBnc20wNDA4X3Jjdl9nbW0oc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfZ21taChtc2cpOworCWludCByYzsKKworCXN3aXRjaCAoZ2gtPm1zZ190eXBlKSB7CisJY2FzZSBHU000OF9NVF9HTU1fUkFfVVBEX1JFUToKKwkJcmMgPSBnc200OF9yeF9nbW1fcmFfdXBkX3JlcShtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX0dNTV9BVFRBQ0hfUkVROgorCQlyYyA9IGdzbTQ4X3J4X2dtbV9hdHRfcmVxKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfR01NX0lEX1JFU1A6CisJCXJjID0gZ3NtNDhfcnhfZ21tX2lkX3Jlc3AobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9HTU1fU1RBVFVTOgorCQlyYyA9IGdzbTQ4X3J4X2dtbV9zdGF0dXMobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9HTU1fUkFfVVBEX0NPTVBMOgorCQkvKiBvbmx5IGluIGNhc2UgU0dTTiBvZmZlcmVkIG5ldyBQLVRNU0kgKi8KKwljYXNlIEdTTTQ4X01UX0dNTV9BVFRBQ0hfQ09NUEw6CisJCS8qIG9ubHkgaW4gY2FzZSBTR1NOIG9mZmVyZWQgbmV3IFAtVE1TSSAqLworCWNhc2UgR1NNNDhfTVRfR01NX0RFVEFDSF9SRVE6CisJY2FzZSBHU000OF9NVF9HTU1fUFRNU0lfUkVBTExfQ09NUEw6CisJY2FzZSBHU000OF9NVF9HTU1fQVVUSF9DSVBIX1JFU1A6CisJCURFQlVHUChETU0sICJVbmltcGxlbWVudGVkIEdTTSAwNC4wOCBHTU0gbXNnIHR5cGUgMHglMDJ4XG4iLAorCQkJZ2gtPm1zZ190eXBlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREVCVUdQKERNTSwgIlVua25vd24gR1NNIDA0LjA4IEdNTSBtc2cgdHlwZSAweCUwMnhcbiIsCisJCQlnaC0+bXNnX3R5cGUpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIG1zZ2JfcHV0X3BkcF9hZGRyX2lwdjQoc3RydWN0IG1zZ2IgKm1zZywgdWludDMyX3QgaXBhZGRyKQoreworCXVpbnQ4X3Qgdls2XTsKKworCXZbMF0gPSBQRFBfVFlQRV9PUkdfSUVURjsKKwl2WzFdID0gUERQX1RZUEVfTl9JRVRGX0lQdjQ7CisJKih1aW50MzJfdCAqKSh2KzIpID0gaHRvbmwoaXBhZGRyKTsKKworCW1zZ2JfdGx2X3B1dChtc2csIEdTTTQ4X0lFX0dTTV9QRFBfQUREUiwgc2l6ZW9mKHYpLCB2KTsKK30KKworc3RhdGljIHZvaWQgbXNnYl9wdXRfcGRwX2FkZHJfcHBwKHN0cnVjdCBtc2diICptc2cpCit7CisJdWludDhfdCB2WzJdOworCisJdlswXSA9IFBEUF9UWVBFX09SR19FVFNJOworCXZbMV0gPSBQRFBfVFlQRV9OX0VUU0lfUFBQOworCisJbXNnYl90bHZfcHV0KG1zZywgR1NNNDhfSUVfR1NNX1BEUF9BRERSLCBzaXplb2YodiksIHYpOworfQorCisvKiBTZWN0aW9uIDkuNS4yOiBBdGl2YXRlIFBEUCBDb250ZXh0IEFjY2VwdCAqLworc3RhdGljIGludCBnc200OF90eF9nc21fYWN0X3BkcF9hY2Moc3RydWN0IG1zZ2IgKm9sZF9tc2csIHN0cnVjdCBnc200OF9hY3RfcGRwX2N0eF9yZXEgKnJlcSkKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpvbGRfZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX2dtbWgob2xkX21zZyk7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfYWN0X3BkcF9jdHhfYWNrICphY3RfYWNrOworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCXVpbnQ4X3QgdHJhbnNhY3Rpb25faWQgPSAoKG9sZF9naC0+cHJvdG9fZGlzY3IgPj4gNCkgXiAweDgpOyAvKiBmbGlwICovCisKKwlERUJVR1AoRE1NLCAiPC0gQUNUSVZBVEUgUERQIENPTlRFWFQgQUNLXG4iKTsKKworCWdtbV9jb3B5X2lkKG1zZywgb2xkX21zZyk7CisKKwlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX1NNX0dQUlMgfCAodHJhbnNhY3Rpb25faWQgPDwgNCk7CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfR1NNX0FDVF9QRFBfQUNLOworCisJLyogTmVnb3RpYXRlZCBMTEMgU0FQSSAqLworCW1zZ2Jfdl9wdXQobXNnLCByZXEtPnJlcV9sbGNfc2FwaSk7CisJLyogY29weSBRb1MgcGFyYW1ldGVycyBmcm9tIG9yaWdpbmFsIHJlcXVlc3QgKi8KKwltc2diX2x2X3B1dChtc2csIHNpemVvZihkZWZhdWx0X3FvcyksICh1aW50OF90ICopJmRlZmF1bHRfcW9zKTsKKwkvKiBSYWRpbyBwcmlvcml0eSAxMC41LjcuMiAqLworCW1zZ2Jfdl9wdXQobXNnLCA0KTsKKwkvKiBQRFAgYWRkcmVzcyAqLworCW1zZ2JfcHV0X3BkcF9hZGRyX2lwdjQobXNnLCAweDAxMDIwMzA0KTsKKwkvKiBPcHRpb25hbDogUHJvdG9jb2wgY29uZmlndXJhdGlvbiBvcHRpb25zICovCisJLyogT3B0aW9uYWw6IFBhY2tldCBGbG93IElkZW50aWZpZXIgKi8KKworCXJldHVybiBnc200OF9nbW1fc2VuZG1zZyhtc2csIDApOworfQorCisvKiBTZWN0aW9uIDkuNS45OiBEZWFjdGl2YXRlIFBEUCBDb250ZXh0IEFjY2VwdCAqLworc3RhdGljIGludCBnc200OF90eF9nc21fZGVhY3RfcGRwX2FjYyhzdHJ1Y3QgbXNnYiAqb2xkX21zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpvbGRfZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX2dtbWgob2xkX21zZyk7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaDsKKwl1aW50OF90IHRyYW5zYWN0aW9uX2lkID0gKChvbGRfZ2gtPnByb3RvX2Rpc2NyID4+IDQpIF4gMHg4KTsgLyogZmxpcCAqLworCisJREVCVUdQKERNTSwgIjwtIERFQUNUSVZBVEUgUERQIENPTlRFWFQgQUNLXG4iKTsKKworCWdtbV9jb3B5X2lkKG1zZywgb2xkX21zZyk7CisKKwlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX1NNX0dQUlMgfCAodHJhbnNhY3Rpb25faWQgPDwgNCk7CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfR1NNX0RFQUNUX1BEUF9BQ0s7CisKKwlyZXR1cm4gZ3NtNDhfZ21tX3NlbmRtc2cobXNnLCAwKTsKK30KKworLyogU2VjdGlvbiA5LjUuMTogQWN0aXZhdGUgUERQIENvbnRleHQgUmVxdWVzdCAqLworc3RhdGljIGludCBnc200OF9yeF9nc21fYWN0X3BkcF9yZXEoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfZ21taChtc2cpOworCXN0cnVjdCBnc200OF9hY3RfcGRwX2N0eF9yZXEgKmFjdF9yZXEgPSAoc3RydWN0IGdzbTQ4X2FjdF9wZHBfY3R4X3JlcSAqKSBnaC0+ZGF0YTsKKwl1aW50OF90ICpwZHBfYWRkcl9sdiA9IGFjdF9yZXEtPmRhdGE7CisJdWludDhfdCByZXFfcW9zX2xlbiwgcmVxX3BkcGFfbGVuOworCXVpbnQ4X3QgKnJlcV9xb3MsICpyZXFfcGRwYTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKworCURFQlVHUChETU0sICJBQ1RJVkFURSBQRFAgQ09OVEVYVCBSRVE6ICIpOworCXJlcV9xb3NfbGVuID0gYWN0X3JlcS0+ZGF0YVswXTsKKwlyZXFfcW9zID0gYWN0X3JlcS0+ZGF0YSArIDE7CS8qIDEwLjUuNi41ICovCisJcmVxX3BkcGFfbGVuID0gYWN0X3JlcS0+ZGF0YVsxICsgcmVxX3Fvc19sZW5dOworCXJlcV9wZHBhID0gYWN0X3JlcS0+ZGF0YSArIDEgKyByZXFfcW9zX2xlbiArIDE7CS8qIDEwLjUuNi40ICovCisKKwlzd2l0Y2ggKHJlcV9wZHBhWzBdICYgMHhmKSB7CisJY2FzZSAweDA6CisJCURFQlVHUEMoRE1NLCAiRVRTSSAiKTsKKwkJYnJlYWs7CisJY2FzZSAweDE6CisJCURFQlVHUEMoRE1NLCAiSUVURiAiKTsKKwkJYnJlYWs7CisJY2FzZSAweGY6CisJCURFQlVHUEMoRE1NLCAiRW1wdHkgIik7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAocmVxX3BkcGFbMV0pIHsKKwljYXNlIDB4MjE6CisJCURFQlVHUEMoRE1NLCAiSVB2NCAiKTsKKwkJaWYgKHJlcV9wZHBhX2xlbiA+PSA2KSB7CisJCQlzdHJ1Y3QgaW5fYWRkciBpYTsKKwkJCWlhLnNfYWRkciA9IG50b2hsKCooKHVpbnQzMl90ICopIChyZXFfcGRwYSsyKSkpOworCQkJREVCVUdQQyhETU0sICIlcyAiLCBpbmV0X250b2EoaWEpKTsKKwkJfQorCQlicmVhazsKKwljYXNlIDB4NTc6CisJCURFQlVHUEMoRE1NLCAiSVB2NiAiKTsKKwkJaWYgKHJlcV9wZHBhX2xlbiA+PSAxOCkgeworCQkJLyogRklYTUU6IHByaW50IElQdjYgYWRkcmVzcyAqLworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CQorCQlERUJVR1BDKERNTSwgIjB4JTAyeCAiLCByZXFfcGRwYVsxXSk7CisJCWJyZWFrOworCX0KKworCS8qIEZJWE1FOiBwYXJzZSBUTFYgZm9yIEFQIG5hbWUgYW5kIHByb3RvY29sIGNvbmZpZyBvcHRpb25zICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0dTTV9BUE4pKSB7fQorCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9HU01fUFJPVE9fQ09ORl9PUFQpKSB7fQorCisJcmV0dXJuIGdzbTQ4X3R4X2dzbV9hY3RfcGRwX2FjYyhtc2csIGFjdF9yZXEpOworfQorCisvKiBTZWN0aW9uIDkuNS44OiBEZWFjdGl2YXRlIFBEUCBDb250ZXh0IFJlcXVlc3QgKi8KK3N0YXRpYyBpbnQgZ3NtNDhfcnhfZ3NtX2RlYWN0X3BkcF9yZXEoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfZ21taChtc2cpOworCisJREVCVUdQKERNTSwgIkRFQUNUSVZBVEUgUERQIENPTlRFWFQgUkVRIChjYXVzZTogJXMpXG4iLAorCQlnZXRfdmFsdWVfc3RyaW5nKGdzbV9jYXVzZV9uYW1lcywgZ2gtPmRhdGFbMF0pKTsKKworCXJldHVybiBnc200OF90eF9nc21fZGVhY3RfcGRwX2FjYyhtc2cpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X3J4X2dzbV9zdGF0dXMoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKworCURFQlVHUChETU0sICJHUFJTIFNNIFNUQVRVUyAoY2F1c2U6ICVzKVxuIiwKKwkJZ2V0X3ZhbHVlX3N0cmluZyhnc21fY2F1c2VfbmFtZXMsIGdoLT5kYXRhWzBdKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogR1BSUyBTZXNzaW9uIE1hbmFnZW1lbnQgKi8KK3N0YXRpYyBpbnQgZ3NtMDQwOF9yY3ZfZ3NtKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX2dtbWgobXNnKTsKKwlpbnQgcmM7CisKKwlzd2l0Y2ggKGdoLT5tc2dfdHlwZSkgeworCWNhc2UgR1NNNDhfTVRfR1NNX0FDVF9QRFBfUkVROgorCQlyYyA9IGdzbTQ4X3J4X2dzbV9hY3RfcGRwX3JlcShtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX0dTTV9ERUFDVF9QRFBfUkVROgorCQlyYyA9IGdzbTQ4X3J4X2dzbV9kZWFjdF9wZHBfcmVxKG1zZyk7CisJY2FzZSBHU000OF9NVF9HU01fU1RBVFVTOgorCQlyYyA9IGdzbTQ4X3J4X2dzbV9zdGF0dXMobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9HU01fUkVRX1BEUF9BQ1RfUkVKOgorCWNhc2UgR1NNNDhfTVRfR1NNX0FDVF9BQV9QRFBfUkVROgorCWNhc2UgR1NNNDhfTVRfR1NNX0RFQUNUX0FBX1BEUF9SRVE6CisJCURFQlVHUChETU0sICJVbmltcGxlbWVudGVkIEdTTSAwNC4wOCBHU00gbXNnIHR5cGUgMHglMDJ4XG4iLAorCQkJZ2gtPm1zZ190eXBlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREVCVUdQKERNTSwgIlVua25vd24gR1NNIDA0LjA4IEdTTSBtc2cgdHlwZSAweCUwMnhcbiIsCisJCQlnaC0+bXNnX3R5cGUpOworCQlicmVhazsKKworCX0KKworCXJldHVybiByYzsKK30KKworLyogTWFpbiBlbnRyeSBwb2ludCBmb3IgaW5jb21pbmcgMDQuMDggR1BSUyBtZXNzYWdlcyAqLworaW50IGdzbTA0MDhfZ3Byc19yY3Ztc2coc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfZ21taChtc2cpOworCXVpbnQ4X3QgcGRpc2MgPSBnaC0+cHJvdG9fZGlzY3IgJiAweDBmOworCWludCByYyA9IC1FSU5WQUw7CisKKwlzd2l0Y2ggKHBkaXNjKSB7CisJY2FzZSBHU000OF9QRElTQ19NTV9HUFJTOgorCQlyYyA9IGdzbTA0MDhfcmN2X2dtbShtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X1BESVNDX1NNX0dQUlM6CisJCXJjID0gZ3NtMDQwOF9yY3ZfZ3NtKG1zZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUChETU0sICJVbmtub3duIEdTTSAwNC4wOCBkaXNjcmltaW5hdG9yIDB4JTAyeFxuIiwKKwkJCXBkaXNjKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3Bycy9vc21vX2dicHJveHkuY2ZnIGIvb3BlbmJzYy9zcmMvZ3Bycy9vc21vX2dicHJveHkuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZWYxNDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ncHJzL29zbW9fZ2Jwcm94eS5jZmcKQEAgLTAsMCArMSwxMyBAQAorIQorISBPcGVuQlNDIGNvbmZpZ3VyYXRpb24gc2F2ZWQgZnJvbSB2dHkKKyEgICAhCishCitsaW5lIHZ0eQorIG5vIGxvZ2luCishCitnYnByb3h5CisgIG5zaXAgYnNzIGxvY2FsIHBvcnQgMjMwMDAKKyAgbnNpcCBzZ3NuIHJlbW90ZSBpcCAxOTIuMTY4LjEwMC4yMzkKKyAgbnNpcCBzZ3NuIHJlbW90ZSBwb3J0IDIzMDAwCisgIG5zaXAgc2dzbiBuc2VpIDEKKyAgbnNpcCBzZ3NuIG5zdmNpIDExCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ncHJzL29zbW9fc2dzbi5jZmcgYi9vcGVuYnNjL3NyYy9ncHJzL29zbW9fc2dzbi5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM5ZTg1MwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dwcnMvb3Ntb19zZ3NuLmNmZwpAQCAtMCwwICsxLDkgQEAKKyEKKyEgT3BlbkJTQyBjb25maWd1cmF0aW9uIHNhdmVkIGZyb20gdnR5CishICAgIQorIQorbGluZSB2dHkKKyBubyBsb2dpbgorIQorc2dzbgorICBuc2lwIGxvY2FsIHBvcnQgMjMwMDAKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dwcnMvc2dzbl9tYWluLmMgYi9vcGVuYnNjL3NyYy9ncHJzL3Nnc25fbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1Zjc2MGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ncHJzL3Nnc25fbWFpbi5jCkBAIC0wLDAgKzEsMTQzIEBACisvKiBHUFJTIFNHU04gSW1wbGVtZW50YXRpb24gKi8KKworLyogKEMpIDIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDEwIGJ5IE9uIFdhdmVzCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKworI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdGVsbmV0X2ludGVyZmFjZS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdnR5Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zZ3NuLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX25zLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX2Jzc2dwLmg+CisKKyNpbmNsdWRlICIuLi8uLi9ic2Njb25maWcuaCIKKworLyogdGhpcyBpcyBoZXJlIGZvciB0aGUgdnR5Li4uIGl0IHdpbGwgbmV2ZXIgYmUgY2FsbGVkICovCit2b2lkIHN1YnNjcl9wdXQoKSB7IGFib3J0KCk7IH0KKworI2RlZmluZSBfR05VX1NPVVJDRQorI2luY2x1ZGUgPGdldG9wdC5oPgorCit2b2lkICp0YWxsX2JzY19jdHg7CisKK3N0cnVjdCBncHJzX25zX2luc3QgKnNnc25fbnNpOworCitjb25zdCBjaGFyICpvcGVuYnNjX3ZlcnNpb24gPSAiT3Ntb2NvbSBOU0lQIFByb3h5ICIgUEFDS0FHRV9WRVJTSU9OOworY29uc3QgY2hhciAqb3BlbmJzY19jb3B5cmlnaHQgPQorCSJDb3B5cmlnaHQgKEMpIDIwMTAgSGFyYWxkIFdlbHRlIGFuZCBPbi1XYXZlc1xuIgorCSJDb250cmlidXRpb25zIGJ5IERhbmllbCBXaWxsbWFubiwgSmFuIEzDvGJiZSwgU3RlZmFuIFNjaG1pZHRcbiIKKwkiRGlldGVyIFNwYWFyLCBBbmRyZWFzIEV2ZXJzYmVyZywgSG9sZ2VyIEZyZXl0aGVyXG5cbiIKKwkiTGljZW5zZSBHUEx2Mis6IEdOVSBHUEwgdmVyc2lvbiAyIG9yIGxhdGVyIDxodHRwOi8vZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbD5cbiIKKwkiVGhpcyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgYXJlIGZyZWUgdG8gY2hhbmdlIGFuZCByZWRpc3RyaWJ1dGUgaXQuXG4iCisJIlRoZXJlIGlzIE5PIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXcuXG4iOworCitzdGF0aWMgY2hhciAqY29uZmlnX2ZpbGUgPSAib3Ntb19zZ3NuLmNmZyI7CitzdGF0aWMgc3RydWN0IHNnc25fY29uZmlnIHNnY2ZnOworCisvKiBjYWxsLWJhY2sgZnVuY3Rpb24gZm9yIHRoZSBOUyBwcm90b2NvbCAqLworc3RhdGljIGludCBzZ3NuX25zX2NiKGVudW0gZ3Byc19uc19ldnQgZXZlbnQsIHN0cnVjdCBncHJzX25zdmMgKm5zdmMsCisJCSAgICAgIHN0cnVjdCBtc2diICptc2csIHVfaW50MTZfdCBidmNpKQoreworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBHUFJTX05TX0VWVF9VTklUX0RBVEE6CisJCS8qIGhhbmQgdGhlIG1lc3NhZ2UgaW50byB0aGUgQlNTR1AgaW1wbGVtZW50YXRpb24gKi8KKwkJcmMgPSBncHJzX2Jzc2dwX3Jjdm1zZyhtc2cpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERHUFJTLCBMT0dMX0VSUk9SLCAiU0dTTjogVW5rbm93biBldmVudCAldSBmcm9tIE5TXG4iLCBldmVudCk7CisJCWlmIChtc2cpCisJCQl0YWxsb2NfZnJlZShtc2cpOworCQlyYyA9IC1FSU87CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmM7Cit9CisKKy8qIE5TSSB0aGF0IEJTU0dQIHVzZXMgd2hlbiB0cmFuc21pdHRpbmcgb24gTlMgKi8KK2V4dGVybiBzdHJ1Y3QgZ3Byc19uc19pbnN0ICpic3NncF9uc2k7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgZHVtbXlfbmV0d29yazsKKwlzdHJ1Y3QgbG9nX3RhcmdldCAqc3RkZXJyX3RhcmdldDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOworCWludCByYzsKKworCXRhbGxfYnNjX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdChOVUxMLCAwLCAib3Ntb19zZ3NuIik7CisKKwlsb2dfaW5pdCgmbG9nX2luZm8pOworCXN0ZGVycl90YXJnZXQgPSBsb2dfdGFyZ2V0X2NyZWF0ZV9zdGRlcnIoKTsKKwlsb2dfYWRkX3RhcmdldChzdGRlcnJfdGFyZ2V0KTsKKwlsb2dfc2V0X2FsbF9maWx0ZXIoc3RkZXJyX3RhcmdldCwgMSk7CisKKwl0ZWxuZXRfaW5pdCgmZHVtbXlfbmV0d29yaywgNDI0NSk7CisJcmMgPSBzZ3NuX3BhcnNlX2NvbmZpZyhjb25maWdfZmlsZSwgJnNnY2ZnKTsKKwlpZiAocmMgPCAwKSB7CisJCUxPR1AoREdQUlMsIExPR0xfRkFUQUwsICJDYW5ub3QgcGFyc2UgY29uZmlnIGZpbGVcbiIpOworCQlleGl0KDIpOworCX0KKworCXNnc25fbnNpID0gZ3Byc19uc19pbnN0YW50aWF0ZSgmc2dzbl9uc19jYik7CisJaWYgKCFzZ3NuX25zaSkgeworCQlMT0dQKERHUFJTLCBMT0dMX0VSUk9SLCAiVW5hYmxlIHRvIGluc3RhbnRpYXRlIE5TXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisJYnNzZ3BfbnNpID0gc2djZmcubnNpID0gc2dzbl9uc2k7CisJbnNpcF9saXN0ZW4oc2dzbl9uc2ksIHNnY2ZnLm5zaXBfbGlzdGVuX3BvcnQpOworCisJd2hpbGUgKDEpIHsKKwkJcmMgPSBic2Nfc2VsZWN0X21haW4oMCk7CisJCWlmIChyYyA8IDApCisJCQlleGl0KDMpOworCX0KKworCWV4aXQoMCk7Cit9CisKK3N0cnVjdCBnc21fbmV0d29yazsKK2ludCBic2NfdnR5X2luaXQoc3RydWN0IGdzbV9uZXR3b3JrICpkdW1teSkKK3sKKwljbWRfaW5pdCgxKTsKKwl2dHlfaW5pdCgpOworCisJb3BlbmJzY192dHlfYWRkX2NtZHMoKTsKKyAgICAgICAgc2dzbl92dHlfaW5pdCgpOworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ncHJzL3Nnc25fdnR5LmMgYi9vcGVuYnNjL3NyYy9ncHJzL3Nnc25fdnR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMxOGZjYgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dwcnMvc2dzbl92dHkuYwpAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIChDKSAyMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAxMCBieSBPbi1XYXZlcworICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zZ3NuLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX25zLmg+CisKKyNpbmNsdWRlIDx2dHkvY29tbWFuZC5oPgorI2luY2x1ZGUgPHZ0eS92dHkuaD4KKworc3RhdGljIHN0cnVjdCBzZ3NuX2NvbmZpZyAqZ19jZmcgPSBOVUxMOworCitzdGF0aWMgc3RydWN0IGNtZF9ub2RlIHNnc25fbm9kZSA9IHsKKwlTR1NOX05PREUsCisJIiVzKHNnc24pIyIsCisJMSwKK307CisKK3N0YXRpYyBpbnQgY29uZmlnX3dyaXRlX3Nnc24oc3RydWN0IHZ0eSAqdnR5KQoreworCXN0cnVjdCBpbl9hZGRyIGlhOworCisJdnR5X291dCh2dHksICJzZ3NuJXMiLCBWVFlfTkVXTElORSk7CisKKwlpZiAoZ19jZmctPm5zaXBfbGlzdGVuX2lwKSB7CisJCWlhLnNfYWRkciA9IGh0b25sKGdfY2ZnLT5uc2lwX2xpc3Rlbl9pcCk7CisJCXZ0eV9vdXQodnR5LCAiICBuc2lwIGxvY2FsIGlwICVzJXMiLCBpbmV0X250b2EoaWEpLAorCQkJVlRZX05FV0xJTkUpOworCX0KKwl2dHlfb3V0KHZ0eSwgIiAgbnNpcCBsb2NhbCBwb3J0ICV1JXMiLCBnX2NmZy0+bnNpcF9saXN0ZW5fcG9ydCwKKwkJVlRZX05FV0xJTkUpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihzaG93X3Nnc24sIHNob3dfc2dzbl9jbWQsICJzaG93IHNnc24iLAorICAgICAgU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFNHU04iKQoreworCS8qIEZJWE1FOiBpdGVyYXRlIG92ZXIgbGlzdCBvZiBOUy1WQydzIGFuZCBkaXNwbGF5IHRoZWlyIHN0YXRlICovCisJc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpID0gZ19jZmctPm5zaTsKKwlzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkobnN2YywgJm5zaS0+Z3Byc19uc3ZjcywgbGlzdCkgeworCQl2dHlfb3V0KHZ0eSwgIk5TRUkgJTV1LCBOUy1WQyAlNXUsICVzLW1vZGUsICVzICVzJXMiLAorCQkJbnN2Yy0+bnNlaSwgbnN2Yy0+bnN2Y2ksCisJCQluc3ZjLT5yZW1vdGVfZW5kX2lzX3Nnc24gPyAiQlNTIiA6ICJTR1NOIiwKKwkJCW5zdmMtPnN0YXRlICYgTlNFX1NfQUxJVkUgPyAiQUxJVkUiIDogIkRFQUQiLAorCQkJbnN2Yy0+c3RhdGUgJiBOU0VfU19CTE9DS0VEID8gIkJMT0NLRUQiIDogIlVOQkxPQ0tFRCIsCisJCQlWVFlfTkVXTElORSk7CisJCWlmIChuc3ZjLT5uc2ktPmxsID09IEdQUlNfTlNfTExfVURQKQorCQkJdnR5X291dCh2dHksICIgIHJlbW90ZSBwZWVyICVzOiV1JXMiLAorCQkJCWluZXRfbnRvYShuc3ZjLT5pcC5idHNfYWRkci5zaW5fYWRkciksCisJCQkJbnRvaHMobnN2Yy0+aXAuYnRzX2FkZHIuc2luX3BvcnQpLCBWVFlfTkVXTElORSk7CisJfQorCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfc2dzbiwKKyAgICAgIGNmZ19zZ3NuX2NtZCwKKyAgICAgICJzZ3NuIiwKKyAgICAgICJDb25maWd1cmUgdGhlIFNHU04iKQoreworCXZ0eS0+bm9kZSA9IFNHU05fTk9ERTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKworREVGVU4oY2ZnX25zaXBfbG9jYWxfaXAsCisgICAgICBjZmdfbnNpcF9sb2NhbF9pcF9jbWQsCisgICAgICAibnNpcCBsb2NhbCBpcCBBLkIuQy5EIiwKKyAgICAgICJTZXQgdGhlIElQIGFkZHJlc3Mgb24gd2hpY2ggd2UgbGlzdGVuIGZvciBCU1MgY29ubmVjdHMiKQoreworCXN0cnVjdCBpbl9hZGRyIGlhOworCisJaW5ldF9hdG9uKGFyZ3ZbMF0sICZpYSk7CisJZ19jZmctPm5zaXBfbGlzdGVuX2lwID0gbnRvaGwoaWEuc19hZGRyKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25zaXBfbG9jYWxfcG9ydCwKKyAgICAgIGNmZ19uc2lwX2xvY2FsX3BvcnRfY21kLAorICAgICAgIm5zaXAgbG9jYWwgcG9ydCA8MC02NTUzND4iLAorICAgICAgIlNldCB0aGUgVURQIHBvcnQgb24gd2hpY2ggd2UgbGlzdGVuIGZvciBCU1MgY29ubmVjdHMiKQoreworCXVuc2lnbmVkIGludCBwb3J0ID0gYXRvaShhcmd2WzBdKTsKKworCWdfY2ZnLT5uc2lwX2xpc3Rlbl9wb3J0ID0gcG9ydDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKworCisKK2ludCBzZ3NuX3Z0eV9pbml0KHZvaWQpCit7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfc2dzbl9jbWQpOworCisJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmY2ZnX3Nnc25fY21kKTsKKwlpbnN0YWxsX25vZGUoJnNnc25fbm9kZSwgY29uZmlnX3dyaXRlX3Nnc24pOworCWluc3RhbGxfZGVmYXVsdChTR1NOX05PREUpOworCWluc3RhbGxfZWxlbWVudChTR1NOX05PREUsICZjZmdfbnNpcF9sb2NhbF9pcF9jbWQpOworCWluc3RhbGxfZWxlbWVudChTR1NOX05PREUsICZjZmdfbnNpcF9sb2NhbF9wb3J0X2NtZCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNnc25fcGFyc2VfY29uZmlnKGNvbnN0IGNoYXIgKmNvbmZpZ19maWxlLCBzdHJ1Y3Qgc2dzbl9jb25maWcgKmNmZykKK3sKKwlpbnQgcmM7CisKKwlnX2NmZyA9IGNmZzsKKwlyYyA9IHZ0eV9yZWFkX2NvbmZpZ19maWxlKGNvbmZpZ19maWxlKTsKKwlpZiAocmMgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHBhcnNlIHRoZSBjb25maWcgZmlsZTogJyVzJ1xuIiwgY29uZmlnX2ZpbGUpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9nc21fMDRfMDguYyBiL29wZW5ic2Mvc3JjL2dzbV8wNF8wOC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZTU1NDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9nc21fMDRfMDguYwpAQCAtMCwwICsxLDI5MzYgQEAKKy8qIEdTTSBNb2JpbGUgUmFkaW8gSW50ZXJmYWNlIExheWVyIDMgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZQorICogM0dQUCBUUyAwNC4wOCB2ZXJzaW9uIDcuMjEuMCBSZWxlYXNlIDE5OTggLyBFVFNJIFRTIDEwMCA5NDAgVjcuMjEuMCAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOCwgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9kYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9iaXR2ZWMuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbV91dGlscy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8xMS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvY2hhbl9hbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcGFnaW5nLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RyYXVfZnJhbWUuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RyYXVfbXV4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ydHBfcHJveHkuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc200OC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdHJhbnNhY3Rpb24uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3Vzc2QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpbGVudF9jYWxsLmg+CisKK3ZvaWQgKnRhbGxfbG9jb3BfY3R4OworCitpbnQgZ3NtMDQwOF9sb2NfdXBkX2FjYyhzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQzMl90IHRtc2kpOworc3RhdGljIGludCBnc200OF90eF9zaW1wbGUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sCisJCQkgICB1X2ludDhfdCBwZGlzYywgdV9pbnQ4X3QgbXNnX3R5cGUpOworc3RhdGljIHZvaWQgc2NoZWR1bGVfcmVqZWN0KHN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uKTsKKworc3RydWN0IGdzbV9sYWkgeworCXVfaW50MTZfdCBtY2M7CisJdV9pbnQxNl90IG1uYzsKKwl1X2ludDE2X3QgbGFjOworfTsKKworc3RhdGljIHVfaW50MzJfdCBuZXdfY2FsbHJlZiA9IDB4ODAwMDAwMDE7CisKK3N0YXRpYyBpbnQgYXV0aG9yaXplX3N1YnNjcmliZXIoc3RydWN0IGdzbV9sb2NfdXBkYXRpbmdfb3BlcmF0aW9uICpsb2MsCisJCQkJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JpYmVyKQoreworCWlmICghc3Vic2NyaWJlcikKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIERvIG5vdCBzZW5kIGFjY2VwdCB5ZXQgYXMgbW9yZSBpbmZvcm1hdGlvbiBzaG91bGQgYXJyaXZlLiBTb21lCisJICogcGhvbmVzIHdpbGwgbm90IHNlbmQgdXMgdGhlIGluZm9ybWF0aW9uIGFuZCB3ZSB3aWxsIGhhdmUgdG8gY2hlY2sKKwkgKiB3aGF0IHdlIHdhbnQgdG8gZG8gd2l0aCB0aGF0LgorCSAqLworCWlmIChsb2MgJiYgKGxvYy0+d2FpdGluZ19mb3JfaW1zaSB8fCBsb2MtPndhaXRpbmdfZm9yX2ltZWkpKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoc3Vic2NyaWJlci0+bmV0LT5hdXRoX3BvbGljeSkgeworCWNhc2UgR1NNX0FVVEhfUE9MSUNZX0NMT1NFRDoKKwkJcmV0dXJuIHN1YnNjcmliZXItPmF1dGhvcml6ZWQ7CisJY2FzZSBHU01fQVVUSF9QT0xJQ1lfVE9LRU46CisJCWlmIChzdWJzY3JpYmVyLT5hdXRob3JpemVkKQorCQkJcmV0dXJuIHN1YnNjcmliZXItPmF1dGhvcml6ZWQ7CisJCXJldHVybiAoc3Vic2NyaWJlci0+ZmxhZ3MgJiBHU01fU1VCU0NSSUJFUl9GSVJTVF9DT05UQUNUKTsKKwljYXNlIEdTTV9BVVRIX1BPTElDWV9BQ0NFUFRfQUxMOgorCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfbG9jX3VwZGF0aW5nX3JlcShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubikKK3sKKwlpZiAoIWNvbm4tPmxvY19vcGVyYXRpb24pCisJCXJldHVybjsKKworCWJzY19kZWxfdGltZXIoJmNvbm4tPmxvY19vcGVyYXRpb24tPnVwZGF0aW5nX3RpbWVyKTsKKwl0YWxsb2NfZnJlZShjb25uLT5sb2Nfb3BlcmF0aW9uKTsKKwljb25uLT5sb2Nfb3BlcmF0aW9uID0gMDsKKwlwdXRfc3Vic2NyX2Nvbihjb25uKTsKK30KKworc3RhdGljIHZvaWQgYWxsb2NhdGVfbG9jX3VwZGF0aW5nX3JlcShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubikKK3sKKwl1c2Vfc3Vic2NyX2Nvbihjb25uKQorCXJlbGVhc2VfbG9jX3VwZGF0aW5nX3JlcShjb25uKTsKKworCWNvbm4tPmxvY19vcGVyYXRpb24gPSB0YWxsb2NfemVybyh0YWxsX2xvY29wX2N0eCwKKwkJCQkJICAgc3RydWN0IGdzbV9sb2NfdXBkYXRpbmdfb3BlcmF0aW9uKTsKK30KKworc3RhdGljIGludCBnc20wNDA4X2F1dGhvcml6ZShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubiwgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlpZiAoYXV0aG9yaXplX3N1YnNjcmliZXIoY29ubi0+bG9jX29wZXJhdGlvbiwgY29ubi0+c3Vic2NyKSkgeworCQlpbnQgcmM7CisKKwkJZGJfc3Vic2NyaWJlcl9hbGxvY190bXNpKGNvbm4tPnN1YnNjcik7CisJCXJlbGVhc2VfbG9jX3VwZGF0aW5nX3JlcShjb25uKTsKKwkJcmMgPSBnc20wNDA4X2xvY191cGRfYWNjKG1zZy0+bGNoYW4sIGNvbm4tPnN1YnNjci0+dG1zaSk7CisJCWlmIChtc2ctPmxjaGFuLT50cy0+dHJ4LT5idHMtPm5ldHdvcmstPnNlbmRfbW1faW5mbykgeworCQkJLyogc2VuZCBNTSBJTkZPIHdpdGggbmV0d29yayBuYW1lICovCisJCQlyYyA9IGdzbTQ4X3R4X21tX2luZm8obXNnLT5sY2hhbik7CisJCX0KKworCQkvKiBjYWxsIHN1YnNjcl91cGRhdGUgYWZ0ZXIgcHV0dGluZyB0aGUgbG9jX3VwZF9hY2MKKwkJICogaW4gdGhlIHRyYW5zbWl0IHF1ZXVlLCBzaW5jZSBTX1NVQlNDUl9BVFRBQ0hFRCBtaWdodAorCQkgKiB0cmlnZ2VyIGZ1cnRoZXIgYWN0aW9uIGxpa2UgU01TIGRlbGl2ZXJ5ICovCisJCXN1YnNjcl91cGRhdGUoY29ubi0+c3Vic2NyLCBtc2ctPnRyeC0+YnRzLAorCQkJICAgICAgR1NNX1NVQlNDUklCRVJfVVBEQVRFX0FUVEFDSEVEKTsKKworCQkvKiB0cnkgdG8gY2xvc2UgY2hhbm5lbCBBU0FQICovCisJCWxjaGFuX2F1dG9fcmVsZWFzZShjb25uLT5sY2hhbik7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnc20wNDA4X2hhbmRsZV9sY2hhbl9zaWduYWwodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJCQkJdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgKnRlbXA7CisKKwlpZiAoc3Vic3lzICE9IFNTX0xDSEFOIHx8IHNpZ25hbCAhPSBTX0xDSEFOX1VORVhQRUNURURfUkVMRUFTRSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIENhbmNlbCBhbnkgb3V0c3RhbmRpbmcgbG9jYXRpb24gdXBkYXRpbmcgcmVxdWVzdAorCSAqIG9wZXJhdGlvbiB0YWtpbmcgcGxhY2Ugb24gdGhlIGxjaGFuLgorCSAqLworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gKHN0cnVjdCBnc21fbGNoYW4gKilzaWduYWxfZGF0YTsKKwlpZiAoIWxjaGFuKQorCQlyZXR1cm4gMDsKKworCXJlbGVhc2VfbG9jX3VwZGF0aW5nX3JlcSgmbGNoYW4tPmNvbm4pOworCisJLyogRnJlZSBhbGwgdHJhbnNhY3Rpb25zIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVsZWFzZWQgbGNoYW4gKi8KKwkvKiBGSVhNRTogdGhpcyBpcyBub3QgbmVjY2Vzc2FyaWx5IHRoZSByaWdodCB0aGluZyB0byBkbywgd2Ugc2hvdWxkCisJICogb25seSBzZXQgdHJhbnMtPmxjaGFuIHRvIE5VTEwgYW5kIHdhaXQgZm9yIGFub3RoZXIgbGNoYW4gdG8gYmUKKwkgKiBlc3RhYmxpc2hlZCB0byB0aGUgc2FtZSBNTSBlbnRpdHkgKHBob25lL3N1YnNjcmliZXIpICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0cmFucywgdGVtcCwgJmxjaGFuLT50cy0+dHJ4LT5idHMtPm5ldHdvcmstPnRyYW5zX2xpc3QsIGVudHJ5KSB7CisJCWlmICh0cmFucy0+Y29ubiAmJiB0cmFucy0+Y29ubi0+bGNoYW4gPT0gbGNoYW4pCisJCQl0cmFuc19mcmVlKHRyYW5zKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2hhcHRlciA5LjIuMTQgOiBTZW5kIExPQ0FUSU9OIFVQREFUSU5HIFJFSkVDVCAqLworaW50IGdzbTA0MDhfbG9jX3VwZF9yZWooc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGNhdXNlKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uOworCXN0cnVjdCBnc21fYnRzICpidHMgPSBsY2hhbi0+dHMtPnRyeC0+YnRzOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisJCisJbXNnLT5sY2hhbiA9IGxjaGFuOworCWNvbm4gPSAmbGNoYW4tPmNvbm47CisKKwlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkgKyAxKTsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19NTTsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9NTV9MT0NfVVBEX1JFSkVDVDsKKwlnaC0+ZGF0YVswXSA9IGNhdXNlOworCisJTE9HUChETU0sIExPR0xfSU5GTywgIlN1YnNjcmliZXIgJXM6IExPQ0FUSU9OIFVQREFUSU5HIFJFSkVDVCAiCisJICAgICAiTEFDPSV1IEJUUz0ldVxuIiwgY29ubi0+c3Vic2NyID8KKwkgICAgIAkJCXN1YnNjcl9uYW1lKGNvbm4tPnN1YnNjcikgOiAidW5rbm93biIsCisJICAgICBsY2hhbi0+dHMtPnRyeC0+YnRzLT5sb2NhdGlvbl9hcmVhX2NvZGUsIGxjaGFuLT50cy0+dHJ4LT5idHMtPm5yKTsKKworCWNvdW50ZXJfaW5jKGJ0cy0+bmV0d29yay0+c3RhdHMubG9jX3VwZF9yZXNwLnJlamVjdCk7CisJCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCBOVUxMKTsKK30KKworLyogQ2hhcHRlciA5LjIuMTMgOiBTZW5kIExPQ0FUSU9OIFVQREFURSBBQ0NFUFQgKi8KK2ludCBnc20wNDA4X2xvY191cGRfYWNjKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDMyX3QgdG1zaSkKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gbGNoYW4tPnRzLT50cngtPmJ0czsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCXN0cnVjdCBnc200OF9sb2NfYXJlYV9pZCAqbGFpOworCXVfaW50OF90ICptaWQ7CisJCisJbXNnLT5sY2hhbiA9IGxjaGFuOworCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19NTTsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9NTV9MT0NfVVBEX0FDQ0VQVDsKKworCWxhaSA9IChzdHJ1Y3QgZ3NtNDhfbG9jX2FyZWFfaWQgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmxhaSkpOworCWdzbTQ4X2dlbmVyYXRlX2xhaShsYWksIGJ0cy0+bmV0d29yay0+Y291bnRyeV9jb2RlLAorCQkgICAgIGJ0cy0+bmV0d29yay0+bmV0d29ya19jb2RlLCBidHMtPmxvY2F0aW9uX2FyZWFfY29kZSk7CisKKwltaWQgPSBtc2diX3B1dChtc2csIEdTTTQ4X01JRF9UTVNJX0xFTik7CisJZ3NtNDhfZ2VuZXJhdGVfbWlkX2Zyb21fdG1zaShtaWQsIHRtc2kpOworCisJREVCVUdQKERNTSwgIi0+IExPQ0FUSU9OIFVQREFURSBBQ0NFUFRcbiIpOworCisJY291bnRlcl9pbmMoYnRzLT5uZXR3b3JrLT5zdGF0cy5sb2NfdXBkX3Jlc3AuYWNjZXB0KTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7Cit9CisKKy8qIFRyYW5zbWl0IENoYXB0ZXIgOS4yLjEwIElkZW50aXR5IFJlcXVlc3QgKi8KK3N0YXRpYyBpbnQgbW1fdHhfaWRlbnRpdHlfcmVxKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBpZF90eXBlKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisKKwltc2ctPmxjaGFuID0gbGNoYW47CisKKwlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkgKyAxKTsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19NTTsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9NTV9JRF9SRVE7CisJZ2gtPmRhdGFbMF0gPSBpZF90eXBlOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCBOVUxMKTsKK30KKworCisvKiBQYXJzZSBDaGFwdGVyIDkuMi4xMSBJZGVudGl0eSBSZXNwb25zZSAqLworc3RhdGljIGludCBtbV9yeF9pZF9yZXNwKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm47CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBtc2ctPmxjaGFuOworCXN0cnVjdCBnc21fYnRzICpidHMgPSBsY2hhbi0+dHMtPnRyeC0+YnRzOworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gYnRzLT5uZXR3b3JrOworCXVfaW50OF90IG1pX3R5cGUgPSBnaC0+ZGF0YVsxXSAmIEdTTV9NSV9UWVBFX01BU0s7CisJY2hhciBtaV9zdHJpbmdbR1NNNDhfTUlfU0laRV07CisKKwlnc200OF9taV90b19zdHJpbmcobWlfc3RyaW5nLCBzaXplb2YobWlfc3RyaW5nKSwgJmdoLT5kYXRhWzFdLCBnaC0+ZGF0YVswXSk7CisJREVCVUdQKERNTSwgIklERU5USVRZIFJFU1BPTlNFOiBtaV90eXBlPTB4JTAyeCBNSSglcylcbiIsCisJCW1pX3R5cGUsIG1pX3N0cmluZyk7CisKKwljb25uID0gJmxjaGFuLT5jb25uOworCisJZGlzcGF0Y2hfc2lnbmFsKFNTX1NVQlNDUiwgU19TVUJTQ1JfSURFTlRJVFksIGdoLT5kYXRhKTsKKworCXN3aXRjaCAobWlfdHlwZSkgeworCWNhc2UgR1NNX01JX1RZUEVfSU1TSToKKwkJLyogbG9vayB1cCBzdWJzY3JpYmVyIGJhc2VkIG9uIElNU0ksIGNyZWF0ZSBpZiBub3QgZm91bmQgKi8KKwkJaWYgKCFjb25uLT5zdWJzY3IpIHsKKwkJCWNvbm4tPnN1YnNjciA9IHN1YnNjcl9nZXRfYnlfaW1zaShuZXQsIG1pX3N0cmluZyk7CisJCQlpZiAoIWNvbm4tPnN1YnNjcikKKwkJCQljb25uLT5zdWJzY3IgPSBkYl9jcmVhdGVfc3Vic2NyaWJlcihuZXQsIG1pX3N0cmluZyk7CisJCX0KKwkJaWYgKGNvbm4tPmxvY19vcGVyYXRpb24pCisJCQljb25uLT5sb2Nfb3BlcmF0aW9uLT53YWl0aW5nX2Zvcl9pbXNpID0gMDsKKwkJYnJlYWs7CisJY2FzZSBHU01fTUlfVFlQRV9JTUVJOgorCWNhc2UgR1NNX01JX1RZUEVfSU1FSVNWOgorCQkvKiB1cGRhdGUgc3Vic2NyaWJlIDwtPiBJTUVJIG1hcHBpbmcgKi8KKwkJaWYgKGNvbm4tPnN1YnNjcikgeworCQkJZGJfc3Vic2NyaWJlcl9hc3NvY19pbWVpKGNvbm4tPnN1YnNjciwgbWlfc3RyaW5nKTsKKwkJCWRiX3N5bmNfZXF1aXBtZW50KCZjb25uLT5zdWJzY3ItPmVxdWlwbWVudCk7CisJCX0KKwkJaWYgKGNvbm4tPmxvY19vcGVyYXRpb24pCisJCQljb25uLT5sb2Nfb3BlcmF0aW9uLT53YWl0aW5nX2Zvcl9pbWVpID0gMDsKKwkJYnJlYWs7CisJfQorCisJLyogQ2hlY2sgaWYgd2UgY2FuIGxldCB0aGUgbW9iaWxlIHN0YXRpb24gZW50ZXIgKi8KKwlyZXR1cm4gZ3NtMDQwOF9hdXRob3JpemUoY29ubiwgbXNnKTsKK30KKworCitzdGF0aWMgdm9pZCBsb2NfdXBkX3Jlal9jYih2b2lkICpkYXRhKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uID0gZGF0YTsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IGNvbm4tPmxjaGFuOworCXN0cnVjdCBnc21fYnRzICpidHMgPSBsY2hhbi0+dHMtPnRyeC0+YnRzOworCisJcmVsZWFzZV9sb2NfdXBkYXRpbmdfcmVxKGNvbm4pOworCWdzbTA0MDhfbG9jX3VwZF9yZWoobGNoYW4sIGJ0cy0+bmV0d29yay0+cmVqZWN0X2NhdXNlKTsKKwlsY2hhbl9hdXRvX3JlbGVhc2UobGNoYW4pOworfQorCitzdGF0aWMgdm9pZCBzY2hlZHVsZV9yZWplY3Qoc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm4pCit7CisJY29ubi0+bG9jX29wZXJhdGlvbi0+dXBkYXRpbmdfdGltZXIuY2IgPSBsb2NfdXBkX3Jlal9jYjsKKwljb25uLT5sb2Nfb3BlcmF0aW9uLT51cGRhdGluZ190aW1lci5kYXRhID0gY29ubjsKKwlic2Nfc2NoZWR1bGVfdGltZXIoJmNvbm4tPmxvY19vcGVyYXRpb24tPnVwZGF0aW5nX3RpbWVyLCA1LCAwKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmx1cGRfbmFtZSh1X2ludDhfdCB0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgR1NNNDhfTFVQRF9OT1JNQUw6CisJCXJldHVybiAiTk9STUFMIjsKKwljYXNlIEdTTTQ4X0xVUERfUEVSSU9ESUM6CisJCXJldHVybiAiUEVST0lET0MiOworCWNhc2UgR1NNNDhfTFVQRF9JTVNJX0FUVDoKKwkJcmV0dXJuICJJTVNJIEFUVEFDSCI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJVTktOT1dOIjsKKwl9Cit9CisKKy8qIENoYXB0ZXIgOS4yLjE1OiBSZWNlaXZlIExvY2F0aW9uIFVwZGF0aW5nIFJlcXVlc3QgKi8KK3N0YXRpYyBpbnQgbW1fcnhfbG9jX3VwZF9yZXEoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubjsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwlzdHJ1Y3QgZ3NtNDhfbG9jX3VwZF9yZXEgKmx1OworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gTlVMTDsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IG1zZy0+bGNoYW47CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IGxjaGFuLT50cy0+dHJ4LT5idHM7CisJdV9pbnQ4X3QgbWlfdHlwZTsKKwljaGFyIG1pX3N0cmluZ1tHU000OF9NSV9TSVpFXTsKKwlpbnQgcmM7CisKKyAJbHUgPSAoc3RydWN0IGdzbTQ4X2xvY191cGRfcmVxICopIGdoLT5kYXRhOworCWNvbm4gPSAmbGNoYW4tPmNvbm47CisKKwltaV90eXBlID0gbHUtPm1pWzBdICYgR1NNX01JX1RZUEVfTUFTSzsKKworCWdzbTQ4X21pX3RvX3N0cmluZyhtaV9zdHJpbmcsIHNpemVvZihtaV9zdHJpbmcpLCBsdS0+bWksIGx1LT5taV9sZW4pOworCisJREVCVUdQQyhETU0sICJtaV90eXBlPTB4JTAyeCBNSSglcykgdHlwZT0lcyAiLCBtaV90eXBlLCBtaV9zdHJpbmcsCisJCWx1cGRfbmFtZShsdS0+dHlwZSkpOworCisJZGlzcGF0Y2hfc2lnbmFsKFNTX1NVQlNDUiwgU19TVUJTQ1JfSURFTlRJVFksICZsdS0+bWlfbGVuKTsKKworCXN3aXRjaCAobHUtPnR5cGUpIHsKKwljYXNlIEdTTTQ4X0xVUERfTk9STUFMOgorCQljb3VudGVyX2luYyhidHMtPm5ldHdvcmstPnN0YXRzLmxvY191cGRfdHlwZS5ub3JtYWwpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X0xVUERfSU1TSV9BVFQ6CisJCWNvdW50ZXJfaW5jKGJ0cy0+bmV0d29yay0+c3RhdHMubG9jX3VwZF90eXBlLmF0dGFjaCk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTFVQRF9QRVJJT0RJQzoKKwkJY291bnRlcl9pbmMoYnRzLT5uZXR3b3JrLT5zdGF0cy5sb2NfdXBkX3R5cGUucGVyaW9kaWMpOworCQlicmVhazsKKwl9CisKKwkvKgorCSAqIFBzZXVkbyBTcG9vZiBkZXRlY3Rpb246IEp1c3QgZHJvcCBhIHNlY29uZC9jb25jdXJyZW50CisJICogbG9jYXRpb24gdXBkYXRpbmcgcmVxdWVzdC4KKwkgKi8KKwlpZiAoY29ubi0+bG9jX29wZXJhdGlvbikgeworCQlERUJVR1BDKERNTSwgImlnbm9yaW5nIHJlcXVlc3QgZHVlIGFuIGV4aXN0aW5nIG9uZTogJXAuXG4iLAorCQkJY29ubi0+bG9jX29wZXJhdGlvbik7CisJCWdzbTA0MDhfbG9jX3VwZF9yZWoobGNoYW4sIEdTTTQ4X1JFSkVDVF9QUk9UT0NPTF9FUlJPUik7CisJCXJldHVybiAwOworCX0KKworCWFsbG9jYXRlX2xvY191cGRhdGluZ19yZXEoJmxjaGFuLT5jb25uKTsKKworCXN3aXRjaCAobWlfdHlwZSkgeworCWNhc2UgR1NNX01JX1RZUEVfSU1TSToKKwkJREVCVUdQQyhETU0sICJcbiIpOworCQkvKiB3ZSBhbHdheXMgd2FudCB0aGUgSU1FSSwgdG9vICovCisJCXJjID0gbW1fdHhfaWRlbnRpdHlfcmVxKGxjaGFuLCBHU01fTUlfVFlQRV9JTUVJKTsKKwkJY29ubi0+bG9jX29wZXJhdGlvbi0+d2FpdGluZ19mb3JfaW1laSA9IDE7CisKKwkJLyogbG9vayB1cCBzdWJzY3JpYmVyIGJhc2VkIG9uIElNU0ksIGNyZWF0ZSBpZiBub3QgZm91bmQgKi8KKwkJc3Vic2NyID0gc3Vic2NyX2dldF9ieV9pbXNpKGJ0cy0+bmV0d29yaywgbWlfc3RyaW5nKTsKKwkJaWYgKCFzdWJzY3IpIHsKKwkJCXN1YnNjciA9IGRiX2NyZWF0ZV9zdWJzY3JpYmVyKGJ0cy0+bmV0d29yaywgbWlfc3RyaW5nKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEdTTV9NSV9UWVBFX1RNU0k6CisJCURFQlVHUEMoRE1NLCAiXG4iKTsKKwkJLyogd2UgYWx3YXlzIHdhbnQgdGhlIElNRUksIHRvbyAqLworCQlyYyA9IG1tX3R4X2lkZW50aXR5X3JlcShsY2hhbiwgR1NNX01JX1RZUEVfSU1FSSk7CisJCWNvbm4tPmxvY19vcGVyYXRpb24tPndhaXRpbmdfZm9yX2ltZWkgPSAxOworCisJCS8qIGxvb2sgdXAgdGhlIHN1YnNjcmliZXIgYmFzZWQgb24gVE1TSSwgcmVxdWVzdCBJTVNJIGlmIGl0IGZhaWxzICovCisJCXN1YnNjciA9IHN1YnNjcl9nZXRfYnlfdG1zaShidHMtPm5ldHdvcmssCisJCQkJCSAgICB0bXNpX2Zyb21fc3RyaW5nKG1pX3N0cmluZykpOworCQlpZiAoIXN1YnNjcikgeworCQkJLyogc2VuZCBJREVOVElUWSBSRVFVRVNUIG1lc3NhZ2UgdG8gZ2V0IElNU0kgKi8KKwkJCXJjID0gbW1fdHhfaWRlbnRpdHlfcmVxKGxjaGFuLCBHU01fTUlfVFlQRV9JTVNJKTsKKwkJCWNvbm4tPmxvY19vcGVyYXRpb24tPndhaXRpbmdfZm9yX2ltc2kgPSAxOworCQl9CisJCWJyZWFrOworCWNhc2UgR1NNX01JX1RZUEVfSU1FSToKKwljYXNlIEdTTV9NSV9UWVBFX0lNRUlTVjoKKwkJLyogbm8gc2ltIGNhcmQuLi4gRklYTUU6IHdoYXQgdG8gZG8gPyAqLworCQlERUJVR1BDKERNTSwgInVuaW1wbGVtZW50ZWQgbW9iaWxlIGlkZW50aXR5IHR5cGVcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgkKKwkJREVCVUdQQyhETU0sICJ1bmtub3duIG1vYmlsZSBpZGVudGl0eSB0eXBlXG4iKTsKKwkJYnJlYWs7CisJfQorCisJLyogc2NoZWR1bGUgdGhlIHJlamVjdCB0aW1lciAqLworCXNjaGVkdWxlX3JlamVjdChjb25uKTsKKworCWlmICghc3Vic2NyKSB7CisJCURFQlVHUEMoRFJSLCAiPC0gQ2FuJ3QgZmluZCBhbnkgc3Vic2NyaWJlciBmb3IgdGhpcyBJRFxuIik7CisJCS8qIEZJWE1FOiByZXF1ZXN0IGlkPyBjbG9zZSBjaGFubmVsPyAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljb25uLT5zdWJzY3IgPSBzdWJzY3I7CisJY29ubi0+c3Vic2NyLT5lcXVpcG1lbnQuY2xhc3NtYXJrMSA9IGx1LT5jbGFzc21hcmsxOworCisJLyogY2hlY2sgaWYgd2UgY2FuIGxldCB0aGUgc3Vic2NyaWJlciBpbnRvIG91ciBuZXR3b3JrIGltbWVkaWF0ZWx5CisJICogb3IgaWYgd2UgbmVlZCB0byB3YWl0IGZvciBpZGVudGl0eSByZXNwb25zZXMuICovCisJcmV0dXJuIGdzbTA0MDhfYXV0aG9yaXplKGNvbm4sIG1zZyk7Cit9CisKKyNpZiAwCitzdGF0aWMgdV9pbnQ4X3QgdG9fYmNkOCh1X2ludDhfdCB2YWwpCit7CisgICAgICAgcmV0dXJuICgodmFsIC8gMTApIDw8IDQpIHwgKHZhbCAlIDEwKTsKK30KKyNlbmRpZgorCisvKiBTZWN0aW9uIDkuMi4xNWEgKi8KK2ludCBnc200OF90eF9tbV9pbmZvKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBsY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrOworCXVfaW50OF90ICpwdHI4OworCWludCBuYW1lX2xlbiwgbmFtZV9wYWQ7CisjaWYgMAorCXRpbWVfdCBjdXJfdDsKKwlzdHJ1Y3QgdG0qIGN1cl90aW1lOworCWludCB0ejE1bWluOworI2VuZGlmCisKKwltc2ctPmxjaGFuID0gbGNoYW47CisKKwlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX01NOworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX01NX0lORk87CisKKwlpZiAobmV0LT5uYW1lX2xvbmcpIHsKKyNpZiAwCisJCW5hbWVfbGVuID0gc3RybGVuKG5ldC0+bmFtZV9sb25nKTsKKwkJLyogMTAuNS4zLjVhICovCisJCXB0cjggPSBtc2diX3B1dChtc2csIDMpOworCQlwdHI4WzBdID0gR1NNNDhfSUVfTkFNRV9MT05HOworCQlwdHI4WzFdID0gbmFtZV9sZW4qMiArMTsKKwkJcHRyOFsyXSA9IDB4OTA7IC8qIFVDUzIsIG5vIHNwYXJlIGJpdHMsIG5vIENJICovCisKKwkJcHRyMTYgPSAodV9pbnQxNl90ICopIG1zZ2JfcHV0KG1zZywgbmFtZV9sZW4qMik7CisJCWZvciAoaSA9IDA7IGkgPCBuYW1lX2xlbjsgaSsrKQorCQkJcHRyMTZbaV0gPSBodG9ucyhuZXQtPm5hbWVfbG9uZ1tpXSk7CisKKwkJLyogRklYTUU6IFVzZSBDZWxsIEJyb2FkY2FzdCwgbm90IFVDUy0yLCBzaW5jZQorCQkgKiBVQ1MtMiBpcyBvbmx5IHN1cHBvcnRlZCBieSBsYXRlciByZXZpc2lvbnMgb2YgdGhlIHNwZWMgKi8KKyNlbmRpZgorCQluYW1lX2xlbiA9IChzdHJsZW4obmV0LT5uYW1lX2xvbmcpKjcpLzg7CisJCW5hbWVfcGFkID0gKDggLSBzdHJsZW4obmV0LT5uYW1lX2xvbmcpKjcpJTg7CisJCWlmIChuYW1lX3BhZCA+IDApCisJCQluYW1lX2xlbisrOworCQkvKiAxMC41LjMuNWEgKi8KKwkJcHRyOCA9IG1zZ2JfcHV0KG1zZywgMyk7CisJCXB0cjhbMF0gPSBHU000OF9JRV9OQU1FX0xPTkc7CisJCXB0cjhbMV0gPSBuYW1lX2xlbiArMTsKKwkJcHRyOFsyXSA9IDB4ODAgfCBuYW1lX3BhZDsgLyogQ2VsbCBCcm9hZGNhc3QgRENTLCBubyBDSSAqLworCisJCXB0cjggPSBtc2diX3B1dChtc2csIG5hbWVfbGVuKTsKKwkJZ3NtXzdiaXRfZW5jb2RlKHB0cjgsIG5ldC0+bmFtZV9sb25nKTsKKworCX0KKworCWlmIChuZXQtPm5hbWVfc2hvcnQpIHsKKyNpZiAwCisJCW5hbWVfbGVuID0gc3RybGVuKG5ldC0+bmFtZV9zaG9ydCk7CisJCS8qIDEwLjUuMy41YSAqLworCQlwdHI4ID0gKHVfaW50OF90ICopIG1zZ2JfcHV0KG1zZywgMyk7CisJCXB0cjhbMF0gPSBHU000OF9JRV9OQU1FX1NIT1JUOworCQlwdHI4WzFdID0gbmFtZV9sZW4qMiArIDE7CisJCXB0cjhbMl0gPSAweDkwOyAvKiBVQ1MyLCBubyBzcGFyZSBiaXRzLCBubyBDSSAqLworCisJCXB0cjE2ID0gKHVfaW50MTZfdCAqKSBtc2diX3B1dChtc2csIG5hbWVfbGVuKjIpOworCQlmb3IgKGkgPSAwOyBpIDwgbmFtZV9sZW47IGkrKykKKwkJCXB0cjE2W2ldID0gaHRvbnMobmV0LT5uYW1lX3Nob3J0W2ldKTsKKyNlbmRpZgorCQluYW1lX2xlbiA9IChzdHJsZW4obmV0LT5uYW1lX3Nob3J0KSo3KS84OworCQluYW1lX3BhZCA9ICg4IC0gc3RybGVuKG5ldC0+bmFtZV9zaG9ydCkqNyklODsKKwkJaWYgKG5hbWVfcGFkID4gMCkKKwkJCW5hbWVfbGVuKys7CisJCS8qIDEwLjUuMy41YSAqLworCQlwdHI4ID0gKHVfaW50OF90ICopIG1zZ2JfcHV0KG1zZywgMyk7CisJCXB0cjhbMF0gPSBHU000OF9JRV9OQU1FX1NIT1JUOworCQlwdHI4WzFdID0gbmFtZV9sZW4gKzE7CisJCXB0cjhbMl0gPSAweDgwIHwgbmFtZV9wYWQ7IC8qIENlbGwgQnJvYWRjYXN0IERDUywgbm8gQ0kgKi8KKworCQlwdHI4ID0gbXNnYl9wdXQobXNnLCBuYW1lX2xlbik7CisJCWdzbV83Yml0X2VuY29kZShwdHI4LCBuZXQtPm5hbWVfc2hvcnQpOworCisJfQorCisjaWYgMAorCS8qIFNlY3Rpb24gMTAuNS4zLjkgKi8KKwljdXJfdCA9IHRpbWUoTlVMTCk7CisJY3VyX3RpbWUgPSBnbXRpbWUoJmN1cl90KTsKKwlwdHI4ID0gbXNnYl9wdXQobXNnLCA4KTsKKwlwdHI4WzBdID0gR1NNNDhfSUVfTkVUX1RJTUVfVFo7CisJcHRyOFsxXSA9IHRvX2JjZDgoY3VyX3RpbWUtPnRtX3llYXIgJSAxMDApOworCXB0cjhbMl0gPSB0b19iY2Q4KGN1cl90aW1lLT50bV9tb24pOworCXB0cjhbM10gPSB0b19iY2Q4KGN1cl90aW1lLT50bV9tZGF5KTsKKwlwdHI4WzRdID0gdG9fYmNkOChjdXJfdGltZS0+dG1faG91cik7CisJcHRyOFs1XSA9IHRvX2JjZDgoY3VyX3RpbWUtPnRtX21pbik7CisJcHRyOFs2XSA9IHRvX2JjZDgoY3VyX3RpbWUtPnRtX3NlYyk7CisJLyogMDIuNDI6IGNvZGVkIGFzIEJDRCBlbmNvZGVkIHNpZ25lZCB2YWx1ZSBpbiB1bml0cyBvZiAxNSBtaW51dGVzICovCisJdHoxNW1pbiA9IChjdXJfdGltZS0+dG1fZ210b2ZmKS8oNjAqMTUpOworCXB0cjhbN10gPSB0b19iY2Q4KHR6MTVtaW4pOworCWlmICh0ejE1bWluIDwgMCkKKwkJcHRyOFs3XSB8PSAweDgwOworI2VuZGlmCisKKwlERUJVR1AoRE1NLCAiLT4gTU0gSU5GT1xuIik7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIE5VTEwpOworfQorCisvKiBTZWN0aW9uIDkuMi4yICovCitpbnQgZ3NtNDhfdHhfbW1fYXV0aF9yZXEoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90ICpyYW5kLCBpbnQga2V5X3NlcSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisJc3RydWN0IGdzbTQ4X2F1dGhfcmVxICphciA9IChzdHJ1Y3QgZ3NtNDhfYXV0aF9yZXEgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmFyKSk7CisKKwlERUJVR1AoRE1NLCAiLT4gQVVUSCBSRVEgKHJhbmQgPSAlcylcbiIsIGhleGR1bXAocmFuZCwgMTYpKTsKKworCW1zZy0+bGNoYW4gPSBsY2hhbjsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19NTTsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9NTV9BVVRIX1JFUTsKKworCWFyLT5rZXlfc2VxID0ga2V5X3NlcTsKKworCS8qIDE2IGJ5dGVzIFJBTkQgcGFyYW1ldGVycyAqLworCWlmIChyYW5kKQorCQltZW1jcHkoYXItPnJhbmQsIHJhbmQsIDE2KTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7Cit9CisKKy8qIFNlY3Rpb24gOS4yLjEgKi8KK2ludCBnc200OF90eF9tbV9hdXRoX3JlaihzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlERUJVR1AoRE1NLCAiLT4gQVVUSCBSRUpFQ1RcbiIpOworCXJldHVybiBnc200OF90eF9zaW1wbGUobGNoYW4sIEdTTTQ4X1BESVNDX01NLCBHU000OF9NVF9NTV9BVVRIX1JFSik7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfdHhfbW1fc2Vydl9hY2soc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJREVCVUdQKERNTSwgIi0+IENNIFNFUlZJQ0UgQUNLXG4iKTsKKwlyZXR1cm4gZ3NtNDhfdHhfc2ltcGxlKGxjaGFuLCBHU000OF9QRElTQ19NTSwgR1NNNDhfTVRfTU1fQ01fU0VSVl9BQ0MpOworfQorCisvKiA5LjIuNiBDTSBzZXJ2aWNlIHJlamVjdCAqLworc3RhdGljIGludCBnc200OF90eF9tbV9zZXJ2X3JlaihzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubiwKKwkJCQllbnVtIGdzbTQ4X3JlamVjdF92YWx1ZSB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpICsgMSk7CisKKwltc2ctPmxjaGFuID0gY29ubi0+bGNoYW47CisJdXNlX3N1YnNjcl9jb24oY29ubik7CisKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19NTTsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9NTV9DTV9TRVJWX1JFSjsKKwlnaC0+ZGF0YVswXSA9IHZhbHVlOworCURFQlVHUChETU0sICItPiBDTSBTRVJWSUNFIFJlamVjdCBjYXVzZTogJWRcbiIsIHZhbHVlKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7Cit9CisKKy8qCisgKiBIYW5kbGUgQ00gU2VydmljZSBSZXF1ZXN0cworICogYSkgVmVyaWZ5IHRoYXQgdGhlIHBhY2tldCBpcyBsb25nIGVub3VnaCB0byBjb250YWluIHRoZSBpbmZvcm1hdGlvbgorICogICAgd2UgcmVxdWlyZSBvdGhlcndzaWUgcmVqZWN0IHdpdGggSU5DT1JSRUNUX01FU1NBR0UKKyAqIGIpIFRyeSB0byBwYXJzZSB0aGUgVE1TSS4gSWYgd2UgZG8gbm90IGhhdmUgb25lIHJlamVjdAorICogYykgQ2hlY2sgdGhhdCB3ZSBrbm93IHRoZSBzdWJzY3JpYmVyIHdpdGggdGhlIFRNU0kgb3RoZXJ3aXNlIHJlamVjdAorICogICAgd2l0aCBhIEhMUiBjYXVzZQorICogZCkgU2V0IHRoZSBzdWJzY3JpYmVyIG9uIHRoZSBnc21fbGNoYW4gYW5kIGFjY2VwdAorICovCitzdGF0aWMgaW50IGdzbTQ4X3J4X21tX3NlcnZfcmVxKHN0cnVjdCBtc2diICptc2cpCit7CisJdV9pbnQ4X3QgbWlfdHlwZTsKKwljaGFyIG1pX3N0cmluZ1tHU000OF9NSV9TSVpFXTsKKworCXN0cnVjdCBnc21fYnRzICpidHMgPSBtc2ctPmxjaGFuLT50cy0+dHJ4LT5idHM7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJc3RydWN0IGdzbTQ4X3NlcnZpY2VfcmVxdWVzdCAqcmVxID0KKwkJCShzdHJ1Y3QgZ3NtNDhfc2VydmljZV9yZXF1ZXN0ICopZ2gtPmRhdGE7CisJLyogdW5mb3J0dW5hdGVseSBpbiBQaGFzZTEgdGhlIGNsYXNzbWFyMiBsZW5ndGggaXMgdmFyaWFibGUgKi8KKwl1X2ludDhfdCBjbGFzc21hcmsyX2xlbiA9IGdoLT5kYXRhWzFdOworCXVfaW50OF90ICpjbGFzc21hcmsyID0gZ2gtPmRhdGErMjsKKwl1X2ludDhfdCBtaV9sZW4gPSAqKGNsYXNzbWFyazIgKyBjbGFzc21hcmsyX2xlbik7CisJdV9pbnQ4X3QgKm1pID0gKGNsYXNzbWFyazIgKyBjbGFzc21hcmsyX2xlbiArIDEpOworCisJREVCVUdQKERNTSwgIjwtIENNIFNFUlZJQ0UgUkVRVUVTVCAiKTsKKwlpZiAobXNnLT5kYXRhX2xlbiA8IHNpemVvZihzdHJ1Y3QgZ3NtNDhfc2VydmljZV9yZXF1ZXN0KikpIHsKKwkJREVCVUdQQyhETU0sICJ3cm9uZyBzaXplZCBtZXNzYWdlXG4iKTsKKwkJcmV0dXJuIGdzbTQ4X3R4X21tX3NlcnZfcmVqKCZtc2ctPmxjaGFuLT5jb25uLAorCQkJCQkgICAgR1NNNDhfUkVKRUNUX0lOQ09SUkVDVF9NRVNTQUdFKTsKKwl9CisKKwlpZiAobXNnLT5kYXRhX2xlbiA8IHJlcS0+bWlfbGVuICsgNikgeworCQlERUJVR1BDKERNTSwgImRvZXMgbm90IGZpdCBpbiBwYWNrZXRcbiIpOworCQlyZXR1cm4gZ3NtNDhfdHhfbW1fc2Vydl9yZWooJm1zZy0+bGNoYW4tPmNvbm4sCisJCQkJCSAgICBHU000OF9SRUpFQ1RfSU5DT1JSRUNUX01FU1NBR0UpOworCX0KKworCW1pX3R5cGUgPSBtaVswXSAmIEdTTV9NSV9UWVBFX01BU0s7CisJaWYgKG1pX3R5cGUgIT0gR1NNX01JX1RZUEVfVE1TSSkgeworCQlERUJVR1BDKERNTSwgIm1pX3R5cGUgaXMgbm90IFRNU0k6ICVkXG4iLCBtaV90eXBlKTsKKwkJcmV0dXJuIGdzbTQ4X3R4X21tX3NlcnZfcmVqKCZtc2ctPmxjaGFuLT5jb25uLAorCQkJCQkgICAgR1NNNDhfUkVKRUNUX0lOQ09SUkVDVF9NRVNTQUdFKTsKKwl9CisKKwlnc200OF9taV90b19zdHJpbmcobWlfc3RyaW5nLCBzaXplb2YobWlfc3RyaW5nKSwgbWksIG1pX2xlbik7CisJREVCVUdQQyhETU0sICJzZXJ2X3R5cGU9MHglMDJ4IG1pX3R5cGU9MHglMDJ4IE0oJXMpXG4iLAorCQlyZXEtPmNtX3NlcnZpY2VfdHlwZSwgbWlfdHlwZSwgbWlfc3RyaW5nKTsKKworCWRpc3BhdGNoX3NpZ25hbChTU19TVUJTQ1IsIFNfU1VCU0NSX0lERU5USVRZLCAoY2xhc3NtYXJrMiArIGNsYXNzbWFyazJfbGVuKSk7CisKKwlpZiAoaXNfc2llbWVuc19idHMoYnRzKSkKKwkJc2VuZF9zaWVtZW5zX21ycGNpKG1zZy0+bGNoYW4sIGNsYXNzbWFyazItMSk7CisKKwlzdWJzY3IgPSBzdWJzY3JfZ2V0X2J5X3Rtc2koYnRzLT5uZXR3b3JrLAorCQkJCSAgICB0bXNpX2Zyb21fc3RyaW5nKG1pX3N0cmluZykpOworCisJLyogRklYTUU6IGlmIHdlIGRvbid0IGtub3cgdGhlIFRNU0ksIGlucXVpcmUgYWJpdCBJTVNJIGFuZCBhbGxvY2F0ZSBuZXcgVE1TSSAqLworCWlmICghc3Vic2NyKQorCQlyZXR1cm4gZ3NtNDhfdHhfbW1fc2Vydl9yZWooJm1zZy0+bGNoYW4tPmNvbm4sCisJCQkJCSAgICBHU000OF9SRUpFQ1RfSU1TSV9VTktOT1dOX0lOX0hMUik7CisKKwlpZiAoIW1zZy0+bGNoYW4tPmNvbm4uc3Vic2NyKQorCQltc2ctPmxjaGFuLT5jb25uLnN1YnNjciA9IHN1YnNjcjsKKwllbHNlIGlmIChtc2ctPmxjaGFuLT5jb25uLnN1YnNjciA9PSBzdWJzY3IpCisJCXN1YnNjcl9wdXQoc3Vic2NyKTsgLyogbGNoYW4gYWxyZWFkeSBoYXMgYSByZWYsIGRvbid0IG5lZWQgYW5vdGhlciBvbmUgKi8KKwllbHNlIHsKKwkJREVCVUdQKERNTSwgIjwtIENNIENoYW5uZWwgYWxyZWFkeSBvd25lZCBieSBzb21lb25lIGVsc2U/XG4iKTsKKwkJc3Vic2NyX3B1dChzdWJzY3IpOworCX0KKworCXN1YnNjci0+ZXF1aXBtZW50LmNsYXNzbWFyazJfbGVuID0gY2xhc3NtYXJrMl9sZW47CisJbWVtY3B5KHN1YnNjci0+ZXF1aXBtZW50LmNsYXNzbWFyazIsIGNsYXNzbWFyazIsIGNsYXNzbWFyazJfbGVuKTsKKwlkYl9zeW5jX2VxdWlwbWVudCgmc3Vic2NyLT5lcXVpcG1lbnQpOworCisJcmV0dXJuIGdzbTQ4X3R4X21tX3NlcnZfYWNrKG1zZy0+bGNoYW4pOworfQorCitzdGF0aWMgaW50IGdzbTQ4X3J4X21tX2ltc2lfZGV0YWNoX2luZChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSBtc2ctPmxjaGFuLT50cy0+dHJ4LT5idHM7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJc3RydWN0IGdzbTQ4X2ltc2lfZGV0YWNoX2luZCAqaWRpID0KKwkJCQkoc3RydWN0IGdzbTQ4X2ltc2lfZGV0YWNoX2luZCAqKSBnaC0+ZGF0YTsKKwl1X2ludDhfdCBtaV90eXBlID0gaWRpLT5taVswXSAmIEdTTV9NSV9UWVBFX01BU0s7CisJY2hhciBtaV9zdHJpbmdbR1NNNDhfTUlfU0laRV07CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPSBOVUxMOworCisJZ3NtNDhfbWlfdG9fc3RyaW5nKG1pX3N0cmluZywgc2l6ZW9mKG1pX3N0cmluZyksIGlkaS0+bWksIGlkaS0+bWlfbGVuKTsKKwlERUJVR1AoRE1NLCAiSU1TSSBERVRBQ0ggSU5ESUNBVElPTjogbWlfdHlwZT0weCUwMnggTUkoJXMpOiAiLAorCQltaV90eXBlLCBtaV9zdHJpbmcpOworCisJY291bnRlcl9pbmMoYnRzLT5uZXR3b3JrLT5zdGF0cy5sb2NfdXBkX3R5cGUuZGV0YWNoKTsKKworCXN3aXRjaCAobWlfdHlwZSkgeworCWNhc2UgR1NNX01JX1RZUEVfVE1TSToKKwkJc3Vic2NyID0gc3Vic2NyX2dldF9ieV90bXNpKGJ0cy0+bmV0d29yaywKKwkJCQkJICAgIHRtc2lfZnJvbV9zdHJpbmcobWlfc3RyaW5nKSk7CisJCWJyZWFrOworCWNhc2UgR1NNX01JX1RZUEVfSU1TSToKKwkJc3Vic2NyID0gc3Vic2NyX2dldF9ieV9pbXNpKGJ0cy0+bmV0d29yaywgbWlfc3RyaW5nKTsKKwkJYnJlYWs7CisJY2FzZSBHU01fTUlfVFlQRV9JTUVJOgorCWNhc2UgR1NNX01JX1RZUEVfSU1FSVNWOgorCQkvKiBubyBzaW0gY2FyZC4uLiBGSVhNRTogd2hhdCB0byBkbyA/ICovCisJCURFQlVHUEMoRE1NLCAidW5pbXBsZW1lbnRlZCBtb2JpbGUgaWRlbnRpdHkgdHlwZVxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CQorCQlERUJVR1BDKERNTSwgInVua25vd24gbW9iaWxlIGlkZW50aXR5IHR5cGVcbiIpOworCQlicmVhazsKKwl9CisKKwlpZiAoc3Vic2NyKSB7CisJCXN1YnNjcl91cGRhdGUoc3Vic2NyLCBtc2ctPnRyeC0+YnRzLAorCQkJCUdTTV9TVUJTQ1JJQkVSX1VQREFURV9ERVRBQ0hFRCk7CisJCURFQlVHUChETU0sICJTdWJzY3JpYmVyOiAlc1xuIiwgc3Vic2NyX25hbWUoc3Vic2NyKSk7CisKKwkJc3Vic2NyLT5lcXVpcG1lbnQuY2xhc3NtYXJrMSA9IGlkaS0+Y2xhc3NtYXJrMTsKKwkJZGJfc3luY19lcXVpcG1lbnQoJnN1YnNjci0+ZXF1aXBtZW50KTsKKworCQlzdWJzY3JfcHV0KHN1YnNjcik7CisJfSBlbHNlCisJCURFQlVHUChETU0sICJVbmtub3duIFN1YnNjcmliZXIgPyE/XG4iKTsKKworCS8qIEZJWE1FOiBpdGVyYXRlIG92ZXIgYWxsIHRyYW5zYWN0aW9ucyBhbmQgcmVsZWFzZSB0aGVtLAorCSAqIGltYWdpbmUgYW4gSU1TSSBERVRBQ0ggaGFwcGVuaW5nIGR1cmluZyBhbiBhY3RpdmUgY2FsbCEgKi8KKworCS8qIHN1YnNjcmliZXIgaXMgZGV0YWNoZWQ6IHNob3VsZCB3ZSByZWxlYXNlIGxjaGFuPyAqLworCWxjaGFuX2F1dG9fcmVsZWFzZShtc2ctPmxjaGFuKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdzbTQ4X3J4X21tX3N0YXR1cyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCisJREVCVUdQKERNTSwgIk1NIFNUQVRVUyAocmVqZWN0IGNhdXNlIDB4JTAyeClcbiIsIGdoLT5kYXRhWzBdKTsKKworCXJldHVybiAwOworfQorCisvKiBSZWNlaXZlIGEgR1NNIDA0LjA4IE1vYmlsaXR5IE1hbmFnZW1lbnQgKE1NKSBtZXNzYWdlICovCitzdGF0aWMgaW50IGdzbTA0MDhfcmN2X21tKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoZ2gtPm1zZ190eXBlICYgMHhiZikgeworCWNhc2UgR1NNNDhfTVRfTU1fTE9DX1VQRF9SRVFVRVNUOgorCQlERUJVR1AoRE1NLCAiTE9DQVRJT04gVVBEQVRJTkcgUkVRVUVTVDogIik7CisJCXJjID0gbW1fcnhfbG9jX3VwZF9yZXEobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9NTV9JRF9SRVNQOgorCQlyYyA9IG1tX3J4X2lkX3Jlc3AobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9NTV9DTV9TRVJWX1JFUToKKwkJcmMgPSBnc200OF9yeF9tbV9zZXJ2X3JlcShtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX01NX1NUQVRVUzoKKwkJcmMgPSBnc200OF9yeF9tbV9zdGF0dXMobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9NTV9UTVNJX1JFQUxMX0NPTVBMOgorCQlERUJVR1AoRE1NLCAiVE1TSSBSZWFsbG9jYXRpb24gQ29tcGxldGVkLiBTdWJzY3JpYmVyOiAlc1xuIiwKKwkJICAgICAgIG1zZy0+bGNoYW4tPmNvbm4uc3Vic2NyID8KKwkJCQlzdWJzY3JfbmFtZShtc2ctPmxjaGFuLT5jb25uLnN1YnNjcikgOgorCQkJCSJ1bmtub3duIHN1YnNjcmliZXIiKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9NTV9JTVNJX0RFVEFDSF9JTkQ6CisJCXJjID0gZ3NtNDhfcnhfbW1faW1zaV9kZXRhY2hfaW5kKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfTU1fQ01fUkVFU1RfUkVROgorCQlERUJVR1AoRE1NLCAiQ00gUkVFU1RBQkxJU0ggUkVRVUVTVDogTm90IGltcGxlbWVudGVkXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9NTV9BVVRIX1JFU1A6CisJCURFQlVHUChETU0sICJBVVRIRU5USUNBVElPTiBSRVNQT05TRTogTm90IGltcGxlbWVudGVkXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETU0sIExPR0xfTk9USUNFLCAiVW5rbm93biBHU00gMDQuMDggTU0gbXNnIHR5cGUgMHglMDJ4XG4iLAorCQkJZ2gtPm1zZ190eXBlKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKiBSZWNlaXZlIGEgUEFHSU5HIFJFU1BPTlNFIG1lc3NhZ2UgZnJvbSB0aGUgTVMgKi8KK3N0YXRpYyBpbnQgZ3NtNDhfcnhfcnJfcGFnX3Jlc3Aoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gbXNnLT5sY2hhbi0+dHMtPnRyeC0+YnRzOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVfaW50OF90ICpjbGFzc21hcmsyX2x2ID0gZ2gtPmRhdGEgKyAxOworCXVfaW50OF90IG1pX3R5cGU7CisJY2hhciBtaV9zdHJpbmdbR1NNNDhfTUlfU0laRV07CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPSBOVUxMOworCWludCByYyA9IDA7CisKKwlnc200OF9wYWdpbmdfZXh0cmFjdF9taShtc2csIG1pX3N0cmluZywgJm1pX3R5cGUpOworCURFQlVHUChEUlIsICJQQUdJTkcgUkVTUE9OU0U6IG1pX3R5cGU9MHglMDJ4IE1JKCVzKVxuIiwKKwkJbWlfdHlwZSwgbWlfc3RyaW5nKTsKKworCXN3aXRjaCAobWlfdHlwZSkgeworCWNhc2UgR1NNX01JX1RZUEVfVE1TSToKKwkJc3Vic2NyID0gc3Vic2NyX2dldF9ieV90bXNpKGJ0cy0+bmV0d29yaywKKwkJCQkJICAgIHRtc2lfZnJvbV9zdHJpbmcobWlfc3RyaW5nKSk7CisJCWJyZWFrOworCWNhc2UgR1NNX01JX1RZUEVfSU1TSToKKwkJc3Vic2NyID0gc3Vic2NyX2dldF9ieV9pbXNpKGJ0cy0+bmV0d29yaywgbWlfc3RyaW5nKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKCFzdWJzY3IpIHsKKwkJREVCVUdQKERSUiwgIjwtIENhbid0IGZpbmQgYW55IHN1YnNjcmliZXIgZm9yIHRoaXMgSURcbiIpOworCQkvKiBGSVhNRTogcmVxdWVzdCBpZD8gY2xvc2UgY2hhbm5lbD8gKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCURFQlVHUChEUlIsICI8LSBDaGFubmVsIHdhcyByZXF1ZXN0ZWQgYnkgJXNcbiIsCisJCXN1YnNjci0+bmFtZSAmJiBzdHJsZW4oc3Vic2NyLT5uYW1lKSA/IHN1YnNjci0+bmFtZSA6IHN1YnNjci0+aW1zaSk7CisKKwlzdWJzY3ItPmVxdWlwbWVudC5jbGFzc21hcmsyX2xlbiA9ICpjbGFzc21hcmsyX2x2OworCW1lbWNweShzdWJzY3ItPmVxdWlwbWVudC5jbGFzc21hcmsyLCBjbGFzc21hcmsyX2x2KzEsICpjbGFzc21hcmsyX2x2KTsKKwlkYl9zeW5jX2VxdWlwbWVudCgmc3Vic2NyLT5lcXVpcG1lbnQpOworCisJcmMgPSBnc200OF9oYW5kbGVfcGFnaW5nX3Jlc3AobXNnLCBzdWJzY3IpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBnc200OF9yeF9ycl9jbGFzc21hcmsoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IG1zZy0+bGNoYW4tPmNvbm4uc3Vic2NyOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXVfaW50OF90IGNtMl9sZW4sIGNtM19sZW4gPSAwOworCXVfaW50OF90ICpjbTIsICpjbTMgPSBOVUxMOworCisJREVCVUdQKERSUiwgIkNMQVNTTUFSSyBDSEFOR0UgIik7CisKKwkvKiBjbGFzc21hcmsgMiAqLworCWNtMl9sZW4gPSBnaC0+ZGF0YVswXTsKKwljbTIgPSAmZ2gtPmRhdGFbMV07CisJREVCVUdQQyhEUlIsICJDTTIobGVuPSV1KSAiLCBjbTJfbGVuKTsKKworCWlmIChwYXlsb2FkX2xlbiA+IGNtMl9sZW4gKyAxKSB7CisJCS8qIHdlIG11c3QgaGF2ZSBhIGNsYXNzbWFyazMgKi8KKwkJaWYgKGdoLT5kYXRhW2NtMl9sZW4rMV0gIT0gMHgyMCkgeworCQkJREVCVUdQQyhEUlIsICJFUlIgQ00zIFRBR1xuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoY20yX2xlbiA+IDMpIHsKKwkJCURFQlVHUEMoRFJSLCAiQ00yIHRvbyBsb25nIVxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkKKwkJY20zX2xlbiA9IGdoLT5kYXRhW2NtMl9sZW4rMl07CisJCWNtMyA9ICZnaC0+ZGF0YVtjbTJfbGVuKzNdOworCQlpZiAoY20zX2xlbiA+IDE0KSB7CisJCQlERUJVR1BDKERSUiwgIkNNMyBsZW4gJXUgdG9vIGxvbmchXG4iLCBjbTNfbGVuKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCURFQlVHUEMoRFJSLCAiQ00zKGxlbj0ldSlcbiIsIGNtM19sZW4pOworCX0KKwlpZiAoc3Vic2NyKSB7CisJCXN1YnNjci0+ZXF1aXBtZW50LmNsYXNzbWFyazJfbGVuID0gY20yX2xlbjsKKwkJbWVtY3B5KHN1YnNjci0+ZXF1aXBtZW50LmNsYXNzbWFyazIsIGNtMiwgY20yX2xlbik7CisJCWlmIChjbTMpIHsKKwkJCXN1YnNjci0+ZXF1aXBtZW50LmNsYXNzbWFyazNfbGVuID0gY20zX2xlbjsKKwkJCW1lbWNweShzdWJzY3ItPmVxdWlwbWVudC5jbGFzc21hcmszLCBjbTMsIGNtM19sZW4pOworCQl9CisJCWRiX3N5bmNfZXF1aXBtZW50KCZzdWJzY3ItPmVxdWlwbWVudCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfcnhfcnJfc3RhdHVzKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisKKwlERUJVR1AoRFJSLCAiU1RBVFVTIHJyX2NhdXNlID0gJXNcbiIsCisJCXJyX2NhdXNlX25hbWUoZ2gtPmRhdGFbMF0pKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdzbTQ4X3J4X3JyX21lYXNfcmVwKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbV9tZWFzX3JlcCAqbWVhc19yZXAgPSBsY2hhbl9uZXh0X21lYXNfcmVwKG1zZy0+bGNoYW4pOworCisJLyogVGhpcyBzaG91bGRuJ3QgYWN0dWFsbHkgZW5kIHVwIGhlcmUsIGFzIFJTTCB0cmVhdHMKKwkgKiBMMyBJbmZvIG9mIDA4LjU4IE1FQVNVUkVNRU5UIFJFUE9SVCBkaWZmZXJlbnQgYnkgY2FsbGluZworCSAqIGRpcmVjdGx5IGludG8gZ3NtNDhfcGFyc2VfbWVhc19yZXAgKi8KKwlERUJVR1AoRE1FQVMsICJESVJFQ1QgR1NNNDggTUVBU1VSRU1FTlQgUkVQT1JUID8hPyAiKTsKKwlnc200OF9wYXJzZV9tZWFzX3JlcChtZWFzX3JlcCwgbXNnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdzbTQ4X3J4X3JyX2FwcF9pbmZvKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdV9pbnQ4X3QgYXBkdV9pZF9mbGFnczsKKwl1X2ludDhfdCBhcGR1X2xlbjsKKwl1X2ludDhfdCAqYXBkdV9kYXRhOworCisJYXBkdV9pZF9mbGFncyA9IGdoLT5kYXRhWzBdOworCWFwZHVfbGVuID0gZ2gtPmRhdGFbMV07CisJYXBkdV9kYXRhID0gZ2gtPmRhdGErMjsKKwkKKwlERUJVR1AoRE5NLCAiUlggQVBQTElDQVRJT04gSU5GTyBpZC9mbGFncz0weCUwMnggYXBkdV9sZW49JXUgYXBkdT0lcyIsCisJCWFwZHVfaWRfZmxhZ3MsIGFwZHVfbGVuLCBoZXhkdW1wKGFwZHVfZGF0YSwgYXBkdV9sZW4pKTsKKworCXJldHVybiBkYl9hcGR1X2Jsb2Jfc3RvcmUobXNnLT5sY2hhbi0+Y29ubi5zdWJzY3IsIGFwZHVfaWRfZmxhZ3MsIGFwZHVfbGVuLCBhcGR1X2RhdGEpOworfQorCisvKiBDaGFwdGVyIDkuMS4xNiBIYW5kb3ZlciBjb21wbGV0ZSAqLworc3RhdGljIGludCBnc200OF9yeF9ycl9ob19jb21wbChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCisJREVCVUdQKERSUiwgIkhBTkRPVkVSIENPTVBMRVRFIGNhdXNlID0gJXNcbiIsCisJCXJyX2NhdXNlX25hbWUoZ2gtPmRhdGFbMF0pKTsKKworCWRpc3BhdGNoX3NpZ25hbChTU19MQ0hBTiwgU19MQ0hBTl9IQU5ET1ZFUl9DT01QTCwgbXNnLT5sY2hhbik7CisJLyogRklYTUU6IHJlbGVhc2Ugb2xkIGNoYW5uZWwgKi8KKworCXJldHVybiAwOworfQorCisvKiBDaGFwdGVyIDkuMS4xNyBIYW5kb3ZlciBGYWlsdXJlICovCitzdGF0aWMgaW50IGdzbTQ4X3J4X3JyX2hvX2ZhaWwoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKworCURFQlVHUChEUlIsICJIQU5ET1ZFUiBGQUlMRUQgY2F1c2UgPSAlc1xuIiwKKwkJcnJfY2F1c2VfbmFtZShnaC0+ZGF0YVswXSkpOworCisJZGlzcGF0Y2hfc2lnbmFsKFNTX0xDSEFOLCBTX0xDSEFOX0hBTkRPVkVSX0ZBSUwsIG1zZy0+bGNoYW4pOworCS8qIEZJWE1FOiByZWxlYXNlIGFsbG9jYXRlZCBuZXcgY2hhbm5lbCAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qIFJlY2VpdmUgYSBHU00gMDQuMDggUmFkaW8gUmVzb3VyY2UgKFJSKSBtZXNzYWdlICovCitzdGF0aWMgaW50IGdzbTA0MDhfcmN2X3JyKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoZ2gtPm1zZ190eXBlKSB7CisJY2FzZSBHU000OF9NVF9SUl9DTFNNX0NIRzoKKwkJcmMgPSBnc200OF9yeF9ycl9jbGFzc21hcmsobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9SUl9HUFJTX1NVU1BfUkVROgorCQlERUJVR1AoRFJSLCAiR1JQUyBTVVNQRU5EIFJFUVVFU1RcbiIpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX1JSX1BBR19SRVNQOgorCQlyYyA9IGdzbTQ4X3J4X3JyX3BhZ19yZXNwKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfUlJfQ0hBTl9NT0RFX01PRElGX0FDSzoKKwkJcmMgPSBnc200OF9yeF9ycl9tb2RpZl9hY2sobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9SUl9TVEFUVVM6CisJCXJjID0gZ3NtNDhfcnhfcnJfc3RhdHVzKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfUlJfTUVBU19SRVA6CisJCXJjID0gZ3NtNDhfcnhfcnJfbWVhc19yZXAobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9SUl9BUFBfSU5GTzoKKwkJcmMgPSBnc200OF9yeF9ycl9hcHBfaW5mbyhtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX1JSX0NJUEhfTV9DT01QTDoKKwkJREVCVUdQKERSUiwgIkNJUEhFUklORyBNT0RFIENPTVBMRVRFXG4iKTsKKwkJLyogRklYTUU6IGNoZWNrIGZvciBNSSAoaWYgYW55KSAqLworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX1JSX0hBTkRPX0NPTVBMOgorCQlyYyA9IGdzbTQ4X3J4X3JyX2hvX2NvbXBsKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfUlJfSEFORE9fRkFJTDoKKwkJcmMgPSBnc200OF9yeF9ycl9ob19mYWlsKG1zZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFJSLCBMT0dMX05PVElDRSwgIlVuaW1wbGVtZW50ZWQgIgorCQkJIkdTTSAwNC4wOCBSUiBtc2cgdHlwZSAweCUwMnhcbiIsIGdoLT5tc2dfdHlwZSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworaW50IGdzbTQ4X3NlbmRfcnJfYXBwX2luZm8oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGFwZHVfaWQsCisJCQkgICB1X2ludDhfdCBhcGR1X2xlbiwgY29uc3QgdV9pbnQ4X3QgKmFwZHUpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaDsKKworCW1zZy0+bGNoYW4gPSBsY2hhbjsKKwkKKwlERUJVR1AoRFJSLCAiVFggQVBQTElDQVRJT04gSU5GTyBpZD0weCUwMngsIGxlbj0ldVxuIiwKKwkJYXBkdV9pZCwgYXBkdV9sZW4pOworCQorCWdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSArIDIgKyBhcGR1X2xlbik7CisJZ2gtPnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfUlI7CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfUlJfQVBQX0lORk87CisJZ2gtPmRhdGFbMF0gPSBhcGR1X2lkOworCWdoLT5kYXRhWzFdID0gYXBkdV9sZW47CisJbWVtY3B5KGdoLT5kYXRhKzIsIGFwZHUsIGFwZHVfbGVuKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7Cit9CisKKy8qIENhbGwgQ29udHJvbCAqLworCisvKiBUaGUgZW50aXJlIGNhbGwgY29udHJvbCBjb2RlIGlzIHdyaXR0ZW4gaW4gYWNjb3JkYW5jZSB3aXRoIEZpZ3VyZSA3LjEwYworICogZm9yICd2ZXJ5IGVhcmx5IGFzc2lnbm1lbnQnLCBpLmUuIHdlIGFsbG9jYXRlIGEgVENIL0YgZHVyaW5nIElNTUVESUFURQorICogQVNTSUdOLCB0aGVuIGZpcnN0IHVzZSB0aGF0IFRDSC9GIGZvciBzaWduYWxsaW5nIGFuZCBsYXRlciBNT0RFIE1PRElGWQorICogaXQgZm9yIHZvaWNlICovCisKK3N0YXRpYyB2b2lkIG5ld19jY19zdGF0ZShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgaW50IHN0YXRlKQoreworCWlmIChzdGF0ZSA+IDMxIHx8IHN0YXRlIDwgMCkKKwkJcmV0dXJuOworCisJREVCVUdQKERDQywgIm5ldyBzdGF0ZSAlcyAtPiAlc1xuIiwKKwkJZ3NtNDhfY2Nfc3RhdGVfbmFtZSh0cmFucy0+Y2Muc3RhdGUpLAorCQlnc200OF9jY19zdGF0ZV9uYW1lKHN0YXRlKSk7CisKKwl0cmFucy0+Y2Muc3RhdGUgPSBzdGF0ZTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9zdGF0dXMoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisJdV9pbnQ4X3QgKmNhdXNlLCAqY2FsbF9zdGF0ZTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX1NUQVRVUzsKKworCWNhdXNlID0gbXNnYl9wdXQobXNnLCAzKTsKKwljYXVzZVswXSA9IDI7CisJY2F1c2VbMV0gPSBHU000OF9DQVVTRV9DU19HU00gfCBHU000OF9DQVVTRV9MT0NfVVNFUjsKKwljYXVzZVsyXSA9IDB4ODAgfCAzMDsJLyogcmVzcG9uc2UgdG8gc3RhdHVzIGlucXVpcnkgKi8KKworCWNhbGxfc3RhdGUgPSBtc2diX3B1dChtc2csIDEpOworCWNhbGxfc3RhdGVbMF0gPSAweGMwIHwgMHgwMDsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X3R4X3NpbXBsZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwKKwkJCSAgIHVfaW50OF90IHBkaXNjLCB1X2ludDhfdCBtc2dfdHlwZSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwltc2ctPmxjaGFuID0gbGNoYW47CisKKwlnaC0+cHJvdG9fZGlzY3IgPSBwZGlzYzsKKwlnaC0+bXNnX3R5cGUgPSBtc2dfdHlwZTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIGdzbTQ4X3N0b3BfY2NfdGltZXIoc3RydWN0IGdzbV90cmFucyAqdHJhbnMpCit7CisJaWYgKGJzY190aW1lcl9wZW5kaW5nKCZ0cmFucy0+Y2MudGltZXIpKSB7CisJCURFQlVHUChEQ0MsICJzdG9wcGluZyBwZW5kaW5nIHRpbWVyIFQleFxuIiwgdHJhbnMtPmNjLlRjdXJyZW50KTsKKwkJYnNjX2RlbF90aW1lcigmdHJhbnMtPmNjLnRpbWVyKTsKKwkJdHJhbnMtPmNjLlRjdXJyZW50ID0gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbW5jY19yZWN2bXNnKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCBzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywKKwkJCWludCBtc2dfdHlwZSwgc3RydWN0IGdzbV9tbmNjICptbmNjKQoreworCXN0cnVjdCBtc2diICptc2c7CisKKwlpZiAodHJhbnMpCisJCWlmICh0cmFucy0+Y29ubikKKwkJCURFQlVHUChEQ0MsICIoYnRzICVkIHRyeCAlZCB0cyAlZCB0aSAleCBzdWIgJXMpICIKKwkJCQkiU2VuZGluZyAnJXMnIHRvIE1OQ0MuXG4iLAorCQkJCXRyYW5zLT5jb25uLT5sY2hhbi0+dHMtPnRyeC0+YnRzLT5uciwKKwkJCQl0cmFucy0+Y29ubi0+bGNoYW4tPnRzLT50cngtPm5yLAorCQkJCXRyYW5zLT5jb25uLT5sY2hhbi0+dHMtPm5yLCB0cmFucy0+dHJhbnNhY3Rpb25faWQsCisJCQkJKHRyYW5zLT5zdWJzY3IpPyh0cmFucy0+c3Vic2NyLT5leHRlbnNpb24pOiItIiwKKwkJCQlnZXRfbW5jY19uYW1lKG1zZ190eXBlKSk7CisJCWVsc2UKKwkJCURFQlVHUChEQ0MsICIoYnRzIC0gdHJ4IC0gdHMgLSB0aSAtLSBzdWIgJXMpICIKKwkJCQkiU2VuZGluZyAnJXMnIHRvIE1OQ0MuXG4iLAorCQkJCSh0cmFucy0+c3Vic2NyKT8odHJhbnMtPnN1YnNjci0+ZXh0ZW5zaW9uKToiLSIsCisJCQkJZ2V0X21uY2NfbmFtZShtc2dfdHlwZSkpOworCWVsc2UKKwkJREVCVUdQKERDQywgIihidHMgLSB0cnggLSB0cyAtIHRpIC0tIHN1YiAtKSAiCisJCQkiU2VuZGluZyAnJXMnIHRvIE1OQ0MuXG4iLCBnZXRfbW5jY19uYW1lKG1zZ190eXBlKSk7CisKKwltbmNjLT5tc2dfdHlwZSA9IG1zZ190eXBlOworCQorCW1zZyA9IG1zZ2JfYWxsb2Moc2l6ZW9mKHN0cnVjdCBnc21fbW5jYyksICJNTkNDIik7CisJaWYgKCFtc2cpCisJCXJldHVybiAtRU5PTUVNOworCW1lbWNweShtc2ctPmRhdGEsIG1uY2MsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwltc2diX2VucXVldWUoJm5ldC0+dXBxdWV1ZSwgbXNnKTsKKworCXJldHVybiAwOworfQorCitpbnQgbW5jY19yZWxlYXNlX2luZChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgc3RydWN0IGdzbV90cmFucyAqdHJhbnMsCisJCSAgICAgdV9pbnQzMl90IGNhbGxyZWYsIGludCBsb2NhdGlvbiwgaW50IHZhbHVlKQoreworCXN0cnVjdCBnc21fbW5jYyByZWw7CisKKwltZW1zZXQoJnJlbCwgMCwgc2l6ZW9mKHJlbCkpOworCXJlbC5jYWxscmVmID0gY2FsbHJlZjsKKwltbmNjX3NldF9jYXVzZSgmcmVsLCBsb2NhdGlvbiwgdmFsdWUpOworCXJldHVybiBtbmNjX3JlY3Ztc2cobmV0LCB0cmFucywgTU5DQ19SRUxfSU5ELCAmcmVsKTsKK30KKworLyogQ2FsbCBDb250cm9sIFNwZWNpZmljIHRyYW5zYWN0aW9uIHJlbGVhc2UuCisgKiBnZXRzIGNhbGxlZCBieSB0cmFuc19mcmVlLCBETyBOT1QgQ0FMTCBZT1VSU0VMRiEgKi8KK3ZvaWQgX2dzbTQ4X2NjX3RyYW5zX2ZyZWUoc3RydWN0IGdzbV90cmFucyAqdHJhbnMpCit7CisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisKKwkvKiBzZW5kIHJlbGVhc2UgdG8gTDQsIGlmIGNhbGxyZWYgc3RpbGwgZXhpc3RzICovCisJaWYgKHRyYW5zLT5jYWxscmVmKSB7CisJCS8qIFJlc3NvdXJjZSB1bmF2YWlsYWJsZSAqLworCQltbmNjX3JlbGVhc2VfaW5kKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIHRyYW5zLT5jYWxscmVmLAorCQkJCSBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJIEdTTTQ4X0NDX0NBVVNFX1JFU09VUkNFX1VOQVZBSUwpOworCX0KKwlpZiAodHJhbnMtPmNjLnN0YXRlICE9IEdTTV9DU1RBVEVfTlVMTCkKKwkJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX05VTEwpOworCWlmICh0cmFucy0+Y29ubikKKwkJdHJhdV9tdXhfdW5tYXAoJnRyYW5zLT5jb25uLT5sY2hhbi0+dHMtPmUxX2xpbmssIHRyYW5zLT5jYWxscmVmKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9zZXR1cChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKTsKKworLyogY2FsbC1iYWNrIGZyb20gcGFnaW5nIHRoZSBCLWVuZCBvZiB0aGUgY29ubmVjdGlvbiAqLworc3RhdGljIGludCBzZXR1cF90cmlnX3BhZ19ldnQodW5zaWduZWQgaW50IGhvb2tudW0sIHVuc2lnbmVkIGludCBldmVudCwKKwkJCSAgICAgIHN0cnVjdCBtc2diICptc2csIHZvaWQgKl9sY2hhbiwgdm9pZCAqcGFyYW0pCit7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBfbGNoYW47CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPSBwYXJhbTsKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuc3QsICp0bXA7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQ7CisKKwlpZiAoaG9va251bSAhPSBHU01fSE9PS19SUl9QQUdJTkcpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFzdWJzY3IpCisJCXJldHVybiAtRUlOVkFMOworCW5ldCA9IHN1YnNjci0+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+bGNoYW47CisKKwkvKiBpZiBwYWdpbmcgZGlkIG5vdCByZXNwb25kIHlldCAqLworCWlmICghbGNoYW4pIHsKKwkJREVCVUdQKERDQywgIihidHMgLSB0cnggLSB0cyAtIHRpIC0tIHN1YiAlcykgIgorCQkJIlJlY2VpdmVkICclcycgZnJvbSBNTkNDIGluIHBhZ2luZyBzdGF0ZVxuIiwKKwkJCSh0cmFucy0+c3Vic2NyKT8odHJhbnMtPnN1YnNjci0+ZXh0ZW5zaW9uKToiLSIsCisJCQlnZXRfbW5jY19uYW1lKG1zZ190eXBlKSk7CisJCW1uY2Nfc2V0X2NhdXNlKCZyZWwsIEdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQlHU000OF9DQ19DQVVTRV9OT1JNX0NBTExfQ0xFQVIpOworCQlpZiAobXNnX3R5cGUgPT0gTU5DQ19SRUxfUkVRKQorCQkJcmMgPSBtbmNjX3JlY3Ztc2cobmV0LCB0cmFucywgTU5DQ19SRUxfQ05GLCAmcmVsKTsKKwkJZWxzZQorCQkJcmMgPSBtbmNjX3JlY3Ztc2cobmV0LCB0cmFucywgTU5DQ19SRUxfSU5ELCAmcmVsKTsKKwkJdHJhbnMtPmNhbGxyZWYgPSAwOworCQl0cmFuc19mcmVlKHRyYW5zKTsKKwkJcmV0dXJuIHJjOworCX0KKworCURFQlVHUChEQ0MsICIoYnRzICVkIHRyeCAlZCB0cyAlZCB0aSAlMDJ4IHN1YiAlcykgIgorCQkiUmVjZWl2ZWQgJyVzJyBmcm9tIE1OQ0MgaW4gc3RhdGUgJWQgKCVzKVxuIiwKKwkJbGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsIGxjaGFuLT50cy0+dHJ4LT5uciwgbGNoYW4tPnRzLT5uciwKKwkJdHJhbnMtPnRyYW5zYWN0aW9uX2lkLAorCQkodHJhbnMtPmNvbm4tPnN1YnNjcik/KHRyYW5zLT5jb25uLT5zdWJzY3ItPmV4dGVuc2lvbik6Ii0iLAorCQlnZXRfbW5jY19uYW1lKG1zZ190eXBlKSwgdHJhbnMtPmNjLnN0YXRlLAorCQlnc200OF9jY19zdGF0ZV9uYW1lKHRyYW5zLT5jYy5zdGF0ZSkpOworCisJLyogRmluZCBmdW5jdGlvbiBmb3IgY3VycmVudCBzdGF0ZSBhbmQgbWVzc2FnZSAqLworCWZvciAoaSA9IDA7IGkgPCBET1dOU0xMRU47IGkrKykKKwkJaWYgKChtc2dfdHlwZSA9PSBkb3duc3RhdGVsaXN0W2ldLnR5cGUpCisJCSAmJiAoKDEgPDwgdHJhbnMtPmNjLnN0YXRlKSAmIGRvd25zdGF0ZWxpc3RbaV0uc3RhdGVzKSkKKwkJCWJyZWFrOworCWlmIChpID09IERPV05TTExFTikgeworCQlERUJVR1AoRENDLCAiTWVzc2FnZSB1bmhhbmRsZWQgYXQgdGhpcyBzdGF0ZS5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyYyA9IGRvd25zdGF0ZWxpc3RbaV0ucm91dCh0cmFucywgYXJnKTsKKworCXJldHVybiByYzsKK30KKworCitzdGF0aWMgc3RydWN0IGRhdGFzdGF0ZSB7CisJdV9pbnQzMl90CXN0YXRlczsKKwlpbnQJCXR5cGU7CisJaW50CQkoKnJvdXQpIChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZyk7Cit9IGRhdGFzdGF0ZWxpc3RbXSA9IHsKKwkvKiBtb2JpbGUgb3JpZ2luYXRpbmcgY2FsbCBlc3RhYmxpc2htZW50ICovCisJe1NCSVQoR1NNX0NTVEFURV9OVUxMKSwgLyogNS4yLjEuMiAqLworCSBHU000OF9NVF9DQ19TRVRVUCwgZ3NtNDhfY2Nfcnhfc2V0dXB9LAorCXtTQklUKEdTTV9DU1RBVEVfTlVMTCksIC8qIDUuMi4xLjIgKi8KKwkgR1NNNDhfTVRfQ0NfRU1FUkdfU0VUVVAsIGdzbTQ4X2NjX3J4X3NldHVwfSwKKwl7U0JJVChHU01fQ1NUQVRFX0NPTk5FQ1RfSU5EKSwgLyogNS4yLjEuMiAqLworCSBHU000OF9NVF9DQ19DT05ORUNUX0FDSywgZ3NtNDhfY2NfcnhfY29ubmVjdF9hY2t9LAorCS8qIG1vYmlsZSB0ZXJtaW5hdGluZyBjYWxsIGVzdGFibGlzaG1lbnQgKi8KKwl7U0JJVChHU01fQ1NUQVRFX0NBTExfUFJFU0VOVCksIC8qIDUuMi4yLjMuMiAqLworCSBHU000OF9NVF9DQ19DQUxMX0NPTkYsIGdzbTQ4X2NjX3J4X2NhbGxfY29uZn0sCisJe1NCSVQoR1NNX0NTVEFURV9DQUxMX1BSRVNFTlQpIHwgU0JJVChHU01fQ1NUQVRFX01PX1RFUk1fQ0FMTF9DT05GKSwgLyogPz8/PyB8IDUuMi4yLjMuMiAqLworCSBHU000OF9NVF9DQ19BTEVSVElORywgZ3NtNDhfY2NfcnhfYWxlcnRpbmd9LAorCXtTQklUKEdTTV9DU1RBVEVfQ0FMTF9QUkVTRU5UKSB8IFNCSVQoR1NNX0NTVEFURV9NT19URVJNX0NBTExfQ09ORikgfCBTQklUKEdTTV9DU1RBVEVfQ0FMTF9SRUNFSVZFRCksIC8qICg1LjIuMi42KSB8IDUuMi4yLjYgfCA1LjIuMi42ICovCisJIEdTTTQ4X01UX0NDX0NPTk5FQ1QsIGdzbTQ4X2NjX3J4X2Nvbm5lY3R9LAorCSAvKiBzaWduYWxsaW5nIGR1cmluZyBjYWxsICovCisJe0FMTF9TVEFURVMgLSBTQklUKEdTTV9DU1RBVEVfTlVMTCksCisJIEdTTTQ4X01UX0NDX0ZBQ0lMSVRZLCBnc200OF9jY19yeF9mYWNpbGl0eX0sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBHU000OF9NVF9DQ19OT1RJRlksIGdzbTQ4X2NjX3J4X25vdGlmeX0sCisJe0FMTF9TVEFURVMsCisJIEdTTTQ4X01UX0NDX1NUQVJUX0RUTUYsIGdzbTQ4X2NjX3J4X3N0YXJ0X2R0bWZ9LAorCXtBTExfU1RBVEVTLAorCSBHU000OF9NVF9DQ19TVE9QX0RUTUYsIGdzbTQ4X2NjX3J4X3N0b3BfZHRtZn0sCisJe0FMTF9TVEFURVMsCisJIEdTTTQ4X01UX0NDX1NUQVRVU19FTlEsIGdzbTQ4X2NjX3J4X3N0YXR1c19lbnF9LAorCXtTQklUKEdTTV9DU1RBVEVfQUNUSVZFKSwKKwkgR1NNNDhfTVRfQ0NfSE9MRCwgZ3NtNDhfY2NfcnhfaG9sZH0sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBHU000OF9NVF9DQ19SRVRSLCBnc200OF9jY19yeF9yZXRyaWV2ZX0sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBHU000OF9NVF9DQ19NT0RJRlksIGdzbTQ4X2NjX3J4X21vZGlmeX0sCisJe1NCSVQoR1NNX0NTVEFURV9NT19URVJNX01PRElGWSksCisJIEdTTTQ4X01UX0NDX01PRElGWV9DT01QTCwgZ3NtNDhfY2NfcnhfbW9kaWZ5X2NvbXBsZXRlfSwKKwl7U0JJVChHU01fQ1NUQVRFX01PX1RFUk1fTU9ESUZZKSwKKwkgR1NNNDhfTVRfQ0NfTU9ESUZZX1JFSkVDVCwgZ3NtNDhfY2NfcnhfbW9kaWZ5X3JlamVjdH0sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBHU000OF9NVF9DQ19VU0VSX0lORk8sIGdzbTQ4X2NjX3J4X3VzZXJpbmZvfSwKKwkvKiBjbGVhcmluZyAqLworCXtBTExfU1RBVEVTIC0gU0JJVChHU01fQ1NUQVRFX05VTEwpIC0gU0JJVChHU01fQ1NUQVRFX1JFTEVBU0VfUkVRKSwgLyogNS40LjMuMiAqLworCSBHU000OF9NVF9DQ19ESVNDT05ORUNULCBnc200OF9jY19yeF9kaXNjb25uZWN0fSwKKwl7QUxMX1NUQVRFUyAtIFNCSVQoR1NNX0NTVEFURV9OVUxMKSwgLyogNS40LjQuMS4yLjIgKi8KKwkgR1NNNDhfTVRfQ0NfUkVMRUFTRSwgZ3NtNDhfY2NfcnhfcmVsZWFzZX0sCisJe0FMTF9TVEFURVMsIC8qIDUuNC4zLjQgKi8KKwkgR1NNNDhfTVRfQ0NfUkVMRUFTRV9DT01QTCwgZ3NtNDhfY2NfcnhfcmVsZWFzZV9jb21wbH0sCit9OworCisjZGVmaW5lIERBVEFTTExFTiBcCisJKHNpemVvZihkYXRhc3RhdGVsaXN0KSAvIHNpemVvZihzdHJ1Y3QgZGF0YXN0YXRlKSkKKworc3RhdGljIGludCBnc20wNDA4X3Jjdl9jYyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVfaW50OF90IG1zZ190eXBlID0gZ2gtPm1zZ190eXBlICYgMHhiZjsKKwl1X2ludDhfdCB0cmFuc2FjdGlvbl9pZCA9ICgoZ2gtPnByb3RvX2Rpc2NyICYgMHhmMCkgXiAweDgwKSA+PiA0OyAvKiBmbGlwICovCisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBtc2ctPmxjaGFuOworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zID0gTlVMTDsKKwlpbnQgaSwgcmMgPSAwOworCisJaWYgKG1zZ190eXBlICYgMHg4MCkgeworCQlERUJVR1AoRENDLCAiTVNHIDB4JTJ4IG5vdCBkZWZpbmVkIGZvciBQRCBlcnJvclxuIiwgbXNnX3R5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljb25uID0gJmxjaGFuLT5jb25uOworCisJLyogRmluZCB0cmFuc2FjdGlvbiAqLworCXRyYW5zID0gdHJhbnNfZmluZF9ieV9pZChjb25uLT5zdWJzY3IsIEdTTTQ4X1BESVNDX0NDLCB0cmFuc2FjdGlvbl9pZCk7CisKKwlERUJVR1AoRENDLCAiKGJ0cyAlZCB0cnggJWQgdHMgJWQgdGkgJXggc3ViICVzKSAiCisJCSJSZWNlaXZlZCAnJXMnIGZyb20gTVMgaW4gc3RhdGUgJWQgKCVzKVxuIiwKKwkJbGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsIGxjaGFuLT50cy0+dHJ4LT5uciwgbGNoYW4tPnRzLT5uciwKKwkJdHJhbnNhY3Rpb25faWQsIChjb25uLT5zdWJzY3IpPyhjb25uLT5zdWJzY3ItPmV4dGVuc2lvbik6Ii0iLAorCQlnc200OF9jY19tc2dfbmFtZShtc2dfdHlwZSksIHRyYW5zPyh0cmFucy0+Y2Muc3RhdGUpOjAsCisJCWdzbTQ4X2NjX3N0YXRlX25hbWUodHJhbnM/KHRyYW5zLT5jYy5zdGF0ZSk6MCkpOworCisJLyogQ3JlYXRlIHRyYW5zYWN0aW9uICovCisJaWYgKCF0cmFucykgeworCQlERUJVR1AoRENDLCAiVW5rbm93biB0cmFuc2FjdGlvbiBJRCAleCwgIgorCQkJImNyZWF0aW5nIG5ldyB0cmFucy5cbiIsIHRyYW5zYWN0aW9uX2lkKTsKKwkJLyogQ3JlYXRlIHRyYW5zYWN0aW9uICovCisJCXRyYW5zID0gdHJhbnNfYWxsb2MoY29ubi0+c3Vic2NyLCBHU000OF9QRElTQ19DQywKKwkJCQkgICAgdHJhbnNhY3Rpb25faWQsIG5ld19jYWxscmVmKyspOworCQlpZiAoIXRyYW5zKSB7CisJCQlERUJVR1AoRENDLCAiTm8gbWVtb3J5IGZvciB0cmFucy5cbiIpOworCQkJcmMgPSBnc200OF90eF9zaW1wbGUobXNnLT5sY2hhbiwKKwkJCQkJICAgICBHU000OF9QRElTQ19DQyB8ICh0cmFuc2FjdGlvbl9pZCA8PCA0KSwKKwkJCQkJICAgICBHU000OF9NVF9DQ19SRUxFQVNFX0NPTVBMKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCS8qIEFzc2lnbiB0cmFuc2FjdGlvbiAqLworCQl0cmFucy0+Y29ubiA9ICZsY2hhbi0+Y29ubjsKKwkJdXNlX3N1YnNjcl9jb24odHJhbnMtPmNvbm4pOworCX0KKworCS8qIGZpbmQgZnVuY3Rpb24gZm9yIGN1cnJlbnQgc3RhdGUgYW5kIG1lc3NhZ2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgREFUQVNMTEVOOyBpKyspCisJCWlmICgobXNnX3R5cGUgPT0gZGF0YXN0YXRlbGlzdFtpXS50eXBlKQorCQkgJiYgKCgxIDw8IHRyYW5zLT5jYy5zdGF0ZSkgJiBkYXRhc3RhdGVsaXN0W2ldLnN0YXRlcykpCisJCQlicmVhazsKKwlpZiAoaSA9PSBEQVRBU0xMRU4pIHsKKwkJREVCVUdQKERDQywgIk1lc3NhZ2UgdW5oYW5kbGVkIGF0IHRoaXMgc3RhdGUuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmMgPSBkYXRhc3RhdGVsaXN0W2ldLnJvdXQodHJhbnMsIG1zZyk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIGhlcmUgd2UgcGFzcyBpbiBhIG1zZ2IgZnJvbSB0aGUgUlNMLT5STEwuICBXZSBleHBlY3QgdGhlIGwzIHBvaW50ZXIgdG8gYmUgc2V0ICovCitpbnQgZ3NtMDQwOF9yY3Ztc2coc3RydWN0IG1zZ2IgKm1zZywgdV9pbnQ4X3QgbGlua19pZCkKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1X2ludDhfdCBwZGlzYyA9IGdoLT5wcm90b19kaXNjciAmIDB4MGY7CisJaW50IHJjID0gMDsKKworCWlmIChzaWxlbnRfY2FsbF9yZXJvdXRlKG1zZykpCisJCXJldHVybiBzaWxlbnRfY2FsbF9yeChtc2cpOworCQorCXN3aXRjaCAocGRpc2MpIHsKKwljYXNlIEdTTTQ4X1BESVNDX0NDOgorCQlyYyA9IGdzbTA0MDhfcmN2X2NjKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfUERJU0NfTU06CisJCXJjID0gZ3NtMDQwOF9yY3ZfbW0obXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9QRElTQ19SUjoKKwkJcmMgPSBnc20wNDA4X3Jjdl9ycihtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X1BESVNDX1NNUzoKKwkJcmMgPSBnc20wNDExX3Jjdl9zbXMobXNnLCBsaW5rX2lkKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9QRElTQ19NTV9HUFJTOgorCWNhc2UgR1NNNDhfUERJU0NfU01fR1BSUzoKKwkJTE9HUChEUkxMLCBMT0dMX05PVElDRSwgIlVuaW1wbGVtZW50ZWQgIgorCQkJIkdTTSAwNC4wOCBkaXNjcmltaW5hdG9yIDB4JTAyeFxuIiwgcGRpc2MpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X1BESVNDX05DX1NTOgorCQlyYyA9IGhhbmRsZV9yY3ZfdXNzZChtc2cpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERSTEwsIExPR0xfTk9USUNFLCAiVW5rbm93biAiCisJCQkiR1NNIDA0LjA4IGRpc2NyaW1pbmF0b3IgMHglMDJ4XG4iLCBwZGlzYyk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworLyogZGVxdWV1ZSBtZXNzYWdlcyB0byBsYXllciA0ICovCitpbnQgYnNjX3VwcXVldWUoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpCit7CisJc3RydWN0IGdzbV9tbmNjICptbmNjOworCXN0cnVjdCBtc2diICptc2c7CisJaW50IHdvcmsgPSAwOworCisJaWYgKG5ldCkKKwkJd2hpbGUgKChtc2cgPSBtc2diX2RlcXVldWUoJm5ldC0+dXBxdWV1ZSkpKSB7CisJCQltbmNjID0gKHN0cnVjdCBnc21fbW5jYyAqKW1zZy0+ZGF0YTsKKwkJCWlmIChuZXQtPm1uY2NfcmVjdikKKwkJCQluZXQtPm1uY2NfcmVjdihuZXQsIG1uY2MtPm1zZ190eXBlLCBtbmNjKTsKKwkJCXdvcmsgPSAxOyAvKiB3b3JrIGRvbmUgKi8KKwkJCXRhbGxvY19mcmVlKG1zZyk7CisJCX0KKworCXJldHVybiB3b3JrOworfQorCisvKgorICogVGhpcyB3aWxsIGJlIHJhbiBieSB0aGUgbGlua2VyIHdoZW4gbG9hZGluZyB0aGUgRFNPLiBXZSB1c2UgaXQgdG8KKyAqIGRvIHN5c3RlbSBpbml0aWFsaXphdGlvbiwgZS5nLiByZWdpc3RyYXRpb24gb2Ygc2lnbmFsIGhhbmRsZXJzLgorICovCitzdGF0aWMgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKSB2b2lkIG9uX2Rzb19sb2FkXzA0MDgodm9pZCkKK3sKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19MQ0hBTiwgZ3NtMDQwOF9oYW5kbGVfbGNoYW5fc2lnbmFsLCBOVUxMKTsKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19BQklTSVAsIGhhbmRsZV9hYmlzaXBfc2lnbmFsLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dzbV8wNF8wOF91dGlscy5jIGIvb3BlbmJzYy9zcmMvZ3NtXzA0XzA4X3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVlMDZjYQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dzbV8wNF8wOF91dGlscy5jCkBAIC0wLDAgKzEsNTc1IEBACisvKiBHU00gTW9iaWxlIFJhZGlvIEludGVyZmFjZSBMYXllciAzIG1lc3NhZ2VzIG9uIHRoZSBBLWJpcyBpbnRlcmZhY2UKKyAqIDNHUFAgVFMgMDQuMDggdmVyc2lvbiA3LjIxLjAgUmVsZWFzZSAxOTk4IC8gRVRTSSBUUyAxMDAgOTQwIFY3LjIxLjAKKyAqIHV0aWxpdHkgZnVuY3Rpb25zCisgKi8KKworLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDgsIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtNDguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RyYW5zYWN0aW9uLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9wYWdpbmcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorCisvKiBzaG91bGQgaXAuYWNjZXNzIEJUUyB1c2UgZGlyZWN0IFJUUCBzdHJlYW1zIGJldHdlZW4gZWFjaCBvdGhlciAoMSksCisgKiBvciBzaG91bGQgT3BlbkJTQyBhbHdheXMgYWN0IGFzIFJUUCByZWxheS9wcm94eSBpbiBiZXR3ZWVuICgwKSA/ICovCitpbnQgaXBhY2NfcnRwX2RpcmVjdCA9IDE7CisKK2ludCBnc200OF9zZW5kbXNnKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnLT5kYXRhOworCisJLyogaWYgd2UgZ2V0IHBhc3NlZCBhIHRyYW5zYWN0aW9uIHJlZmVyZW5jZSwgZG8gc29tZSBjb21tb24KKwkgKiB3b3JrIHRoYXQgdGhlIGNhbGxlciBubyBsb25nZXIgaGFzIHRvIGRvICovCisJaWYgKHRyYW5zKSB7CisJCWdoLT5wcm90b19kaXNjciA9IHRyYW5zLT5wcm90b2NvbCB8ICh0cmFucy0+dHJhbnNhY3Rpb25faWQgPDwgNCk7CisJCW1zZy0+bGNoYW4gPSB0cmFucy0+Y29ubi0+bGNoYW47CisJfQorCisJaWYgKG1zZy0+bGNoYW4pIHsKKwkJbXNnLT50cnggPSBtc2ctPmxjaGFuLT50cy0+dHJ4OworCisJCWlmICgoZ2gtPnByb3RvX2Rpc2NyICYgR1NNNDhfUERJU0NfTUFTSykgPT0gR1NNNDhfUERJU0NfQ0MpCisJCQlERUJVR1AoRENDLCAiKGJ0cyAlZCB0cnggJWQgdHMgJWQgdGkgJTAyeCkgIgorCQkJCSJTZW5kaW5nICclcycgdG8gTVMuXG4iLCBtc2ctPnRyeC0+YnRzLT5uciwKKwkJCQltc2ctPnRyeC0+bnIsIG1zZy0+bGNoYW4tPnRzLT5uciwKKwkJCQlnaC0+cHJvdG9fZGlzY3IgJiAweGYwLAorCQkJCWdzbTQ4X2NjX21zZ19uYW1lKGdoLT5tc2dfdHlwZSkpOworCQllbHNlCisJCQlERUJVR1AoRENDLCAiKGJ0cyAlZCB0cnggJWQgdHMgJWQgcGQgJTAyeCkgIgorCQkJCSJTZW5kaW5nIDB4JTAyeCB0byBNUy5cbiIsIG1zZy0+dHJ4LT5idHMtPm5yLAorCQkJCW1zZy0+dHJ4LT5uciwgbXNnLT5sY2hhbi0+dHMtPm5yLAorCQkJCWdoLT5wcm90b19kaXNjciwgZ2gtPm1zZ190eXBlKTsKKwl9CisKKwltc2ctPmwzaCA9IG1zZy0+ZGF0YTsKKworCXJldHVybiByc2xfZGF0YV9yZXF1ZXN0KG1zZywgMCk7Cit9CisKKy8qIFNlY3Rpb24gOS4xLjggLyBUYWJsZSA5LjkgKi8KK3N0cnVjdCBjaHJlcSB7CisJdV9pbnQ4X3QgdmFsOworCXVfaW50OF90IG1hc2s7CisJZW51bSBjaHJlcV90eXBlIHR5cGU7Cit9OworCisvKiBJZiBTWVNURU0gSU5GT1JNQVRJT04gVFlQRSA0IE5FQ0kgYml0ID09IDEgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2hyZXEgY2hyZXFfdHlwZV9uZWNpMVtdID0geworCXsgMHhhMCwgMHhlMCwgQ0hSRVFfVF9FTUVSR19DQUxMIH0sCisJeyAweGMwLCAweGUwLCBDSFJFUV9UX0NBTExfUkVFU1RfVENIX0YgfSwKKwl7IDB4NjgsIDB4ZmMsIENIUkVRX1RfQ0FMTF9SRUVTVF9UQ0hfSCB9LAorCXsgMHg2YywgMHhmYywgQ0hSRVFfVF9DQUxMX1JFRVNUX1RDSF9IX0RCTCB9LAorCXsgMHhlMCwgMHhlMCwgQ0hSRVFfVF9TRENDSCB9LAorCXsgMHg0MCwgMHhmMCwgQ0hSRVFfVF9WT0lDRV9DQUxMX1RDSF9IIH0sCisJeyAweDUwLCAweGYwLCBDSFJFUV9UX0RBVEFfQ0FMTF9UQ0hfSCB9LAorCXsgMHgwMCwgMHhmMCwgQ0hSRVFfVF9MT0NBVElPTl9VUEQgfSwKKwl7IDB4MTAsIDB4ZjAsIENIUkVRX1RfU0RDQ0ggfSwKKwl7IDB4ODAsIDB4ZTAsIENIUkVRX1RfUEFHX1JfQU5ZX05FQ0kxIH0sCisJeyAweDIwLCAweGYwLCBDSFJFUV9UX1BBR19SX1RDSF9GIH0sCisJeyAweDMwLCAweGYwLCBDSFJFUV9UX1BBR19SX1RDSF9GSCB9LAorCXsgMHg2NywgMHhmZiwgQ0hSRVFfVF9MTVUgfSwKKwl7IDB4NjAsIDB4ZjksIENIUkVRX1RfUkVTRVJWRURfU0RDQ0ggfSwKKwl7IDB4NjEsIDB4ZmIsIENIUkVRX1RfUkVTRVJWRURfU0RDQ0ggfSwKKwl7IDB4NjMsCTB4ZmYsIENIUkVRX1RfUkVTRVJWRURfU0RDQ0ggfSwKKwl7IDB4N2YsIDB4ZmYsIENIUkVRX1RfUkVTRVJWRURfSUdOT1JFIH0sCit9OworCisvKiBJZiBTWVNURU0gSU5GT1JNQVRJT04gVFlQRSA0IE5FQ0kgYml0ID09IDAgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2hyZXEgY2hyZXFfdHlwZV9uZWNpMFtdID0geworCXsgMHhhMCwgMHhlMCwgQ0hSRVFfVF9FTUVSR19DQUxMIH0sCisJeyAweGMwLCAweGUwLCBDSFJFUV9UX0NBTExfUkVFU1RfVENIX0ggfSwKKwl7IDB4ZTAsIDB4ZTAsIENIUkVRX1RfVENIX0YgfSwKKwl7IDB4NTAsIDB4ZjAsIENIUkVRX1RfREFUQV9DQUxMX1RDSF9IIH0sCisJeyAweDAwLCAweGUwLCBDSFJFUV9UX0xPQ0FUSU9OX1VQRCB9LAorCXsgMHg4MCwgMHhlMCwgQ0hSRVFfVF9QQUdfUl9BTllfTkVDSTAgfSwKKwl7IDB4MjAsIDB4ZjAsIENIUkVRX1RfUEFHX1JfVENIX0YgfSwKKwl7IDB4MzAsIDB4ZjAsIENIUkVRX1RfUEFHX1JfVENIX0ZIIH0sCisJeyAweDY3LCAweGZmLCBDSFJFUV9UX0xNVSB9LAorCXsgMHg2MCwgMHhmOSwgQ0hSRVFfVF9SRVNFUlZFRF9TRENDSCB9LAorCXsgMHg2MSwgMHhmYiwgQ0hSRVFfVF9SRVNFUlZFRF9TRENDSCB9LAorCXsgMHg2MywJMHhmZiwgQ0hSRVFfVF9SRVNFUlZFRF9TRENDSCB9LAorCXsgMHg3ZiwgMHhmZiwgQ0hSRVFfVF9SRVNFUlZFRF9JR05PUkUgfSwKK307CisKK3N0YXRpYyBjb25zdCBlbnVtIGdzbV9jaGFuX3QgY3R5cGVfYnlfY2hyZXFbXSA9IHsKKwlbQ0hSRVFfVF9FTUVSR19DQUxMXQkJPSBHU01fTENIQU5fVENIX0YsCisJW0NIUkVRX1RfQ0FMTF9SRUVTVF9UQ0hfRl0JPSBHU01fTENIQU5fVENIX0YsCisJW0NIUkVRX1RfQ0FMTF9SRUVTVF9UQ0hfSF0JPSBHU01fTENIQU5fVENIX0gsCisJW0NIUkVRX1RfQ0FMTF9SRUVTVF9UQ0hfSF9EQkxdCT0gR1NNX0xDSEFOX1RDSF9ILAorCVtDSFJFUV9UX1NEQ0NIXQkJCT0gR1NNX0xDSEFOX1NEQ0NILAorCVtDSFJFUV9UX1RDSF9GXQkJCT0gR1NNX0xDSEFOX1RDSF9GLAorCVtDSFJFUV9UX1ZPSUNFX0NBTExfVENIX0hdCT0gR1NNX0xDSEFOX1RDSF9ILAorCVtDSFJFUV9UX0RBVEFfQ0FMTF9UQ0hfSF0JPSBHU01fTENIQU5fVENIX0gsCisJW0NIUkVRX1RfTE9DQVRJT05fVVBEXQkJPSBHU01fTENIQU5fU0RDQ0gsCisJW0NIUkVRX1RfUEFHX1JfQU5ZX05FQ0kxXQk9IEdTTV9MQ0hBTl9TRENDSCwKKwlbQ0hSRVFfVF9QQUdfUl9BTllfTkVDSTBdCT0gR1NNX0xDSEFOX1NEQ0NILAorCVtDSFJFUV9UX1BBR19SX1RDSF9GXQkJPSBHU01fTENIQU5fVENIX0YsCisJW0NIUkVRX1RfUEFHX1JfVENIX0ZIXQkJPSBHU01fTENIQU5fVENIX0YsCisJW0NIUkVRX1RfTE1VXQkJCT0gR1NNX0xDSEFOX1NEQ0NILAorCVtDSFJFUV9UX1JFU0VSVkVEX1NEQ0NIXQk9IEdTTV9MQ0hBTl9TRENDSCwKKwlbQ0hSRVFfVF9SRVNFUlZFRF9JR05PUkVdCT0gR1NNX0xDSEFOX1VOS05PV04sCit9OworCitzdGF0aWMgY29uc3QgZW51bSBnc21fY2hyZXFfcmVhc29uX3QgcmVhc29uX2J5X2NocmVxW10gPSB7CisJW0NIUkVRX1RfRU1FUkdfQ0FMTF0JCT0gR1NNX0NIUkVRX1JFQVNPTl9FTUVSRywKKwlbQ0hSRVFfVF9DQUxMX1JFRVNUX1RDSF9GXQk9IEdTTV9DSFJFUV9SRUFTT05fQ0FMTCwKKwlbQ0hSRVFfVF9DQUxMX1JFRVNUX1RDSF9IXQk9IEdTTV9DSFJFUV9SRUFTT05fQ0FMTCwKKwlbQ0hSRVFfVF9DQUxMX1JFRVNUX1RDSF9IX0RCTF0JPSBHU01fQ0hSRVFfUkVBU09OX0NBTEwsCisJW0NIUkVRX1RfU0RDQ0hdCQkJPSBHU01fQ0hSRVFfUkVBU09OX09USEVSLAorCVtDSFJFUV9UX1RDSF9GXQkJCT0gR1NNX0NIUkVRX1JFQVNPTl9PVEhFUiwKKwlbQ0hSRVFfVF9WT0lDRV9DQUxMX1RDSF9IXQk9IEdTTV9DSFJFUV9SRUFTT05fQ0FMTCwKKwlbQ0hSRVFfVF9EQVRBX0NBTExfVENIX0hdCT0gR1NNX0NIUkVRX1JFQVNPTl9PVEhFUiwKKwlbQ0hSRVFfVF9MT0NBVElPTl9VUERdCQk9IEdTTV9DSFJFUV9SRUFTT05fTE9DQVRJT05fVVBELAorCVtDSFJFUV9UX1BBR19SX0FOWV9ORUNJMV0JPSBHU01fQ0hSRVFfUkVBU09OX1BBRywKKwlbQ0hSRVFfVF9QQUdfUl9BTllfTkVDSTBdCT0gR1NNX0NIUkVRX1JFQVNPTl9QQUcsCisJW0NIUkVRX1RfUEFHX1JfVENIX0ZdCQk9IEdTTV9DSFJFUV9SRUFTT05fUEFHLAorCVtDSFJFUV9UX1BBR19SX1RDSF9GSF0JCT0gR1NNX0NIUkVRX1JFQVNPTl9QQUcsCisJW0NIUkVRX1RfTE1VXQkJCT0gR1NNX0NIUkVRX1JFQVNPTl9PVEhFUiwKKwlbQ0hSRVFfVF9SRVNFUlZFRF9TRENDSF0JPSBHU01fQ0hSRVFfUkVBU09OX09USEVSLAorCVtDSFJFUV9UX1JFU0VSVkVEX0lHTk9SRV0JPSBHU01fQ0hSRVFfUkVBU09OX09USEVSLAorfTsKKworZW51bSBnc21fY2hhbl90IGdldF9jdHlwZV9ieV9jaHJlcShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCByYSwgaW50IG5lY2kpCit7CisJaW50IGk7CisJaW50IGxlbmd0aDsKKwljb25zdCBzdHJ1Y3QgY2hyZXEgKmNocmVxOworCisJaWYgKG5lY2kpIHsKKwkJY2hyZXEgPSBjaHJlcV90eXBlX25lY2kxOworCQlsZW5ndGggPSBBUlJBWV9TSVpFKGNocmVxX3R5cGVfbmVjaTEpOworCX0gZWxzZSB7CisJCWNocmVxID0gY2hyZXFfdHlwZV9uZWNpMDsKKwkJbGVuZ3RoID0gQVJSQVlfU0laRShjaHJlcV90eXBlX25lY2kwKTsKKwl9CisKKworCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgY2hyZXEgKmNociA9ICZjaHJlcVtpXTsKKwkJaWYgKChyYSAmIGNoci0+bWFzaykgPT0gY2hyLT52YWwpCisJCQlyZXR1cm4gY3R5cGVfYnlfY2hyZXFbY2hyLT50eXBlXTsKKwl9CisJTE9HUChEUlIsIExPR0xfRVJST1IsICJVbmtub3duIENIQU5ORUwgUkVRVUVTVCBSUUQgMHglMDJ4XG4iLCByYSk7CisJcmV0dXJuIEdTTV9MQ0hBTl9TRENDSDsKK30KKworZW51bSBnc21fY2hyZXFfcmVhc29uX3QgZ2V0X3JlYXNvbl9ieV9jaHJlcShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCByYSwgaW50IG5lY2kpCit7CisJaW50IGk7CisJaW50IGxlbmd0aDsKKwljb25zdCBzdHJ1Y3QgY2hyZXEgKmNocmVxOworCisJaWYgKG5lY2kpIHsKKwkJY2hyZXEgPSBjaHJlcV90eXBlX25lY2kxOworCQlsZW5ndGggPSBBUlJBWV9TSVpFKGNocmVxX3R5cGVfbmVjaTEpOworCX0gZWxzZSB7CisJCWNocmVxID0gY2hyZXFfdHlwZV9uZWNpMDsKKwkJbGVuZ3RoID0gQVJSQVlfU0laRShjaHJlcV90eXBlX25lY2kwKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IGNocmVxICpjaHIgPSAmY2hyZXFbaV07CisJCWlmICgocmEgJiBjaHItPm1hc2spID09IGNoci0+dmFsKQorCQkJcmV0dXJuIHJlYXNvbl9ieV9jaHJlcVtjaHItPnR5cGVdOworCX0KKwlMT0dQKERSUiwgTE9HTF9FUlJPUiwgIlVua25vd24gQ0hBTk5FTCBSRVFVRVNUIFJFQVNPTiAweCUwMnhcbiIsIHJhKTsKKwlyZXR1cm4gR1NNX0NIUkVRX1JFQVNPTl9PVEhFUjsKK30KKworLyogNy4xLjcgYW5kIDkuMS43OiBSUiBDSEFObmVsIFJFTGVhc2UgKi8KK2ludCBnc200OF9zZW5kX3JyX3JlbGVhc2Uoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCXVfaW50OF90ICpjYXVzZTsKKworCW1zZy0+bGNoYW4gPSBsY2hhbjsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19SUjsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9SUl9DSEFOX1JFTDsKKworCWNhdXNlID0gbXNnYl9wdXQobXNnLCAxKTsKKwljYXVzZVswXSA9IEdTTTQ4X1JSX0NBVVNFX05PUk1BTDsKKworCURFQlVHUChEUlIsICJTZW5kaW5nIENoYW5uZWwgUmVsZWFzZTogQ2hhbjogTnVtYmVyOiAlZCBUeXBlOiAlZFxuIiwKKwkJbGNoYW4tPm5yLCBsY2hhbi0+dHlwZSk7CisKKwkvKiBTZW5kIGFjdHVhbCByZWxlYXNlIHJlcXVlc3QgdG8gTVMgKi8KKwlnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7CisJLyogRklYTUU6IFN0YXJ0IFRpbWVyIFQzMTA5ICovCisKKwkvKiBEZWFjdGl2YXRlIHRoZSBTQUNDSCBvbiB0aGUgQlRTIHNpZGUgKi8KKwlyZXR1cm4gcnNsX2RlYWN0X3NhY2NoKGxjaGFuKTsKK30KKworaW50IHNlbmRfc2llbWVuc19tcnBjaShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwKKwkJICAgICAgIHVfaW50OF90ICpjbGFzc21hcmsyX2x2KQoreworCXN0cnVjdCByc2xfbXJwY2kgbXJwY2k7CisKKwlpZiAoY2xhc3NtYXJrMl9sdlswXSA8IDIpCisJCXJldHVybiAtRUlOVkFMOworCisJbXJwY2kucG93ZXJfY2xhc3MgPSBjbGFzc21hcmsyX2x2WzFdICYgMHg3OworCW1ycGNpLnZnY3NfY2FwYWJsZSA9IGNsYXNzbWFyazJfbHZbMl0gJiAoMSA8PCAxKTsKKwltcnBjaS52YnNfY2FwYWJsZSA9IGNsYXNzbWFyazJfbHZbMl0gJiAoMSA8PDIpOworCW1ycGNpLmdzbV9waGFzZSA9IChjbGFzc21hcmsyX2x2WzFdKSA+PiA1ICYgMHgzOworCisJcmV0dXJuIHJzbF9zaWVtZW5zX21ycGNpKGxjaGFuLCAmbXJwY2kpOworfQorCitpbnQgZ3NtNDhfcGFnaW5nX2V4dHJhY3RfbWkoc3RydWN0IG1zZ2IgKm1zZywgY2hhciAqbWlfc3RyaW5nLCB1X2ludDhfdCAqbWlfdHlwZSkKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1X2ludDhfdCAqY2xhc3NtYXJrMl9sdiA9IGdoLT5kYXRhICsgMTsKKwl1X2ludDhfdCAqbWlfbHYgPSBnaC0+ZGF0YSArIDIgKyAqY2xhc3NtYXJrMl9sdjsKKwkqbWlfdHlwZSA9IG1pX2x2WzFdICYgR1NNX01JX1RZUEVfTUFTSzsKKworCXJldHVybiBnc200OF9taV90b19zdHJpbmcobWlfc3RyaW5nLCBHU000OF9NSV9TSVpFLCBtaV9sdisxLCAqbWlfbHYpOworfQorCitpbnQgZ3NtNDhfaGFuZGxlX3BhZ2luZ19yZXNwKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSBtc2ctPmxjaGFuLT50cy0+dHJ4LT5idHM7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdV9pbnQ4X3QgKmNsYXNzbWFyazJfbHYgPSBnaC0+ZGF0YSArIDE7CisJc3RydWN0IHBhZ2luZ19zaWduYWxfZGF0YSBzaWdfZGF0YTsKKworCWlmIChpc19zaWVtZW5zX2J0cyhidHMpKQorCQlzZW5kX3NpZW1lbnNfbXJwY2kobXNnLT5sY2hhbiwgY2xhc3NtYXJrMl9sdik7CisKKwlpZiAoIW1zZy0+bGNoYW4tPmNvbm4uc3Vic2NyKSB7CisJCW1zZy0+bGNoYW4tPmNvbm4uc3Vic2NyID0gc3Vic2NyOworCX0gZWxzZSBpZiAobXNnLT5sY2hhbi0+Y29ubi5zdWJzY3IgIT0gc3Vic2NyKSB7CisJCUxPR1AoRFJSLCBMT0dMX0VSUk9SLCAiPC0gQ2hhbm5lbCBhbHJlYWR5IG93bmVkIGJ5IHNvbWVvbmUgZWxzZT9cbiIpOworCQlzdWJzY3JfcHV0KHN1YnNjcik7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSB7CisJCURFQlVHUChEUlIsICI8LSBDaGFubmVsIGFscmVhZHkgb3duZWQgYnkgdXNcbiIpOworCQlzdWJzY3JfcHV0KHN1YnNjcik7CisJCXN1YnNjciA9IG1zZy0+bGNoYW4tPmNvbm4uc3Vic2NyOworCX0KKworCXNpZ19kYXRhLnN1YnNjciA9IHN1YnNjcjsKKwlzaWdfZGF0YS5idHMJPSBtc2ctPmxjaGFuLT50cy0+dHJ4LT5idHM7CisJc2lnX2RhdGEubGNoYW4JPSBtc2ctPmxjaGFuOworCisJYnRzLT5uZXR3b3JrLT5zdGF0cy5wYWdpbmcuY29tcGxldGVkKys7CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfUEFHSU5HLCBTX1BBR0lOR19TVUNDRUVERUQsICZzaWdfZGF0YSk7CisKKwkvKiBTdG9wIHBhZ2luZyBvbiB0aGUgYnRzIHdlIHJlY2VpdmVkIHRoZSBwYWdpbmcgcmVzcG9uc2UgKi8KKwlwYWdpbmdfcmVxdWVzdF9zdG9wKG1zZy0+dHJ4LT5idHMsIHN1YnNjciwgbXNnLT5sY2hhbik7CisJcmV0dXJuIDA7Cit9CisKKy8qIENoYXB0ZXIgOS4xLjk6IENpcGhlcmluZyBNb2RlIENvbW1hbmQgKi8KK2ludCBnc200OF9zZW5kX3JyX2NpcGhfbW9kZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgaW50IHdhbnRfaW1laXN2KQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisJdV9pbnQ4X3QgY2lwaF9tb2Rfc2V0OworCisJbXNnLT5sY2hhbiA9IGxjaGFuOworCisJREVCVUdQKERSUiwgIlRYIENJUEhFUklORyBNT0RFIENNRFxuIik7CisKKwlpZiAobGNoYW4tPmVuY3IuYWxnX2lkIDw9IFJTTF9FTkNfQUxHX0E1KDApKQorCQljaXBoX21vZF9zZXQgPSAwOworCWVsc2UKKwkJY2lwaF9tb2Rfc2V0ID0gKGxjaGFuLT5lbmNyLmFsZ19pZC0yKTw8MSB8IDE7CisKKwlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkgKyAxKTsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19SUjsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9SUl9DSVBIX01fQ01EOworCWdoLT5kYXRhWzBdID0gKHdhbnRfaW1laXN2ICYgMHgxKSA8PCA0IHwgKGNpcGhfbW9kX3NldCAmIDB4Zik7CisKKwlyZXR1cm4gcnNsX2VuY3J5cHRpb25fY21kKG1zZyk7Cit9CisKK3N0YXRpYyB2b2lkIGdzbTQ4X2NlbGxfZGVzYyhzdHJ1Y3QgZ3NtNDhfY2VsbF9kZXNjICpjZCwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCWNkLT5uY2MgPSAoYnRzLT5ic2ljID4+IDMgJiAweDcpOworCWNkLT5iY2MgPSAoYnRzLT5ic2ljICYgMHg3KTsKKwljZC0+YXJmY25faGkgPSBidHMtPmMwLT5hcmZjbiA+PiA4OworCWNkLT5hcmZjbl9sbyA9IGJ0cy0+YzAtPmFyZmNuICYgMHhmZjsKK30KKworc3RhdGljIHZvaWQgZ3NtNDhfY2hhbl9kZXNjKHN0cnVjdCBnc200OF9jaGFuX2Rlc2MgKmNkLAorCQkJICAgIGNvbnN0IHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXVfaW50MTZfdCBhcmZjbiA9IGxjaGFuLT50cy0+dHJ4LT5hcmZjbiAmIDB4M2ZmOworCisJY2QtPmNoYW5fbnIgPSBsY2hhbjJjaGFuX25yKGxjaGFuKTsKKwljZC0+aDAudHNjID0gbGNoYW4tPnRzLT50cngtPmJ0cy0+dHNjOworCWNkLT5oMC5oID0gMDsKKwljZC0+aDAuYXJmY25faGlnaCA9IGFyZmNuID4+IDg7CisJY2QtPmgwLmFyZmNuX2xvdyA9IGFyZmNuICYgMHhmZjsKK30KKworLyogQ2hhcHRlciA5LjEuMTU6IEhhbmRvdmVyIENvbW1hbmQgKi8KK2ludCBnc200OF9zZW5kX2hvX2NtZChzdHJ1Y3QgZ3NtX2xjaGFuICpvbGRfbGNoYW4sIHN0cnVjdCBnc21fbGNoYW4gKm5ld19sY2hhbiwKKwkJICAgICAgdV9pbnQ4X3QgcG93ZXJfY29tbWFuZCwgdV9pbnQ4X3QgaG9fcmVmKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKwlzdHJ1Y3QgZ3NtNDhfaG9fY21kICpobyA9CisJCShzdHJ1Y3QgZ3NtNDhfaG9fY21kICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpobykpOworCisJbXNnLT5sY2hhbiA9IG9sZF9sY2hhbjsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19SUjsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9SUl9IQU5ET19DTUQ7CisKKwkvKiBtYW5kYXRvcnkgYml0cyAqLworCWdzbTQ4X2NlbGxfZGVzYygmaG8tPmNlbGxfZGVzYywgbmV3X2xjaGFuLT50cy0+dHJ4LT5idHMpOworCWdzbTQ4X2NoYW5fZGVzYygmaG8tPmNoYW5fZGVzYywgbmV3X2xjaGFuKTsKKwloby0+aG9fcmVmID0gaG9fcmVmOworCWhvLT5wb3dlcl9jb21tYW5kID0gcG93ZXJfY29tbWFuZDsKKworCS8qIEZJWE1FOiBvcHRpb25hbCBiaXRzIGZvciB0eXBlIG9mIHN5bmNocm9uaXphdGlvbj8gKi8KKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7Cit9CisKKy8qIENoYXB0ZXIgOS4xLjI6IEFzc2lnbm1lbnQgQ29tbWFuZCAqLworaW50IGdzbTQ4X3NlbmRfcnJfYXNzX2NtZChzdHJ1Y3QgZ3NtX2xjaGFuICpkZXN0X2xjaGFuLCBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgcG93ZXJfY29tbWFuZCkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisJc3RydWN0IGdzbTQ4X2Fzc19jbWQgKmFzcyA9CisJCShzdHJ1Y3QgZ3NtNDhfYXNzX2NtZCAqKSBtc2diX3B1dChtc2csIHNpemVvZigqYXNzKSk7CisKKwlERUJVR1AoRFJSLCAiLT4gQVNTSUdOTUVOVCBDT01NQU5EIHRjaF9tb2RlPTB4JTAyeFxuIiwgbGNoYW4tPnRjaF9tb2RlKTsKKworCW1zZy0+bGNoYW4gPSBkZXN0X2xjaGFuOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX1JSOworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX1JSX0FTU19DTUQ7CisKKwkvKgorCSAqIGZpbGwgdGhlIGNoYW5uZWwgaW5mb3JtYXRpb24gZWxlbWVudCwgdGhpcyBjb2RlCisJICogc2hvdWxkIHByb2JhYmx5IGJlIHNoYXJlZCB3aXRoIHJzbF9yeF9jaGFuX3JxZCgpLAorCSAqIGdzbTQ4X3R4X2NoYW5fbW9kZV9tb2RpZnkuIEJ1dCBiZXdhcmUgdGhhdCAxMC41LjIuNQorCSAqIDEwLjUuMi41LmEgaGF2ZSBzbGlnaHRseSBkaWZmZXJlbnQgc2VtYW50aWMgZm9yCisJICogdGhlIGNoYW5fZGVzYy4gQnV0IGFzIGxvbmcgYXMgbXVsdGktc2xvdCBjb25maWd1cmF0aW9ucworCSAqIGFyZSBub3QgdXNlZCB3ZSBzZWVtIHRvIGJlIGZpbmUuCisJICovCisJZ3NtNDhfY2hhbl9kZXNjKCZhc3MtPmNoYW5fZGVzYywgbGNoYW4pOworCWFzcy0+cG93ZXJfY29tbWFuZCA9IHBvd2VyX2NvbW1hbmQ7CisKKwltc2diX3R2X3B1dChtc2csIEdTTTQ4X0lFX0NIQU5NT0RFXzEsIGxjaGFuLT50Y2hfbW9kZSk7CisKKwkvKiBpbiBjYXNlIG9mIG11bHRpIHJhdGUgd2UgbmVlZCB0byBhdHRhY2ggYSBjb25maWcgKi8KKwlpZiAobGNoYW4tPnRjaF9tb2RlID09IEdTTTQ4X0NNT0RFX1NQRUVDSF9BTVIpIHsKKwkJaWYgKGxjaGFuLT5tcl9jb25mLnZlciA9PSAwKSB7CisJCQlMT0dQKERSUiwgTE9HTF9FUlJPUiwgIkJVRzogVXNpbmcgbXVsdGlyYXRlIGNvZGVjICIKKwkJCQkid2l0aG91dCBtdWx0aXJhdGUgY29uZmlnLlxuIik7CisJCX0gZWxzZSB7CisJCQl1X2ludDhfdCAqZGF0YSA9IG1zZ2JfcHV0KG1zZywgNCk7CisJCQlkYXRhWzBdID0gR1NNNDhfSUVfTVVMX1JBVEVfQ0ZHOworCQkJZGF0YVsxXSA9IDB4MjsKKwkJCW1lbWNweSgmZGF0YVsyXSwgJmxjaGFuLT5tcl9jb25mLCAyKTsKKwkJfQorCX0KKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7Cit9CisKKy8qIDkuMS41IENoYW5uZWwgbW9kZSBtb2RpZnk6IE1vZGlmeSB0aGUgbW9kZSBvbiB0aGUgTVMgc2lkZSAqLworaW50IGdzbTQ4X3R4X2NoYW5fbW9kZV9tb2RpZnkoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IG1vZGUpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCXN0cnVjdCBnc200OF9jaGFuX21vZGVfbW9kaWZ5ICpjbW0gPQorCQkoc3RydWN0IGdzbTQ4X2NoYW5fbW9kZV9tb2RpZnkgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmNtbSkpOworCXVfaW50MTZfdCBhcmZjbiA9IGxjaGFuLT50cy0+dHJ4LT5hcmZjbiAmIDB4M2ZmOworCisJREVCVUdQKERSUiwgIi0+IENIQU5ORUwgTU9ERSBNT0RJRlkgbW9kZT0weCUwMnhcbiIsIG1vZGUpOworCisJbGNoYW4tPnRjaF9tb2RlID0gbW9kZTsKKwltc2ctPmxjaGFuID0gbGNoYW47CisJZ2gtPnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfUlI7CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfUlJfQ0hBTl9NT0RFX01PRElGOworCisJLyogZmlsbCB0aGUgY2hhbm5lbCBpbmZvcm1hdGlvbiBlbGVtZW50LCB0aGlzIGNvZGUKKwkgKiBzaG91bGQgcHJvYmFibHkgYmUgc2hhcmVkIHdpdGggcnNsX3J4X2NoYW5fcnFkKCkgKi8KKwljbW0tPmNoYW5fZGVzYy5jaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisJY21tLT5jaGFuX2Rlc2MuaDAudHNjID0gbGNoYW4tPnRzLT50cngtPmJ0cy0+dHNjOworCWNtbS0+Y2hhbl9kZXNjLmgwLmggPSAwOworCWNtbS0+Y2hhbl9kZXNjLmgwLmFyZmNuX2hpZ2ggPSBhcmZjbiA+PiA4OworCWNtbS0+Y2hhbl9kZXNjLmgwLmFyZmNuX2xvdyA9IGFyZmNuICYgMHhmZjsKKwljbW0tPm1vZGUgPSBtb2RlOworCisJLyogaW4gY2FzZSBvZiBtdWx0aSByYXRlIHdlIG5lZWQgdG8gYXR0YWNoIGEgY29uZmlnICovCisJaWYgKGxjaGFuLT50Y2hfbW9kZSA9PSBHU000OF9DTU9ERV9TUEVFQ0hfQU1SKSB7CisJCWlmIChsY2hhbi0+bXJfY29uZi52ZXIgPT0gMCkgeworCQkJTE9HUChEUlIsIExPR0xfRVJST1IsICJCVUc6IFVzaW5nIG11bHRpcmF0ZSBjb2RlYyAiCisJCQkJIndpdGhvdXQgbXVsdGlyYXRlIGNvbmZpZy5cbiIpOworCQl9IGVsc2UgeworCQkJdV9pbnQ4X3QgKmRhdGEgPSBtc2diX3B1dChtc2csIDQpOworCQkJZGF0YVswXSA9IEdTTTQ4X0lFX01VTF9SQVRFX0NGRzsKKwkJCWRhdGFbMV0gPSAweDI7CisJCQltZW1jcHkoJmRhdGFbMl0sICZsY2hhbi0+bXJfY29uZiwgMik7CisJCX0KKwl9CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIE5VTEwpOworfQorCitpbnQgZ3NtNDhfbGNoYW5fbW9kaWZ5KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBsY2hhbl9tb2RlKQoreworCWludCByYzsKKworCXJjID0gZ3NtNDhfdHhfY2hhbl9tb2RlX21vZGlmeShsY2hhbiwgbGNoYW5fbW9kZSk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIHJjOworfQorCitpbnQgZ3NtNDhfcnhfcnJfbW9kaWZfYWNrKHN0cnVjdCBtc2diICptc2cpCit7CisJaW50IHJjOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXN0cnVjdCBnc200OF9jaGFuX21vZGVfbW9kaWZ5ICptb2QgPQorCQkJCShzdHJ1Y3QgZ3NtNDhfY2hhbl9tb2RlX21vZGlmeSAqKSBnaC0+ZGF0YTsKKworCURFQlVHUChEUlIsICJDSEFOTkVMIE1PREUgTU9ESUZZIEFDS1xuIik7CisKKwlpZiAobW9kLT5tb2RlICE9IG1zZy0+bGNoYW4tPnRjaF9tb2RlKSB7CisJCUxPR1AoRFJSLCBMT0dMX0VSUk9SLCAiQ0hBTk5FTCBNT0RFIGNoYW5nZSBmYWlsZWQuIFdhbnRlZDogJWQgR290OiAlZFxuIiwKKwkJCW1zZy0+bGNoYW4tPnRjaF9tb2RlLCBtb2QtPm1vZGUpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogdXBkYXRlIHRoZSBjaGFubmVsIHR5cGUgKi8KKwlzd2l0Y2ggKG1vZC0+bW9kZSkgeworCWNhc2UgR1NNNDhfQ01PREVfU0lHTjoKKwkJbXNnLT5sY2hhbi0+cnNsX2Ntb2RlID0gUlNMX0NNT0RfU1BEX1NJR047CisJCWJyZWFrOworCWNhc2UgR1NNNDhfQ01PREVfU1BFRUNIX1YxOgorCWNhc2UgR1NNNDhfQ01PREVfU1BFRUNIX0VGUjoKKwljYXNlIEdTTTQ4X0NNT0RFX1NQRUVDSF9BTVI6CisJCW1zZy0+bGNoYW4tPnJzbF9jbW9kZSA9IFJTTF9DTU9EX1NQRF9TUEVFQ0g7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfQ01PREVfREFUQV8xNGs1OgorCWNhc2UgR1NNNDhfQ01PREVfREFUQV8xMmswOgorCWNhc2UgR1NNNDhfQ01PREVfREFUQV82azA6CisJY2FzZSBHU000OF9DTU9ERV9EQVRBXzNrNjoKKwkJbXNnLT5sY2hhbi0+cnNsX2Ntb2RlID0gUlNMX0NNT0RfU1BEX0RBVEE7CisJCWJyZWFrOworCX0KKworCS8qIFdlJ3ZlIHN1Y2Nlc3NmdWxseSBtb2RpZmllZCB0aGUgTVMgc2lkZSBvZiB0aGUgY2hhbm5lbCwKKwkgKiBub3cgZ28gb24gdG8gbW9kaWZ5IHRoZSBCVFMgc2lkZSBvZiB0aGUgY2hhbm5lbCAqLworCXJjID0gcnNsX2NoYW5fbW9kZV9tb2RpZnlfcmVxKG1zZy0+bGNoYW4pOworCisJLyogRklYTUU6IHdlIG5vdCBvbmx5IG5lZWQgdG8gZG8gdGhpcyBhZnRlciBtb2RlIG1vZGlmeSwgYnV0CisJICogYWxzbyBhZnRlciBjaGFubmVsIGFjdGl2YXRpb24gKi8KKwlpZiAoaXNfaXBhY2Nlc3NfYnRzKG1zZy0+bGNoYW4tPnRzLT50cngtPmJ0cykgJiYgbW9kLT5tb2RlICE9IEdTTTQ4X0NNT0RFX1NJR04pCisJCXJzbF9pcGFjY19jcmN4KG1zZy0+bGNoYW4pOworCXJldHVybiByYzsKK30KKworaW50IGdzbTQ4X3BhcnNlX21lYXNfcmVwKHN0cnVjdCBnc21fbWVhc19yZXAgKnJlcCwgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4gPSBtc2diX2wzbGVuKG1zZykgLSBzaXplb2YoKmdoKTsKKwl1X2ludDhfdCAqZGF0YSA9IGdoLT5kYXRhOworCXN0cnVjdCBnc21fYnRzICpidHMgPSBtc2ctPmxjaGFuLT50cy0+dHJ4LT5idHM7CisJc3RydWN0IGJpdHZlYyAqbmJ2ID0gJmJ0cy0+c2lfY29tbW9uLm5laWdoX2xpc3Q7CisJc3RydWN0IGdzbV9tZWFzX3JlcF9jZWxsICptcmM7CisKKwlpZiAoZ2gtPm1zZ190eXBlICE9IEdTTTQ4X01UX1JSX01FQVNfUkVQKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChkYXRhWzBdICYgMHg4MCkKKwkJcmVwLT5mbGFncyB8PSBNRUFTX1JFUF9GX0JBMTsKKwlpZiAoZGF0YVswXSAmIDB4NDApCisJCXJlcC0+ZmxhZ3MgfD0gTUVBU19SRVBfRl9VTF9EVFg7CisJaWYgKChkYXRhWzFdICYgMHg0MCkgPT0gMHgwMCkKKwkJcmVwLT5mbGFncyB8PSBNRUFTX1JFUF9GX0RMX1ZBTElEOworCisJcmVwLT5kbC5mdWxsLnJ4X2xldiA9IGRhdGFbMF0gJiAweDNmOworCXJlcC0+ZGwuc3ViLnJ4X2xldiA9IGRhdGFbMV0gJiAweDNmOworCXJlcC0+ZGwuZnVsbC5yeF9xdWFsID0gKGRhdGFbM10gPj4gNCkgJiAweDc7CisJcmVwLT5kbC5zdWIucnhfcXVhbCA9IChkYXRhWzNdID4+IDEpICYgMHg3OworCisJcmVwLT5udW1fY2VsbCA9ICgoZGF0YVszXSA+PiA2KSAmIDB4MykgfCAoKGRhdGFbMl0gJiAweDAxKSA8PCAyKTsKKwlpZiAocmVwLT5udW1fY2VsbCA8IDEgfHwgcmVwLT5udW1fY2VsbCA+IDYpCisJCXJldHVybiAwOworCisJLyogYW4gZW5jb2RpbmcgbmlnaHRtYXJlIGluIHBlcmZlY3Rpb24gKi8KKwltcmMgPSAmcmVwLT5jZWxsWzBdOworCW1yYy0+cnhsZXYgPSBkYXRhWzNdICYgMHgzZjsKKwltcmMtPm5laWdoX2lkeCA9IGRhdGFbNF0gPj4gMzsKKwltcmMtPmFyZmNuID0gYml0dmVjX2dldF9udGhfc2V0X2JpdChuYnYsIG1yYy0+bmVpZ2hfaWR4ICsgMSk7CisJbXJjLT5ic2ljID0gKChkYXRhWzRdICYgMHgwNykgPDwgMykgfCAoZGF0YVs1XSA+PiA1KTsKKwlpZiAocmVwLT5udW1fY2VsbCA8IDIpCisJCXJldHVybiAwOworCisJbXJjID0gJnJlcC0+Y2VsbFsxXTsKKwltcmMtPnJ4bGV2ID0gKChkYXRhWzVdICYgMHgxZikgPDwgMSkgfCAoZGF0YVs2XSA+PiA3KTsKKwltcmMtPm5laWdoX2lkeCA9IChkYXRhWzZdID4+IDIpICYgMHgxZjsKKwltcmMtPmFyZmNuID0gYml0dmVjX2dldF9udGhfc2V0X2JpdChuYnYsIG1yYy0+bmVpZ2hfaWR4ICsgMSk7CisJbXJjLT5ic2ljID0gKChkYXRhWzZdICYgMHgwMykgPDwgNCkgfCAoZGF0YVs3XSA+PiA0KTsKKwlpZiAocmVwLT5udW1fY2VsbCA8IDMpCisJCXJldHVybiAwOworCisJbXJjID0gJnJlcC0+Y2VsbFsyXTsKKwltcmMtPnJ4bGV2ID0gKChkYXRhWzddICYgMHgwZikgPDwgMikgfCAoZGF0YVs4XSA+PiA2KTsKKwltcmMtPm5laWdoX2lkeCA9IChkYXRhWzhdID4+IDEpICYgMHgxZjsKKwltcmMtPmFyZmNuID0gYml0dmVjX2dldF9udGhfc2V0X2JpdChuYnYsIG1yYy0+bmVpZ2hfaWR4ICsgMSk7CisJbXJjLT5ic2ljID0gKChkYXRhWzhdICYgMHgwMSkgPDwgNSkgfCAoZGF0YVs5XSA+PiAzKTsKKwlpZiAocmVwLT5udW1fY2VsbCA8IDQpCisJCXJldHVybiAwOworCisJbXJjID0gJnJlcC0+Y2VsbFszXTsKKwltcmMtPnJ4bGV2ID0gKChkYXRhWzldICYgMHgwNykgPDwgMykgfCAoZGF0YVsxMF0gPj4gNSk7CisJbXJjLT5uZWlnaF9pZHggPSBkYXRhWzEwXSAmIDB4MWY7CisJbXJjLT5hcmZjbiA9IGJpdHZlY19nZXRfbnRoX3NldF9iaXQobmJ2LCBtcmMtPm5laWdoX2lkeCArIDEpOworCW1yYy0+YnNpYyA9IGRhdGFbMTFdID4+IDI7CisJaWYgKHJlcC0+bnVtX2NlbGwgPCA1KQorCQlyZXR1cm4gMDsKKworCW1yYyA9ICZyZXAtPmNlbGxbNF07CisJbXJjLT5yeGxldiA9ICgoZGF0YVsxMV0gJiAweDAzKSA8PCA0KSB8IChkYXRhWzEyXSA+PiA0KTsKKwltcmMtPm5laWdoX2lkeCA9ICgoZGF0YVsxMl0gJiAweGYpIDw8IDEpIHwgKGRhdGFbMTNdID4+IDcpOworCW1yYy0+YXJmY24gPSBiaXR2ZWNfZ2V0X250aF9zZXRfYml0KG5idiwgbXJjLT5uZWlnaF9pZHggKyAxKTsKKwltcmMtPmJzaWMgPSAoZGF0YVsxM10gPj4gMSkgJiAweDNmOworCWlmIChyZXAtPm51bV9jZWxsIDwgNikKKwkJcmV0dXJuIDA7CisKKwltcmMgPSAmcmVwLT5jZWxsWzVdOworCW1yYy0+cnhsZXYgPSAoKGRhdGFbMTNdICYgMHgwMSkgPDwgNSkgfCAoZGF0YVsxNF0gPj4gMyk7CisJbXJjLT5uZWlnaF9pZHggPSAoKGRhdGFbMTRdICYgMHgwNykgPDwgMikgfCAoZGF0YVsxNV0gPj4gNik7CisJbXJjLT5hcmZjbiA9IGJpdHZlY19nZXRfbnRoX3NldF9iaXQobmJ2LCBtcmMtPm5laWdoX2lkeCArIDEpOworCW1yYy0+YnNpYyA9IGRhdGFbMTVdICYgMHgzZjsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3NtXzA0XzExLmMgYi9vcGVuYnNjL3NyYy9nc21fMDRfMTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDkyZjFmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3NtXzA0XzExLmMKQEAgLTAsMCArMSwxMjM4IEBACisvKiBQb2ludC10by1Qb2ludCAoUFApIFNob3J0IE1lc3NhZ2UgU2VydmljZSAoU01TKQorICogU3VwcG9ydCBvbiBNb2JpbGUgUmFkaW8gSW50ZXJmYWNlCisgKiAzR1BQIFRTIDA0LjExIHZlcnNpb24gNy4xLjAgUmVsZWFzZSAxOTk4IC8gRVRTSSBUUyAxMDAgOTQyIFY3LjEuMCAqLworCisvKiAoQykgMjAwOCBieSBEYW5pZWwgV2lsbG1hbm4gPGRhbmllbEB0b3RhbHVlYmVyd2FjaHVuZy5kZT4KKyAqIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzExLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc21fdXRpbHMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RiLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmFuc2FjdGlvbi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcGFnaW5nLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ic2NfcmxsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jaGFuX2FsbG9jLmg+CisKKyNkZWZpbmUgR1NNNDExX0FMTE9DX1NJWkUJMTAyNAorI2RlZmluZSBHU000MTFfQUxMT0NfSEVBRFJPT00JMTI4CisKKyNkZWZpbmUgVU1fU0FQSV9TTVMgMwkvKiBTZWUgR1NNIDA0LjA1LzA0LjA2ICovCisKK3ZvaWQgKnRhbGxfZ3Ntc19jdHg7CitzdGF0aWMgdV9pbnQzMl90IG5ld19jYWxscmVmID0gMHg0MDAwMDAwMTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgY3BfY2F1c2Vfc3Ryc1tdID0geworCXsgR1NNNDExX0NQX0NBVVNFX05FVF9GQUlMLAkiTmV0d29yayBGYWlsdXJlIiB9LAorCXsgR1NNNDExX0NQX0NBVVNFX0NPTkdFU1RJT04sCSJDb25nZXN0aW9uIiB9LAorCXsgR1NNNDExX0NQX0NBVVNFX0lOVl9UUkFOU19JRCwJIkludmFsaWQgVHJhbnNhY3Rpb24gSUQiIH0sCisJeyBHU000MTFfQ1BfQ0FVU0VfU0VNQU5UX0lOQ19NU0csICJTZW1hbnRpY2FsbHkgSW5jb3JyZWN0IE1lc3NhZ2UiIH0sCisJeyBHU000MTFfQ1BfQ0FVU0VfSU5WX01BTkRfSU5GLAkiSW52YWxpZCBNYW5kYXRvcnkgSW5mb3JtYXRpb24iIH0sCisJeyBHU000MTFfQ1BfQ0FVU0VfTVNHVFlQRV9OT1RFWElTVCwgIk1lc3NhZ2UgVHlwZSBkb2Vzbid0IGV4aXN0IiB9LAorCXsgR1NNNDExX0NQX0NBVVNFX01TR19JTkNPTVBfU1RBVEUsCisJCQkJIk1lc3NhZ2UgaW5jb21wYXRpYmxlIHdpdGggcHJvdG9jb2wgc3RhdGUiIH0sCisJeyBHU000MTFfQ1BfQ0FVU0VfSUVfTk9URVhJU1QsCSJJRSBkb2VzIG5vdCBleGlzdCIgfSwKKwl7IEdTTTQxMV9DUF9DQVVTRV9QUk9UT0NPTF9FUlIsCSJQcm90b2NvbCBFcnJvciIgfSwKKwl7IDAsIDAgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgcnBfY2F1c2Vfc3Ryc1tdID0geworCXsgR1NNNDExX1JQX0NBVVNFX01PX05VTV9VTkFTU0lHTkVELCAiKE1PKSBOdW1iZXIgbm90IGFzc2lnbmVkIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01PX09QX0RFVF9CQVJSLCAiKE1PKSBPcGVyYXRvciBkZXRlcm1pbmVkIGJhcnJpbmciIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTU9fQ0FMTF9CQVJSRUQsICIoTU8pIENhbGwgYmFycmVkIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01PX1NNU19SRUpFQ1RFRCwgIihNTykgU01TIHJlamVjdGVkIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01PX0RFU1RfT1VUX09GX09SREVSLCAiKE1PKSBEZXN0aW5hdGlvbiBvdXQgb2Ygb3JkZXIiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTU9fVU5JREVOVElGSUVEX1NVQlNDUiwgIihNTykgVW5pZGVudGlmaWVkIHN1YnNjcmliZXIiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTU9fRkFDSUxJVFlfUkVKLCAiKE1PKSBGYWNpbGl0eSByZWplY3QiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTU9fVU5LTk9XTl9TVUJTQ1IsICIoTU8pIFVua25vd24gc3Vic2NyaWJlciIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19ORVRfT1VUX09GX09SREVSLCAiKE1PKSBOZXR3b3JrIG91dCBvZiBvcmRlciIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19URU1QX0ZBSUwsICIoTU8pIFRlbXBvcmFyeSBmYWlsdXJlIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01PX0NPTkdFU1RJT04sICIoTU8pIENvbmdlc3Rpb24iIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTU9fUkVTX1VOQVZBSUwsICIoTU8pIFJlc291cmNlIHVuYXZhaWxhYmxlIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01PX1JFUV9GQUNfTk9UU1VCU0NSLCAiKE1PKSBSZXF1ZXN0ZWQgZmFjaWxpdHkgbm90IHN1YnNjcmliZWQiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTU9fUkVRX0ZBQ19OT1RJTVBMLCAiKE1PKSBSZXF1ZXN0ZWQgZmFjaWxpdHkgbm90IGltcGxlbWVudGVkIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01PX0lOVEVSV09SS0lORywgIihNTykgSW50ZXJ3b3JraW5nIiB9LAorCS8qIHZhbGlkIG9ubHkgZm9yIE1UICovCisJeyBHU000MTFfUlBfQ0FVU0VfTVRfTUVNX0VYQ0VFREVELCAiKE1UKSBNZW1vcnkgRXhjZWVkZWQiIH0sCisJLyogdmFsaWQgZm9yIGJvdGggZGlyZWN0aW9ucyAqLworCXsgR1NNNDExX1JQX0NBVVNFX0lOVl9UUkFOU19SRUYsICJJbnZhbGlkIFRyYW5zYWN0aW9uIFJlZmVyZW5jZSIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9TRU1BTlRfSU5DX01TRywgIlNlbWFudGljYWxseSBJbmNvcnJlY3QgTWVzc2FnZSIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9JTlZfTUFORF9JTkYsICJJbnZhbGlkIE1hbmRhdG9yeSBJbmZvcm1hdGlvbiIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NU0dUWVBFX05PVEVYSVNULCAiTWVzc2FnZSBUeXBlIG5vbi1leGlzdGFudCIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NU0dfSU5DT01QX1NUQVRFLCAiTWVzc2FnZSBpbmNvbXBhdGlibGUgd2l0aCBwcm90b2NvbCBzdGF0ZSIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9JRV9OT1RFWElTVCwgIkluZm9ybWF0aW9uIEVsZW1lbnQgbm90IGV4aXN0aW5nIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX1BST1RPQ09MX0VSUiwgIlByb3RvY29sIEVycm9yIiB9LAorCXsgMCwgTlVMTCB9Cit9OworCitzdHJ1Y3QgZ3NtX3NtcyAqc21zX2FsbG9jKHZvaWQpCit7CisJcmV0dXJuIHRhbGxvY196ZXJvKHRhbGxfZ3Ntc19jdHgsIHN0cnVjdCBnc21fc21zKTsKK30KKwordm9pZCBzbXNfZnJlZShzdHJ1Y3QgZ3NtX3NtcyAqc21zKQoreworCS8qIGRyb3AgcmVmZXJlbmNlcyB0byBzdWJzY3JpYmVyIHN0cnVjdHVyZSAqLworCWlmIChzbXMtPnNlbmRlcikKKwkJc3Vic2NyX3B1dChzbXMtPnNlbmRlcik7CisJaWYgKHNtcy0+cmVjZWl2ZXIpCisJCXN1YnNjcl9wdXQoc21zLT5yZWNlaXZlcik7CisKKwl0YWxsb2NfZnJlZShzbXMpOworfQorCitzdHJ1Y3QgbXNnYiAqZ3NtNDExX21zZ2JfYWxsb2Modm9pZCkKK3sKKwlyZXR1cm4gbXNnYl9hbGxvY19oZWFkcm9vbShHU000MTFfQUxMT0NfU0laRSwgR1NNNDExX0FMTE9DX0hFQURST09NLAorCQkJCSAgICJHU00gMDQuMTEiKTsKK30KKworc3RhdGljIGludCBnc200MTFfc2VuZG1zZyhzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubiwgc3RydWN0IG1zZ2IgKm1zZywgdV9pbnQ4X3QgbGlua19pZCkKK3sKKwlERUJVR1AoRFNNUywgIkdTTTQuMTEgVFggJXNcbiIsIGhleGR1bXAobXNnLT5kYXRhLCBtc2ctPmxlbikpOworCW1zZy0+bDNoID0gbXNnLT5kYXRhOworCXJldHVybiBnc20wODA4X3N1Ym1pdF9kdGFwKGNvbm4sIG1zZywgbGlua19pZCk7Cit9CisKKy8qIFNNQyBUQzEqIGlzIGV4cGlyZWQgKi8KK3N0YXRpYyB2b2lkIGNwX3RpbWVyX2V4cGlyZWQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucyA9IGRhdGE7CisKKwlERUJVR1AoRFNNUywgIlNNQyBUaW1lciBUQzEqIGlzIGV4cGlyZWQsIGNhbGxpbmcgdHJhbnNfZnJlZSgpXG4iKTsKKwkvKiBGSVhNRTogd2UgbmVlZCB0byByZS10cmFuc21pdCB0aGUgbGFzdCBDUC1EQVRBIDEuLjMgdGltZXMgKi8KKwl0cmFuc19mcmVlKHRyYW5zKTsKK30KKworLyogUHJlZml4IG1zZyB3aXRoIGEgMDQuMDgvMDQuMTEgQ1AgaGVhZGVyICovCitzdGF0aWMgaW50IGdzbTQxMV9jcF9zZW5kbXNnKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLAorCQkJICAgICB1X2ludDhfdCBtc2dfdHlwZSkKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaDsKKworCWdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXNoKG1zZywgc2l6ZW9mKCpnaCkpOworCS8qIE91dGdvaW5nIG5lZWRzIHRoZSBoaWdoZXN0IGJpdCBzZXQgKi8KKwlnaC0+cHJvdG9fZGlzY3IgPSB0cmFucy0+cHJvdG9jb2wgfCAodHJhbnMtPnRyYW5zYWN0aW9uX2lkPDw0KTsKKwlnaC0+bXNnX3R5cGUgPSBtc2dfdHlwZTsKKworCS8qIG1vYmlsZSBvcmlnaW5hdGluZyAqLworCXN3aXRjaCAoZ2gtPm1zZ190eXBlKSB7CisJY2FzZSBHU000MTFfTVRfQ1BfREFUQToKKwkJLyogNS4yLjMuMS4yOiBlbnRlciBNTy13YWl0IGZvciBDUC1hY2sgKi8KKwkJLyogNS4yLjMuMi4zOiBlbnRlciBNVC13YWl0IGZvciBDUC1BQ0sgKi8KKwkJdHJhbnMtPnNtcy5jcF9zdGF0ZSA9IEdTTTQxMV9DUFNfV0FJVF9DUF9BQ0s7CisJCXRyYW5zLT5zbXMuY3BfdGltZXIuZGF0YSA9IHRyYW5zOworCQl0cmFucy0+c21zLmNwX3RpbWVyLmNiID0gY3BfdGltZXJfZXhwaXJlZDsKKwkJLyogNS4zLjIuMTogU2V0IFRpbWVyIFRDMUEgKi8KKwkJYnNjX3NjaGVkdWxlX3RpbWVyKCZ0cmFucy0+c21zLmNwX3RpbWVyLCBHU000MTFfVE1SX1RDMUEpOworCQlERUJVR1AoRFNNUywgIlRYOiBDUC1EQVRBICIpOworCQlicmVhazsKKwljYXNlIEdTTTQxMV9NVF9DUF9BQ0s6CisJCURFQlVHUChEU01TLCAiVFg6IENQLUFDSyAiKTsKKwkJYnJlYWs7CisJY2FzZSBHU000MTFfTVRfQ1BfRVJST1I6CisJCURFQlVHUChEU01TLCAiVFg6IENQLUVSUk9SICIpOworCQlicmVhazsKKwl9CisKKwlERUJVR1BDKERTTVMsICJ0cmFucz0leFxuIiwgdHJhbnMtPnRyYW5zYWN0aW9uX2lkKTsKKworCXJldHVybiBnc200MTFfc2VuZG1zZyh0cmFucy0+Y29ubiwgbXNnLCB0cmFucy0+c21zLmxpbmtfaWQpOworfQorCisvKiBQcmVmaXggbXNnIHdpdGggYSBSUC1EQVRBIGhlYWRlciBhbmQgc2VuZCBhcyBDUC1EQVRBICovCitzdGF0aWMgaW50IGdzbTQxMV9ycF9zZW5kbXNnKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLAorCQkJICAgICB1X2ludDhfdCBycF9tc2dfdHlwZSwgdV9pbnQ4X3QgcnBfbXNnX3JlZikKK3sKKwlzdHJ1Y3QgZ3NtNDExX3JwX2hkciAqcnA7CisJdV9pbnQ4X3QgbGVuID0gbXNnLT5sZW47CisKKwkvKiBHU00gMDQuMTEgUlAtREFUQSBoZWFkZXIgKi8KKwlycCA9IChzdHJ1Y3QgZ3NtNDExX3JwX2hkciAqKW1zZ2JfcHVzaChtc2csIHNpemVvZigqcnApKTsKKwlycC0+bGVuID0gbGVuICsgMjsKKwlycC0+bXNnX3R5cGUgPSBycF9tc2dfdHlwZTsKKwlycC0+bXNnX3JlZiA9IHJwX21zZ19yZWY7IC8qIEZJWE1FOiBDaG9vc2UgcmFuZG9tbHkgKi8KKworCXJldHVybiBnc200MTFfY3Bfc2VuZG1zZyhtc2csIHRyYW5zLCBHU000MTFfTVRfQ1BfREFUQSk7Cit9CisKKy8qIFR1cm4gaW50IGludG8gc2VtaS1vY3RldCByZXByZXNlbnRhdGlvbjogOTggPT4gMHg4OSAqLworc3RhdGljIHVfaW50OF90IGJjZGlmeSh1X2ludDhfdCB2YWx1ZSkKK3sKKwl1X2ludDhfdCByZXQ7CisKKwlyZXQgPSB2YWx1ZSAvIDEwOworCXJldCB8PSAodmFsdWUgJSAxMCkgPDwgNDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIFR1cm4gc2VtaS1vY3RldCByZXByZXNlbnRhdGlvbiBpbnRvIGludDogMHg4OSA9PiA5OCAqLworc3RhdGljIHVfaW50OF90IHVuYmNkaWZ5KHVfaW50OF90IHZhbHVlKQoreworCXVfaW50OF90IHJldDsKKworCWlmICgodmFsdWUgJiAweDBGKSA+IDkgfHwgKHZhbHVlID4+IDQpID4gOSkKKwkJTE9HUChEU01TLCBMT0dMX0VSUk9SLAorCQkgICAgICJ1bmJjZGlmeSBnb3QgdG9vIGJpZyBuaWJibGU6IDB4JTAyWFxuIiwgdmFsdWUpOworCisJcmV0ID0gKHZhbHVlJjB4MEYpKjEwOworCXJldCArPSB2YWx1ZT4+NDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIEdlbmVyYXRlIDAzLjQwIFRQLVNDVFMgKi8KK3N0YXRpYyB2b2lkIGdzbTM0MF9nZW5fc2N0cyh1X2ludDhfdCAqc2N0cywgdGltZV90IHRpbWUpCit7CisJc3RydWN0IHRtICp0bSA9IGxvY2FsdGltZSgmdGltZSk7CisKKwkqc2N0cysrID0gYmNkaWZ5KHRtLT50bV95ZWFyICUgMTAwKTsKKwkqc2N0cysrID0gYmNkaWZ5KHRtLT50bV9tb24gKyAxKTsKKwkqc2N0cysrID0gYmNkaWZ5KHRtLT50bV9tZGF5KTsKKwkqc2N0cysrID0gYmNkaWZ5KHRtLT50bV9ob3VyKTsKKwkqc2N0cysrID0gYmNkaWZ5KHRtLT50bV9taW4pOworCSpzY3RzKysgPSBiY2RpZnkodG0tPnRtX3NlYyk7CisJKnNjdHMrKyA9IGJjZGlmeSh0bS0+dG1fZ210b2ZmLyg2MCoxNSkpOworfQorCisvKiBEZWNvZGUgMDMuNDAgVFAtU0NUUyAoaW50byB1dGMvZ210IHRpbWVzdGFtcCkgKi8KK3N0YXRpYyB0aW1lX3QgZ3NtMzQwX3NjdHModV9pbnQ4X3QgKnNjdHMpCit7CisJc3RydWN0IHRtIHRtOworCisJdV9pbnQ4X3QgeXIgPSB1bmJjZGlmeSgqc2N0cysrKTsKKworCWlmICh5ciA8PSA4MCkKKwkJdG0udG1feWVhciA9IDEwMCArIHlyOworCWVsc2UKKwkJdG0udG1feWVhciA9IHlyOworCXRtLnRtX21vbiAgPSB1bmJjZGlmeSgqc2N0cysrKSAtIDE7CisJdG0udG1fbWRheSA9IHVuYmNkaWZ5KCpzY3RzKyspOworCXRtLnRtX2hvdXIgPSB1bmJjZGlmeSgqc2N0cysrKTsKKwl0bS50bV9taW4gID0gdW5iY2RpZnkoKnNjdHMrKyk7CisJdG0udG1fc2VjICA9IHVuYmNkaWZ5KCpzY3RzKyspOworCS8qIGFjY29yZGluZyB0byBnc20gMDMuNDAgdGltZSB6b25lIGlzCisJICAgImV4cHJlc3NlZCBpbiBxdWFydGVycyBvZiBhbiBob3VyIiAqLworCXRtLnRtX2dtdG9mZiA9IHVuYmNkaWZ5KCpzY3RzKyspICogMTUqNjA7CisKKwlyZXR1cm4gbWt0aW1lKCZ0bSk7Cit9CisKKy8qIFJldHVybiB0aGUgZGVmYXVsdCB2YWxpZGl0eSBwZXJpb2QgaW4gbWludXRlcyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ3NtMzQwX3ZwX2RlZmF1bHQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIG1pbnV0ZXM7CisJLyogRGVmYXVsdCB2YWxpZGl0eTogdHdvIGRheXMgKi8KKwltaW51dGVzID0gMjQgKiA2MCAqIDI7CisJcmV0dXJuIG1pbnV0ZXM7Cit9CisKKy8qIERlY29kZSB2YWxpZGl0eSBwZXJpb2QgZm9ybWF0ICdyZWxhdGl2ZScgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdzbTM0MF92cF9yZWxhdGl2ZSh1X2ludDhfdCAqc21zX3ZwKQoreworCS8qIENoYXB0ZXIgOS4yLjMuMTIuMSAqLworCXVfaW50OF90IHZwOworCXVuc2lnbmVkIGxvbmcgbWludXRlczsKKworCXZwID0gKihzbXNfdnApOworCWlmICh2cCA8PSAxNDMpCisJCW1pbnV0ZXMgPSB2cCArIDEgKiA1OworCWVsc2UgaWYgKHZwIDw9IDE2NykKKwkJbWludXRlcyA9IDEyKjYwICsgKHZwLTE0MykgKiAzMDsKKwllbHNlIGlmICh2cCA8PSAxOTYpCisJCW1pbnV0ZXMgPSB2cC0xNjYgKiA2MCAqIDI0OworCWVsc2UKKwkJbWludXRlcyA9IHZwLTE5MiAqIDYwICogMjQgKiA3OworCXJldHVybiBtaW51dGVzOworfQorCisvKiBEZWNvZGUgdmFsaWRpdHkgcGVyaW9kIGZvcm1hdCAnYWJzb2x1dGUnICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnc20zNDBfdnBfYWJzb2x1dGUodV9pbnQ4X3QgKnNtc192cCkKK3sKKwkvKiBDaGFwdGVyIDkuMi4zLjEyLjIgKi8KKwl0aW1lX3QgZXhwaXJlcywgbm93OworCXVuc2lnbmVkIGxvbmcgbWludXRlczsKKworCWV4cGlyZXMgPSBnc20zNDBfc2N0cyhzbXNfdnApOworCW5vdyA9IG1rdGltZShnbXRpbWUoTlVMTCkpOworCWlmIChleHBpcmVzIDw9IG5vdykKKwkJbWludXRlcyA9IDA7CisJZWxzZQorCQltaW51dGVzID0gKGV4cGlyZXMtbm93KS82MDsKKwlyZXR1cm4gbWludXRlczsKK30KKworLyogRGVjb2RlIHZhbGlkaXR5IHBlcmlvZCBmb3JtYXQgJ3JlbGF0aXZlIGluIGludGVnZXIgcmVwcmVzZW50YXRpb24nICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnc20zNDBfdnBfcmVsYXRpdmVfaW50ZWdlcih1X2ludDhfdCAqc21zX3ZwKQoreworCXVfaW50OF90IHZwOworCXVuc2lnbmVkIGxvbmcgbWludXRlczsKKwl2cCA9ICooc21zX3ZwKTsKKwlpZiAodnAgPT0gMCkgeworCQlMT0dQKERTTVMsIExPR0xfRVJST1IsCisJCSAgICAgInJlc2VydmVkIHJlbGF0aXZlX2ludGVnZXIgdmFsaWRpdHkgcGVyaW9kXG4iKTsKKwkJcmV0dXJuIGdzbTM0MF92cF9kZWZhdWx0KCk7CisJfQorCW1pbnV0ZXMgPSB2cC82MDsKKwlyZXR1cm4gbWludXRlczsKK30KKworLyogRGVjb2RlIHZhbGlkaXR5IHBlcmlvZCBmb3JtYXQgJ3JlbGF0aXZlIGluIHNlbWktb2N0ZXQgcmVwcmVzZW50YXRpb24nICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnc20zNDBfdnBfcmVsYXRpdmVfc2VtaW9jdGV0KHVfaW50OF90ICpzbXNfdnApCit7CisJdW5zaWduZWQgbG9uZyBtaW51dGVzOworCW1pbnV0ZXMgPSB1bmJjZGlmeSgqc21zX3ZwKyspKjYwOyAgLyogaG91cnMgKi8KKwltaW51dGVzICs9IHVuYmNkaWZ5KCpzbXNfdnArKyk7ICAgIC8qIG1pbnV0ZXMgKi8KKwltaW51dGVzICs9IHVuYmNkaWZ5KCpzbXNfdnArKykvNjA7IC8qIHNlY29uZHMgKi8KKwlyZXR1cm4gbWludXRlczsKK30KKworLyogZGVjb2RlIHZhbGlkaXR5IHBlcmlvZC4gcmV0dXJuIG1pbnV0ZXMgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdzbTM0MF92YWxpZGl0eV9wZXJpb2QodV9pbnQ4X3Qgc21zX3ZwZiwgdV9pbnQ4X3QgKnNtc192cCkKK3sKKwl1X2ludDhfdCBmaTsgLyogZnVuY3Rpb25hbGl0eSBpbmRpY2F0b3IgKi8KKworCXN3aXRjaCAoc21zX3ZwZikgeworCWNhc2UgR1NNMzQwX1RQX1ZQRl9SRUxBVElWRToKKwkJcmV0dXJuIGdzbTM0MF92cF9yZWxhdGl2ZShzbXNfdnApOworCWNhc2UgR1NNMzQwX1RQX1ZQRl9BQlNPTFVURToKKwkJcmV0dXJuIGdzbTM0MF92cF9hYnNvbHV0ZShzbXNfdnApOworCWNhc2UgR1NNMzQwX1RQX1ZQRl9FTkhBTkNFRDoKKwkJLyogQ2hhcHRlciA5LjIuMy4xMi4zICovCisJCWZpID0gKnNtc192cCsrOworCQkvKiBpZ25vcmUgYWRkaXRpb25hbCBmaSAqLworCQlpZiAoZmkgJiAoMTw8NykpIHNtc192cCsrOworCQkvKiByZWFkIHZhbGlkaXR5IHBlcmlvZCBmb3JtYXQgKi8KKwkJc3dpdGNoIChmaSAmIDBiMTExKSB7CisJCWNhc2UgMGIwMDA6CisJCQlyZXR1cm4gZ3NtMzQwX3ZwX2RlZmF1bHQoKTsgLyogbm8gdnBmIHNwZWNpZmllZCAqLworCQljYXNlIDBiMDAxOgorCQkJcmV0dXJuIGdzbTM0MF92cF9yZWxhdGl2ZShzbXNfdnApOworCQljYXNlIDBiMDEwOgorCQkJcmV0dXJuIGdzbTM0MF92cF9yZWxhdGl2ZV9pbnRlZ2VyKHNtc192cCk7CisJCWNhc2UgMGIwMTE6CisJCQlyZXR1cm4gZ3NtMzQwX3ZwX3JlbGF0aXZlX3NlbWlvY3RldChzbXNfdnApOworCQlkZWZhdWx0OgorCQkJLyogVGhlIEdTTSBzcGVjIHNheXMgdGhhdCB0aGUgU0Mgc2hvdWxkIHJlamVjdCBhbnkKKwkJCSAgIHVuc3VwcG9ydGVkIGFuZC9vciB1bmRlZmluZWQgdmFsdWVzLiBGSVhNRSAqLworCQkJTE9HUChEU01TLCBMT0dMX0VSUk9SLAorCQkJICAgICAiUmVzZXJ2ZWQgZW5oYW5jZWQgdmFsaWRpdHkgcGVyaW9kIGZvcm1hdFxuIik7CisJCQlyZXR1cm4gZ3NtMzQwX3ZwX2RlZmF1bHQoKTsKKwkJfQorCWNhc2UgR1NNMzQwX1RQX1ZQRl9OT05FOgorCWRlZmF1bHQ6CisJCXJldHVybiBnc20zNDBfdnBfZGVmYXVsdCgpOworCX0KK30KKworLyogZGV0ZXJtaW5lIGNvZGluZyBhbHBoYWJldCBkZXBlbmRlbnQgb24gR1NNIDAzLjM4IFNlY3Rpb24gNCBEQ1MgKi8KK2VudW0gc21zX2FscGhhYmV0IGdzbTMzOF9nZXRfc21zX2FscGhhYmV0KHVfaW50OF90IGRjcykKK3sKKwl1X2ludDhfdCBjZ2JpdHMgPSBkY3MgPj4gNDsKKwllbnVtIHNtc19hbHBoYWJldCBhbHBoYSA9IERDU19OT05FOworCisJaWYgKChjZ2JpdHMgJiAweGMpID09IDApIHsKKwkJaWYgKGNnYml0cyAmIDIpCisJCQlMT0dQKERTTVMsIExPR0xfTk9USUNFLAorCQkJICAgICAiQ29tcHJlc3NlZCBTTVMgbm90IHN1cHBvcnRlZCB5ZXRcbiIpOworCisJCXN3aXRjaCAoKGRjcyA+PiAyKSYweDAzKSB7CisJCWNhc2UgMDoKKwkJCWFscGhhID0gRENTXzdCSVRfREVGQVVMVDsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlhbHBoYSA9IERDU184QklUX0RBVEE7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJYWxwaGEgPSBEQ1NfVUNTMjsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIGlmIChjZ2JpdHMgPT0gMHhjIHx8IGNnYml0cyA9PSAweGQpCisJCWFscGhhID0gRENTXzdCSVRfREVGQVVMVDsKKwllbHNlIGlmIChjZ2JpdHMgPT0gMHhlKQorCQlhbHBoYSA9IERDU19VQ1MyOworCWVsc2UgaWYgKGNnYml0cyA9PSAweGYpIHsKKwkJaWYgKGRjcyAmIDQpCisJCQlhbHBoYSA9IERDU184QklUX0RBVEE7CisJCWVsc2UKKwkJCWFscGhhID0gRENTXzdCSVRfREVGQVVMVDsKKwl9CisKKwlyZXR1cm4gYWxwaGE7Cit9CisKK3N0YXRpYyBpbnQgZ3NtMzQwX3J4X3Ntc19zdWJtaXQoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV9zbXMgKmdzbXMpCit7CisJaWYgKGRiX3Ntc19zdG9yZShnc21zKSAhPSAwKSB7CisJCUxPR1AoRFNNUywgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBzdG9yZSBTTVMgaW4gRGF0YWJhc2VcbiIpOworCQlyZXR1cm4gR1NNNDExX1JQX0NBVVNFX01PX05FVF9PVVRfT0ZfT1JERVI7CisJfQorCS8qIGRpc3BhdGNoIGEgc2lnbmFsIHRvIHRlbGwgaGlnaGVyIGxldmVsIGFib3V0IGl0ICovCisJZGlzcGF0Y2hfc2lnbmFsKFNTX1NNUywgU19TTVNfU1VCTUlUVEVELCBnc21zKTsKKwkvKiB0cnkgZGVsaXZlcmluZyB0aGUgU01TIHJpZ2h0IG5vdyAqLworCS8vZ3NtNDExX3NlbmRfc21zX3N1YnNjcihnc21zLT5yZWNlaXZlciwgZ3Ntcyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogZ2VuZXJhdGUgYSBUUERVIGFkZHJlc3MgZmllbGQgY29tcGxpYW50IHdpdGggMDMuNDAgc2VjLiA5LjEuMi41ICovCitzdGF0aWMgaW50IGdzbTM0MF9nZW5fb2EodV9pbnQ4X3QgKm9hLCB1bnNpZ25lZCBpbnQgb2FfbGVuLAorCQkJIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCWludCBsZW5faW5fYnl0ZXM7CisKKwlvYVsxXSA9IDB4Yjk7IC8qIG5ldHdvcmtzLXNwZWNpZmljIG51bWJlciwgcHJpdmF0ZSBudW1iZXJpbmcgcGxhbiAqLworCisJbGVuX2luX2J5dGVzID0gZ3NtNDhfZW5jb2RlX2JjZF9udW1iZXIob2EsIG9hX2xlbiwgMSwgc3Vic2NyLT5leHRlbnNpb24pOworCisJLyogR1NNIDAzLjQwIHRlbGxzIHVzIHRoZSBsZW5ndGggaXMgaW4gJ3VzZWZ1bCBzZW1pLW9jdGV0cycgKi8KKwlvYVswXSA9IHN0cmxlbihzdWJzY3ItPmV4dGVuc2lvbikgJiAweGZmOworCisJcmV0dXJuIGxlbl9pbl9ieXRlczsKK30KKworLyogZ2VuZXJhdGUgYSBtc2diIGNvbnRhaW5pbmcgYSBUUERVIGRlcml2ZWQgZnJvbSBzdHJ1Y3QgZ3NtX3NtcywKKyAqIHJldHVybnMgdG90YWwgc2l6ZSBvZiBUUERVICovCitzdGF0aWMgaW50IGdzbTM0MF9nZW5fdHBkdShzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ3NtX3NtcyAqc21zKQoreworCXVfaW50OF90ICpzbXNwOworCXVfaW50OF90IG9hWzEyXTsJLyogbWF4IGxlbiBwZXIgMDMuNDAgKi8KKwl1X2ludDhfdCBvYV9sZW4gPSAwOworCXVfaW50OF90IG9jdGV0X2xlbjsKKwl1bnNpZ25lZCBpbnQgb2xkX21zZ19sZW4gPSBtc2ctPmxlbjsKKworCS8qIGdlbmVyYXRlIGZpcnN0IG9jdGV0IHdpdGggbWFza2VkIGJpdHMgKi8KKwlzbXNwID0gbXNnYl9wdXQobXNnLCAxKTsKKwkvKiBUUC1NVEkgKG1lc3NhZ2UgdHlwZSBpbmRpY2F0b3IpICovCisJKnNtc3AgPSBHU00zNDBfU01TX0RFTElWRVJfU0MyTVM7CisJLyogVFAtTU1TIChtb3JlIG1lc3NhZ2VzIHRvIHNlbmQpICovCisJaWYgKDAgLyogRklYTUUgKi8pCisJCSpzbXNwIHw9IDB4MDQ7CisJLyogVFAtU1JJKGRlbGl2ZXIpL1NSUihzdWJtaXQpICovCisJaWYgKHNtcy0+c3RhdHVzX3JlcF9yZXEpCisJCSpzbXNwIHw9IDB4MjA7CisJLyogVFAtVURISSAoaW5kaWNhdGluZyBUUC1VRCBjb250YWlucyBhIGhlYWRlcikgKi8KKwlpZiAoc21zLT51ZF9oZHJfaW5kKQorCQkqc21zcCB8PSAweDQwOworI2lmIDAKKwkvKiBUUC1SUCAoaW5kaWNhdGluZyB0aGF0IGEgcmVwbHkgcGF0aCBleGlzdHMpICovCisJaWYgKHNtcy0+CisJCSpzbXNwIHw9IDB4ODA7CisjZW5kaWYKKwkKKwkvKiBnZW5lcmF0ZSBvcmlnaW5hdG9yIGFkZHJlc3MgKi8KKwlvYV9sZW4gPSBnc20zNDBfZ2VuX29hKG9hLCBzaXplb2Yob2EpLCBzbXMtPnNlbmRlcik7CisJc21zcCA9IG1zZ2JfcHV0KG1zZywgb2FfbGVuKTsKKwltZW1jcHkoc21zcCwgb2EsIG9hX2xlbik7CisKKwkvKiBnZW5lcmF0ZSBUUC1QSUQgKi8KKwlzbXNwID0gbXNnYl9wdXQobXNnLCAxKTsKKwkqc21zcCA9IHNtcy0+cHJvdG9jb2xfaWQ7CisKKwkvKiBnZW5lcmF0ZSBUUC1EQ1MgKi8KKwlzbXNwID0gbXNnYl9wdXQobXNnLCAxKTsKKwkqc21zcCA9IHNtcy0+ZGF0YV9jb2Rpbmdfc2NoZW1lOworCisJLyogZ2VuZXJhdGUgVFAtU0NUUyAqLworCXNtc3AgPSBtc2diX3B1dChtc2csIDcpOworCWdzbTM0MF9nZW5fc2N0cyhzbXNwLCB0aW1lKE5VTEwpKTsKKworCS8qIGdlbmVyYXRlIFRQLVVETCAqLworCXNtc3AgPSBtc2diX3B1dChtc2csIDEpOworCSpzbXNwID0gc21zLT51c2VyX2RhdGFfbGVuOworCisJLyogZ2VuZXJhdGUgVFAtVUQgKi8KKwlzd2l0Y2ggKGdzbTMzOF9nZXRfc21zX2FscGhhYmV0KHNtcy0+ZGF0YV9jb2Rpbmdfc2NoZW1lKSkgeworCWNhc2UgRENTXzdCSVRfREVGQVVMVDoKKwkJb2N0ZXRfbGVuID0gc21zLT51c2VyX2RhdGFfbGVuKjcvODsKKwkJaWYgKHNtcy0+dXNlcl9kYXRhX2xlbio3JTggIT0gMCkKKwkJCW9jdGV0X2xlbisrOworCQkvKiBXYXJuaW5nLCB1c2VyX2RhdGFfbGVuIGluZGljYXRlcyB0aGUgYW1vdW50IG9mIHNlcHRldHMKKwkJICogKGNoYXJhY3RlcnMpLCB3ZSBuZWVkIGFtb3VudCBvZiBvY3RldHMgb2NjdXBpZWQgKi8KKwkJc21zcCA9IG1zZ2JfcHV0KG1zZywgb2N0ZXRfbGVuKTsKKwkJbWVtY3B5KHNtc3AsIHNtcy0+dXNlcl9kYXRhLCBvY3RldF9sZW4pOworCQlicmVhazsKKwljYXNlIERDU19VQ1MyOgorCWNhc2UgRENTXzhCSVRfREFUQToKKwkJc21zcCA9IG1zZ2JfcHV0KG1zZywgc21zLT51c2VyX2RhdGFfbGVuKTsKKwkJbWVtY3B5KHNtc3AsIHNtcy0+dXNlcl9kYXRhLCBzbXMtPnVzZXJfZGF0YV9sZW4pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERTTVMsIExPR0xfTk9USUNFLCAiVW5oYW5kbGVkIERhdGEgQ29kaW5nIFNjaGVtZTogMHglMDJYXG4iLAorCQkgICAgIHNtcy0+ZGF0YV9jb2Rpbmdfc2NoZW1lKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIG1zZy0+bGVuIC0gb2xkX21zZ19sZW47Cit9CisKKy8qIHByb2Nlc3MgYW4gaW5jb21pbmcgVFBEVSAoY2FsbGVkIGZyb20gUlAtREFUQSkKKyAqIHJldHVybiB2YWx1ZSA+IDA6IFJQIENBVVNFIGZvciBFUlJPUjsgPCAwOiBzaWxlbnQgZXJyb3I7IDAgPSBzdWNjZXNzICovCitzdGF0aWMgaW50IGdzbTM0MF9yeF90cGR1KHN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXVfaW50OF90ICpzbXNwID0gbXNnYl9zbXMobXNnKTsKKwlzdHJ1Y3QgZ3NtX3NtcyAqZ3NtczsKKwl1X2ludDhfdCBzbXNfbXRpLCBzbXNfbW1zLCBzbXNfdnBmLCBzbXNfYWxwaGFiZXQsIHNtc19ycDsKKwl1X2ludDhfdCAqc21zX3ZwOworCXVfaW50OF90IGRhX2xlbl9ieXRlczsKKwl1X2ludDhfdCBhZGRyZXNzX2x2WzEyXTsgLyogYWNjb3JkaW5nIHRvIDAzLjQwIC8gOS4xLjIuNSAqLworCWludCByYyA9IDA7CisKKwljb3VudGVyX2luYyhjb25uLT5idHMtPm5ldHdvcmstPnN0YXRzLnNtcy5zdWJtaXR0ZWQpOworCisJZ3NtcyA9IHNtc19hbGxvYygpOworCWlmICghZ3NtcykKKwkJcmV0dXJuIEdTTTQxMV9SUF9DQVVTRV9NT19ORVRfT1VUX09GX09SREVSOworCisJLyogaW52ZXJ0IHRob3NlIGZpZWxkcyB3aGVyZSAwIG1lYW5zIGFjdGl2ZS9wcmVzZW50ICovCisJc21zX210aSA9ICpzbXNwICYgMHgwMzsKKwlzbXNfbW1zID0gISEoKnNtc3AgJiAweDA0KTsKKwlzbXNfdnBmID0gKCpzbXNwICYgMHgxOCkgPj4gMzsKKwlnc21zLT5zdGF0dXNfcmVwX3JlcSA9ICgqc21zcCAmIDB4MjApOworCWdzbXMtPnVkX2hkcl9pbmQgPSAoKnNtc3AgJiAweDQwKTsKKwlzbXNfcnAgID0gKCpzbXNwICYgMHg4MCk7CisKKwlzbXNwKys7CisJZ3Ntcy0+bXNnX3JlZiA9ICpzbXNwKys7CisKKwkvKiBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwlkYV9sZW5fYnl0ZXMgPSAyICsgKnNtc3AvMiArICpzbXNwJTI7CisJaWYgKGRhX2xlbl9ieXRlcyA+IDEyKSB7CisJCUxPR1AoRFNNUywgTE9HTF9FUlJPUiwgIkRlc3RpbmF0aW9uIEFkZHJlc3MgPiAxMiBieXRlcyA/IT9cbiIpOworCQlyYyA9IEdTTTQxMV9SUF9DQVVTRV9TRU1BTlRfSU5DX01TRzsKKwkJZ290byBvdXQ7CisJfQorCW1lbXNldChhZGRyZXNzX2x2LCAwLCBzaXplb2YoYWRkcmVzc19sdikpOworCW1lbWNweShhZGRyZXNzX2x2LCBzbXNwLCBkYV9sZW5fYnl0ZXMpOworCS8qIG1hbmdsZSBmaXJzdCBieXRlIHRvIHJlZmxlY3QgbGVuZ3RoIGluIGJ5dGVzLCBub3QgZGlnaXRzICovCisJYWRkcmVzc19sdlswXSA9IGRhX2xlbl9ieXRlcyAtIDE7CisJLyogY29udmVydCB0byByZWFsIG51bWJlciAqLworCWdzbTQ4X2RlY29kZV9iY2RfbnVtYmVyKGdzbXMtPmRlc3RfYWRkciwgc2l6ZW9mKGdzbXMtPmRlc3RfYWRkciksIGFkZHJlc3NfbHYsIDEpOworCXNtc3AgKz0gZGFfbGVuX2J5dGVzOworCisJZ3Ntcy0+cHJvdG9jb2xfaWQgPSAqc21zcCsrOworCWdzbXMtPmRhdGFfY29kaW5nX3NjaGVtZSA9ICpzbXNwKys7CisKKwlzbXNfYWxwaGFiZXQgPSBnc20zMzhfZ2V0X3Ntc19hbHBoYWJldChnc21zLT5kYXRhX2NvZGluZ19zY2hlbWUpOworCisJc3dpdGNoIChzbXNfdnBmKSB7CisJY2FzZSBHU00zNDBfVFBfVlBGX1JFTEFUSVZFOgorCQlzbXNfdnAgPSBzbXNwKys7CisJCWJyZWFrOworCWNhc2UgR1NNMzQwX1RQX1ZQRl9BQlNPTFVURToKKwljYXNlIEdTTTM0MF9UUF9WUEZfRU5IQU5DRUQ6CisJCXNtc192cCA9IHNtc3A7CisJCS8qIHRoZSBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgaW5kaWNhdG9yLi4uICovCisJCWlmIChzbXNfdnBmID09IEdTTTM0MF9UUF9WUEZfRU5IQU5DRUQgJiYgKnNtc3AgJiAoMTw8NykpCisJCQlzbXNwKys7CisJCXNtc3AgKz0gNzsKKwkJYnJlYWs7CisJY2FzZSBHU00zNDBfVFBfVlBGX05PTkU6CisJCXNtc192cCA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFNNUywgTE9HTF9OT1RJQ0UsCisJCSAgICAgIlNNUyBWYWxpZGl0eSBwZXJpb2Qgbm90IGltcGxlbWVudGVkOiAweCUwMnhcbiIsIHNtc192cGYpOworCQlyZXR1cm4gR1NNNDExX1JQX0NBVVNFX01PX05FVF9PVVRfT0ZfT1JERVI7CisJfQorCWdzbXMtPnVzZXJfZGF0YV9sZW4gPSAqc21zcCsrOworCWlmIChnc21zLT51c2VyX2RhdGFfbGVuKSB7CisJCW1lbWNweShnc21zLT51c2VyX2RhdGEsIHNtc3AsIGdzbXMtPnVzZXJfZGF0YV9sZW4pOworCisJCXN3aXRjaCAoc21zX2FscGhhYmV0KSB7CisJCWNhc2UgRENTXzdCSVRfREVGQVVMVDoKKwkJCWdzbV83Yml0X2RlY29kZShnc21zLT50ZXh0LCBzbXNwLCBnc21zLT51c2VyX2RhdGFfbGVuKTsKKwkJCWJyZWFrOworCQljYXNlIERDU184QklUX0RBVEE6CisJCWNhc2UgRENTX1VDUzI6CisJCWNhc2UgRENTX05PTkU6CisJCQlicmVhazsKKwkJfQorCX0KKworCWdzbXMtPnNlbmRlciA9IHN1YnNjcl9nZXQobXNnLT5sY2hhbi0+Y29ubi5zdWJzY3IpOworCisJTE9HUChEU01TLCBMT0dMX0lORk8sICJSWCBTTVM6IFNlbmRlcjogJXMsIE1USTogMHglMDJ4LCBWUEY6IDB4JTAyeCwgIgorCSAgICAgIk1SOiAweCUwMnggUElEOiAweCUwMngsIERDUzogMHglMDJ4LCBEQTogJXMsICIKKwkgICAgICJVc2VyRGF0YUxlbmd0aDogMHglMDJ4LCBVc2VyRGF0YTogXCIlc1wiXG4iLAorCSAgICAgc3Vic2NyX25hbWUoZ3Ntcy0+c2VuZGVyKSwgc21zX210aSwgc21zX3ZwZiwgZ3Ntcy0+bXNnX3JlZiwKKwkgICAgIGdzbXMtPnByb3RvY29sX2lkLCBnc21zLT5kYXRhX2NvZGluZ19zY2hlbWUsIGdzbXMtPmRlc3RfYWRkciwKKwkgICAgIGdzbXMtPnVzZXJfZGF0YV9sZW4sCisJCQlzbXNfYWxwaGFiZXQgPT0gRENTXzdCSVRfREVGQVVMVCA/IGdzbXMtPnRleHQgOgorCQkJCWhleGR1bXAoZ3Ntcy0+dXNlcl9kYXRhLCBnc21zLT51c2VyX2RhdGFfbGVuKSk7CisKKwlnc21zLT52YWxpZGl0eV9taW51dGVzID0gZ3NtMzQwX3ZhbGlkaXR5X3BlcmlvZChzbXNfdnBmLCBzbXNfdnApOworCisJZGlzcGF0Y2hfc2lnbmFsKFNTX1NNUywgMCwgZ3Ntcyk7CisKKwkvKiBkZXRlcm1pbmUgZ3Ntcy0+cmVjZWl2ZXIgYmFzZWQgb24gZGlhbGxlZCBudW1iZXIgKi8KKwlnc21zLT5yZWNlaXZlciA9IHN1YnNjcl9nZXRfYnlfZXh0ZW5zaW9uKGNvbm4tPmJ0cy0+bmV0d29yaywgZ3Ntcy0+ZGVzdF9hZGRyKTsKKwlpZiAoIWdzbXMtPnJlY2VpdmVyKSB7CisJCXJjID0gMTsgLyogY2F1c2UgMTogdW5rbm93biBzdWJzY3JpYmVyICovCisJCWNvdW50ZXJfaW5jKGNvbm4tPmJ0cy0+bmV0d29yay0+c3RhdHMuc21zLm5vX3JlY2VpdmVyKTsKKwkJZ290byBvdXQ7CisJfQorCisJc3dpdGNoIChzbXNfbXRpKSB7CisJY2FzZSBHU00zNDBfU01TX1NVQk1JVF9NUzJTQzoKKwkJLyogTVMgaXMgc3VibWl0dGluZyBhIFNNUyAqLworCQlyYyA9IGdzbTM0MF9yeF9zbXNfc3VibWl0KG1zZywgZ3Ntcyk7CisJCWJyZWFrOworCWNhc2UgR1NNMzQwX1NNU19DT01NQU5EX01TMlNDOgorCWNhc2UgR1NNMzQwX1NNU19ERUxJVkVSX1JFUF9NUzJTQzoKKwkJTE9HUChEU01TLCBMT0dMX05PVElDRSwgIlVuaW1wbGVtZW50ZWQgTVRJIDB4JTAyeFxuIiwgc21zX210aSk7CisJCXJjID0gR1NNNDExX1JQX0NBVVNFX0lFX05PVEVYSVNUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERTTVMsIExPR0xfTk9USUNFLCAiVW5kZWZpbmVkIE1USSAweCUwMnhcbiIsIHNtc19tdGkpOworCQlyYyA9IEdTTTQxMV9SUF9DQVVTRV9JRV9OT1RFWElTVDsKKwkJYnJlYWs7CisJfQorCisJaWYgKCFyYyAmJiAhZ3Ntcy0+cmVjZWl2ZXIpCisJCXJjID0gR1NNNDExX1JQX0NBVVNFX01PX05VTV9VTkFTU0lHTkVEOworCitvdXQ6CisJc21zX2ZyZWUoZ3Ntcyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDExX3NlbmRfcnBfYWNrKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB1X2ludDhfdCBtc2dfcmVmKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200MTFfbXNnYl9hbGxvYygpOworCisJREVCVUdQKERTTVMsICJUWDogU01TIFJQIEFDS1xuIik7CisKKwlyZXR1cm4gZ3NtNDExX3JwX3NlbmRtc2cobXNnLCB0cmFucywgR1NNNDExX01UX1JQX0FDS19NVCwgbXNnX3JlZik7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDExX3NlbmRfcnBfZXJyb3Ioc3RydWN0IGdzbV90cmFucyAqdHJhbnMsCisJCQkJdV9pbnQ4X3QgbXNnX3JlZiwgdV9pbnQ4X3QgY2F1c2UpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQxMV9tc2diX2FsbG9jKCk7CisKKwltc2diX3R2X3B1dChtc2csIDEsIGNhdXNlKTsKKworCUxPR1AoRFNNUywgTE9HTF9OT1RJQ0UsICJUWDogU01TIFJQIEVSUk9SLCBjYXVzZSAlZCAoJXMpXG4iLCBjYXVzZSwKKwkJZ2V0X3ZhbHVlX3N0cmluZyhycF9jYXVzZV9zdHJzLCBjYXVzZSkpOworCisJcmV0dXJuIGdzbTQxMV9ycF9zZW5kbXNnKG1zZywgdHJhbnMsIEdTTTQxMV9NVF9SUF9FUlJPUl9NVCwgbXNnX3JlZik7Cit9CisKKy8qIFJlY2VpdmUgYSAwNC4xMSBUUERVIGluc2lkZSBSUC1EQVRBIC8gdXNlciBkYXRhICovCitzdGF0aWMgaW50IGdzbTQxMV9yeF9ycF91ZChzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywKKwkJCSAgc3RydWN0IGdzbTQxMV9ycF9oZHIgKnJwaCwKKwkJCSAgdV9pbnQ4X3Qgc3JjX2xlbiwgdV9pbnQ4X3QgKnNyYywKKwkJCSAgdV9pbnQ4X3QgZHN0X2xlbiwgdV9pbnQ4X3QgKmRzdCwKKwkJCSAgdV9pbnQ4X3QgdHBkdV9sZW4sIHVfaW50OF90ICp0cGR1KQoreworCWludCByYyA9IDA7CisKKwlpZiAoc3JjX2xlbiAmJiBzcmMpCisJCUxPR1AoRFNNUywgTE9HTF9FUlJPUiwgIlJQLURBVEEgKE1PKSB3aXRoIFNSQyA/IT9cbiIpOworCisJaWYgKCFkc3RfbGVuIHx8ICFkc3QgfHwgIXRwZHVfbGVuIHx8ICF0cGR1KSB7CisJCUxPR1AoRFNNUywgTE9HTF9FUlJPUiwKKwkJCSJSUC1EQVRBIChNTykgd2l0aG91dCBEU1Qgb3IgVFBEVSA/IT9cbiIpOworCQlnc200MTFfc2VuZF9ycF9lcnJvcih0cmFucywgcnBoLT5tc2dfcmVmLAorCQkJCSAgICAgR1NNNDExX1JQX0NBVVNFX0lOVl9NQU5EX0lORik7CisJCXJldHVybiAtRUlPOworCX0KKwltc2ctPmw0aCA9IHRwZHU7CisKKwlERUJVR1AoRFNNUywgIkRTVCgldSwlcylcbiIsIGRzdF9sZW4sIGhleGR1bXAoZHN0LCBkc3RfbGVuKSk7CisKKwlyYyA9IGdzbTM0MF9yeF90cGR1KHRyYW5zLT5jb25uLCBtc2cpOworCWlmIChyYyA9PSAwKQorCQlyZXR1cm4gZ3NtNDExX3NlbmRfcnBfYWNrKHRyYW5zLCBycGgtPm1zZ19yZWYpOworCWVsc2UgaWYgKHJjID4gMCkKKwkJcmV0dXJuIGdzbTQxMV9zZW5kX3JwX2Vycm9yKHRyYW5zLCBycGgtPm1zZ19yZWYsIHJjKTsKKwllbHNlCisJCXJldHVybiByYzsKK30KKworLyogUmVjZWl2ZSBhIDA0LjExIFJQLURBVEEgbWVzc2FnZSBpbiBhY2NvcmRhbmNlIHdpdGggU2VjdGlvbiA3LjMuMS4yICovCitzdGF0aWMgaW50IGdzbTQxMV9yeF9ycF9kYXRhKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLAorCQkJICAgICBzdHJ1Y3QgZ3NtNDExX3JwX2hkciAqcnBoKQoreworCXVfaW50OF90IHNyY19sZW4sIGRzdF9sZW4sIHJwdWRfbGVuOworCXVfaW50OF90ICpzcmMgPSBOVUxMLCAqZHN0ID0gTlVMTCAsICpycF91ZCA9IE5VTEw7CisKKwkvKiBpbiB0aGUgTU8gY2FzZSwgdGhpcyBzaG91bGQgYWx3YXlzIGJlIHplcm8gbGVuZ3RoICovCisJc3JjX2xlbiA9IHJwaC0+ZGF0YVswXTsKKwlpZiAoc3JjX2xlbikKKwkJc3JjID0gJnJwaC0+ZGF0YVsxXTsKKworCWRzdF9sZW4gPSBycGgtPmRhdGFbMStzcmNfbGVuXTsKKwlpZiAoZHN0X2xlbikKKwkJZHN0ID0gJnJwaC0+ZGF0YVsxK3NyY19sZW4rMV07CisKKwlycHVkX2xlbiA9IHJwaC0+ZGF0YVsxK3NyY19sZW4rMStkc3RfbGVuXTsKKwlpZiAocnB1ZF9sZW4pCisJCXJwX3VkID0gJnJwaC0+ZGF0YVsxK3NyY19sZW4rMStkc3RfbGVuKzFdOworCisJREVCVUdQKERTTVMsICJSWF9SUC1EQVRBOiBzcmNfbGVuPSV1LCBkc3RfbGVuPSV1IHVkX2xlbj0ldVxuIiwKKwkJc3JjX2xlbiwgZHN0X2xlbiwgcnB1ZF9sZW4pOworCXJldHVybiBnc200MTFfcnhfcnBfdWQobXNnLCB0cmFucywgcnBoLCBzcmNfbGVuLCBzcmMsIGRzdF9sZW4sIGRzdCwKKwkJCQlycHVkX2xlbiwgcnBfdWQpOworfQorCisvKiBSZWNlaXZlIGEgMDQuMTEgUlAtQUNLIG1lc3NhZ2UgKHJlc3BvbnNlIHRvIFJQLURBVEEgZnJvbSB1cykgKi8KK3N0YXRpYyBpbnQgZ3NtNDExX3J4X3JwX2FjayhzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywKKwkJCSAgICBzdHJ1Y3QgZ3NtNDExX3JwX2hkciAqcnBoKQoreworCXN0cnVjdCBnc21fc21zICpzbXMgPSB0cmFucy0+c21zLnNtczsKKworCS8qIEFjbmtvd2xlZGdlbWVudCB0byBNVCBSUF9EQVRBLCBpLmUuIHRoZSBNUyBjb25maXJtcyBpdAorCSAqIHN1Y2Nlc3NmdWxseSByZWNlaXZlZCBhIFNNUy4gIFdlIGNhbiBub3cgc2FmZWx5IG1hcmsgaXQgYXMKKwkgKiB0cmFuc21pdHRlZCAqLworCisJaWYgKCF0cmFucy0+c21zLmlzX210KSB7CisJCUxPR1AoRFNNUywgTE9HTF9FUlJPUiwgIlJYIFJQLUFDSyBvbiBhIE1PIHRyYW5zZmVyID9cbiIpOworCQlyZXR1cm4gZ3NtNDExX3NlbmRfcnBfZXJyb3IodHJhbnMsIHJwaC0+bXNnX3JlZiwKKwkJCQkJICAgIEdTTTQxMV9SUF9DQVVTRV9NU0dfSU5DT01QX1NUQVRFKTsKKwl9CisKKwlpZiAoIXNtcykgeworCQlMT0dQKERTTVMsIExPR0xfRVJST1IsICJSWCBSUC1BQ0sgYnV0IG5vIHNtcyBpbiB0cmFuc2FjdGlvbj8hP1xuIik7CisJCXJldHVybiBnc200MTFfc2VuZF9ycF9lcnJvcih0cmFucywgcnBoLT5tc2dfcmVmLAorCQkJCQkgICAgR1NNNDExX1JQX0NBVVNFX1BST1RPQ09MX0VSUik7CisJfQorCisJLyogbWFyayB0aGlzIFNNUyBhcyBzZW50IGluIGRhdGFiYXNlICovCisJZGJfc21zX21hcmtfc2VudChzbXMpOworCisJZGlzcGF0Y2hfc2lnbmFsKFNTX1NNUywgU19TTVNfREVMSVZFUkVELCBzbXMpOworCisJc21zX2ZyZWUoc21zKTsKKwl0cmFucy0+c21zLnNtcyA9IE5VTEw7CisKKwkvKiBjaGVjayBmb3IgbW9yZSBtZXNzYWdlcyBmb3IgdGhpcyBzdWJzY3JpYmVyICovCisJYXNzZXJ0KG1zZy0+bGNoYW4tPmNvbm4uc3Vic2NyID09IHRyYW5zLT5zdWJzY3IpOworCisJc21zID0gZGJfc21zX2dldF91bnNlbnRfZm9yX3N1YnNjcih0cmFucy0+c3Vic2NyKTsKKwlpZiAoc21zKQorCQlnc200MTFfc2VuZF9zbXNfbGNoYW4odHJhbnMtPmNvbm4sIHNtcyk7CisKKwkvKiBmcmVlIHRoZSB0cmFuc2FjdGlvbiBoZXJlICovCisJdHJhbnNfZnJlZSh0cmFucyk7CisKKwkvKiByZWxlYXNlIGNoYW5uZWwgaWYgZG9uZSAqLworI3dhcm5pbmcgIkJST0tFTi4gVGhlIFNBUEkgd2lsbCBiZSByZWxlYXNlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBCU0MiCisJaWYgKCFzbXMpCisJCXJzbF9yZWxlYXNlX3JlcXVlc3QobXNnLT5sY2hhbiwgdHJhbnMtPnNtcy5saW5rX2lkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdzbTQxMV9yeF9ycF9lcnJvcihzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywKKwkJCSAgICAgIHN0cnVjdCBnc200MTFfcnBfaGRyICpycGgpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSB0cmFucy0+Y29ubi0+YnRzLT5uZXR3b3JrOworCXN0cnVjdCBnc21fc21zICpzbXMgPSB0cmFucy0+c21zLnNtczsKKwl1X2ludDhfdCBjYXVzZV9sZW4gPSBycGgtPmRhdGFbMF07CisJdV9pbnQ4X3QgY2F1c2UgPSBycGgtPmRhdGFbMV07CisKKwkvKiBFcnJvciBpbiByZXNwb25zZSB0byBNVCBSUF9EQVRBLCBpLmUuIHRoZSBNUyBkaWQgbm90CisJICogc3VjY2Vzc2Z1bGx5IHJlY2VpdmUgdGhlIFNNUy4gIFdlIG5lZWQgdG8gaW52ZXN0aWdhdGUKKwkgKiB0aGUgY2F1c2UgYW5kIHRha2UgYWN0aW9uIGRlcGVuZGluZyBvbiBpdCAqLworCisJTE9HUChEU01TLCBMT0dMX05PVElDRSwgIiVzOiBSWCBTTVMgUlAtRVJST1IsIGNhdXNlICVkOiVkICglcylcbiIsCisJICAgICBzdWJzY3JfbmFtZSh0cmFucy0+Y29ubi0+c3Vic2NyKSwgY2F1c2VfbGVuLCBjYXVzZSwKKwkgICAgIGdldF92YWx1ZV9zdHJpbmcocnBfY2F1c2Vfc3RycywgY2F1c2UpKTsKKworCWlmICghdHJhbnMtPnNtcy5pc19tdCkgeworCQlMT0dQKERTTVMsIExPR0xfRVJST1IsICJSWCBSUC1FUlIgb24gYSBNTyB0cmFuc2ZlciA/XG4iKTsKKyNpZiAwCisJCXJldHVybiBnc200MTFfc2VuZF9ycF9lcnJvcih0cmFucywgcnBoLT5tc2dfcmVmLAorCQkJCQkgICAgR1NNNDExX1JQX0NBVVNFX01TR19JTkNPTVBfU1RBVEUpOworI2VuZGlmCisJfQorCisJaWYgKCFzbXMpIHsKKwkJTE9HUChEU01TLCBMT0dMX0VSUk9SLAorCQkJIlJYIFJQLUVSUiwgYnV0IG5vIHNtcyBpbiB0cmFuc2FjdGlvbj8hP1xuIik7CisJCXJldHVybiAtRUlOVkFMOworI2lmIDAKKwkJcmV0dXJuIGdzbTQxMV9zZW5kX3JwX2Vycm9yKHRyYW5zLCBycGgtPm1zZ19yZWYsCisJCQkJCSAgICBHU000MTFfUlBfQ0FVU0VfUFJPVE9DT0xfRVJSKTsKKyNlbmRpZgorCX0KKworCWlmIChjYXVzZSA9PSBHU000MTFfUlBfQ0FVU0VfTVRfTUVNX0VYQ0VFREVEKSB7CisJCS8qIE1TIGhhcyBub3QgZW5vdWdoIG1lbW9yeSB0byBzdG9yZSB0aGUgbWVzc2FnZS4gIFdlIG5lZWQKKwkJICogdG8gc3RvcmUgdGhpcyBpbiBvdXIgZGF0YWJhc2UgYW5kIHdhdGkgZm9yIGEgU01NQSBtZXNzYWdlICovCisJCS8qIEZJWE1FICovCisJCWRpc3BhdGNoX3NpZ25hbChTU19TTVMsIFNfU01TX01FTV9FWENFRURFRCwgdHJhbnMtPnN1YnNjcik7CisJCWNvdW50ZXJfaW5jKG5ldC0+c3RhdHMuc21zLnJwX2Vycl9tZW0pOworCX0gZWxzZQorCQljb3VudGVyX2luYyhuZXQtPnN0YXRzLnNtcy5ycF9lcnJfb3RoZXIpOworCisJc21zX2ZyZWUoc21zKTsKKwl0cmFucy0+c21zLnNtcyA9IE5VTEw7CisKKwkvL3RyYW5zX2ZyZWUodHJhbnMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDExX3J4X3JwX3NtbWEoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV90cmFucyAqdHJhbnMsCisJCQkgICAgIHN0cnVjdCBnc200MTFfcnBfaGRyICpycGgpCit7CisJc3RydWN0IGdzbV9zbXMgKnNtczsKKwlpbnQgcmM7CisKKwlyYyA9IGdzbTQxMV9zZW5kX3JwX2Fjayh0cmFucywgcnBoLT5tc2dfcmVmKTsKKwl0cmFucy0+c21zLnJwX3N0YXRlID0gR1NNNDExX1JQU19JRExFOworCisJLyogTVMgdGVsbHMgdXMgdGhhdCBpdCBoYXMgbWVtb3J5IGZvciBtb3JlIFNNUywgd2UgbmVlZAorCSAqIHRvIGNoZWNrIGlmIHdlIGhhdmUgYW55IHBlbmRpbmcgbWVzc2FnZXMgZm9yIGl0IGFuZCB0aGVuCisJICogdHJhbnNmZXIgdGhvc2UgKi8KKwlkaXNwYXRjaF9zaWduYWwoU1NfU01TLCBTX1NNU19TTU1BLCB0cmFucy0+c3Vic2NyKTsKKworCS8qIGNoZWNrIGZvciBtb3JlIG1lc3NhZ2VzIGZvciB0aGlzIHN1YnNjcmliZXIgKi8KKwlhc3NlcnQobXNnLT5sY2hhbi0+Y29ubi5zdWJzY3IgPT0gdHJhbnMtPnN1YnNjcik7CisJc21zID0gZGJfc21zX2dldF91bnNlbnRfZm9yX3N1YnNjcih0cmFucy0+c3Vic2NyKTsKKwlpZiAoc21zKQorCQlnc200MTFfc2VuZF9zbXNfbGNoYW4odHJhbnMtPmNvbm4sIHNtcyk7CisJZWxzZQorCQlyc2xfcmVsZWFzZV9yZXF1ZXN0KG1zZy0+bGNoYW4sIHRyYW5zLT5zbXMubGlua19pZCk7Cisjd2FybmluZyAiQlJPS0VOOiBUaGUgU0FQST0zIHdpbGwgYmUgcmVsZWFzZWQgYXV0b21hdGljYWxseSBieSB0aGUgQlNDIgorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGdzbTQxMV9yeF9jcF9kYXRhKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBnc200OF9oZHIgKmdoLAorCQkJICAgICBzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucykKK3sKKwlzdHJ1Y3QgZ3NtNDExX3JwX2hkciAqcnBfZGF0YSA9IChzdHJ1Y3QgZ3NtNDExX3JwX2hkciopJmdoLT5kYXRhOworCXVfaW50OF90IG1zZ190eXBlID0gIHJwX2RhdGEtPm1zZ190eXBlICYgMHgwNzsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChtc2dfdHlwZSkgeworCWNhc2UgR1NNNDExX01UX1JQX0RBVEFfTU86CisJCURFQlVHUChEU01TLCAiUlggU01TIFJQLURBVEEgKE1PKVxuIik7CisJCS8qIHN0YXJ0IFRSMk4gYW5kIGVudGVyICd3YWl0IHRvIHNlbmQgUlAtQUNLIHN0YXRlJyAqLworCQl0cmFucy0+c21zLnJwX3N0YXRlID0gR1NNNDExX1JQU19XQUlUX1RPX1RYX1JQX0FDSzsKKwkJcmMgPSBnc200MTFfcnhfcnBfZGF0YShtc2csIHRyYW5zLCBycF9kYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBHU000MTFfTVRfUlBfQUNLX01POgorCQlERUJVR1AoRFNNUywiUlggU01TIFJQLUFDSyAoTU8pXG4iKTsKKwkJcmMgPSBnc200MTFfcnhfcnBfYWNrKG1zZywgdHJhbnMsIHJwX2RhdGEpOworCQlicmVhazsKKwljYXNlIEdTTTQxMV9NVF9SUF9TTU1BX01POgorCQlERUJVR1AoRFNNUywgIlJYIFNNUyBSUC1TTU1BXG4iKTsKKwkJLyogc3RhcnQgVFIyTiBhbmQgZW50ZXIgJ3dhaXQgdG8gc2VuZCBSUC1BQ0sgc3RhdGUnICovCisJCXRyYW5zLT5zbXMucnBfc3RhdGUgPSBHU000MTFfUlBTX1dBSVRfVE9fVFhfUlBfQUNLOworCQlyYyA9IGdzbTQxMV9yeF9ycF9zbW1hKG1zZywgdHJhbnMsIHJwX2RhdGEpOworCQlicmVhazsKKwljYXNlIEdTTTQxMV9NVF9SUF9FUlJPUl9NTzoKKwkJcmMgPSBnc200MTFfcnhfcnBfZXJyb3IobXNnLCB0cmFucywgcnBfZGF0YSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFNNUywgTE9HTF9OT1RJQ0UsICJJbnZhbGlkIFJQIHR5cGUgMHglMDJ4XG4iLCBtc2dfdHlwZSk7CisJCXJjID0gZ3NtNDExX3NlbmRfcnBfZXJyb3IodHJhbnMsIHJwX2RhdGEtPm1zZ19yZWYsCisJCQkJCSAgR1NNNDExX1JQX0NBVVNFX01TR1RZUEVfTk9URVhJU1QpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIHNlbmQgQ1AtQUNLIHRvIGdpdmVuIHRyYW5zYWN0aW9uICovCitzdGF0aWMgaW50IGdzbTQxMV90eF9jcF9hY2soc3RydWN0IGdzbV90cmFucyAqdHJhbnMpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQxMV9tc2diX2FsbG9jKCk7CisJaW50IHJjOworCisJcmMgPSBnc200MTFfY3Bfc2VuZG1zZyhtc2csIHRyYW5zLCBHU000MTFfTVRfQ1BfQUNLKTsKKworCWlmICh0cmFucy0+c21zLmlzX210KSB7CisJCS8qIElmIHRoaXMgaXMgYSBNVCBTTVMgREVMSVZFUiwgd2UgY2FuIGNsZWFyIHRyYW5zYWN0aW9uIGhlcmUgKi8KKwkJdHJhbnMtPnNtcy5jcF9zdGF0ZSA9IEdTTTQxMV9DUFNfSURMRTsKKwkJLy90cmFuc19mcmVlKHRyYW5zKTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDExX3R4X2NwX2Vycm9yKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB1X2ludDhfdCBjYXVzZSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDExX21zZ2JfYWxsb2MoKTsKKwl1X2ludDhfdCAqY2F1c2VwOworCisJTE9HUChEU01TLCBMT0dMX05PVElDRSwgIlRYIENQLUVSUk9SLCBjYXVzZSAlZCAoJXMpXG4iLCBjYXVzZSwKKwkJZ2V0X3ZhbHVlX3N0cmluZyhjcF9jYXVzZV9zdHJzLCBjYXVzZSkpOworCisJY2F1c2VwID0gbXNnYl9wdXQobXNnLCAxKTsKKwkqY2F1c2VwID0gY2F1c2U7CisKKwlyZXR1cm4gZ3NtNDExX2NwX3NlbmRtc2cobXNnLCB0cmFucywgR1NNNDExX01UX0NQX0VSUk9SKTsKK30KKworLyogRW50cnkgcG9pbnQgZm9yIGluY29taW5nIEdTTTQ4X1BESVNDX1NNUyBmcm9tIGFiaXNfcnNsLmMgKi8KK2ludCBnc20wNDExX3Jjdl9zbXMoc3RydWN0IG1zZ2IgKm1zZywgdV9pbnQ4X3QgbGlua19pZCkKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1X2ludDhfdCBtc2dfdHlwZSA9IGdoLT5tc2dfdHlwZTsKKwl1X2ludDhfdCB0cmFuc2FjdGlvbl9pZCA9ICgoZ2gtPnByb3RvX2Rpc2NyID4+IDQpIF4gMHg4KTsgLyogZmxpcCAqLworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gbXNnLT5sY2hhbjsKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuczsKKwlpbnQgcmMgPSAwOworCisJaWYgKCFsY2hhbi0+Y29ubi5zdWJzY3IpCisJCXJldHVybiAtRUlPOworCQkvKiBGSVhNRTogc2VuZCBzb21lIGVycm9yIG1lc3NhZ2UgKi8KKworCURFQlVHUChEU01TLCAidHJhbnNfaWQ9JXggIiwgdHJhbnNhY3Rpb25faWQpOworCXRyYW5zID0gdHJhbnNfZmluZF9ieV9pZChsY2hhbi0+Y29ubi5zdWJzY3IsIEdTTTQ4X1BESVNDX1NNUywKKwkJCQkgdHJhbnNhY3Rpb25faWQpOworCWlmICghdHJhbnMpIHsKKwkJREVCVUdQQyhEU01TLCAiKG5ldykgIik7CisJCXRyYW5zID0gdHJhbnNfYWxsb2MobGNoYW4tPmNvbm4uc3Vic2NyLCBHU000OF9QRElTQ19TTVMsCisJCQkJICAgIHRyYW5zYWN0aW9uX2lkLCBuZXdfY2FsbHJlZisrKTsKKwkJaWYgKCF0cmFucykgeworCQkJREVCVUdQQyhEU01TLCAiTm8gbWVtb3J5IGZvciB0cmFuc1xuIik7CisJCQkvKiBGSVhNRTogc2VuZCBzb21lIGVycm9yIG1lc3NhZ2UgKi8KKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXRyYW5zLT5zbXMuY3Bfc3RhdGUgPSBHU000MTFfQ1BTX0lETEU7CisJCXRyYW5zLT5zbXMucnBfc3RhdGUgPSBHU000MTFfUlBTX0lETEU7CisJCXRyYW5zLT5zbXMuaXNfbXQgPSAwOworCQl0cmFucy0+c21zLmxpbmtfaWQgPSBsaW5rX2lkOworCisJCXRyYW5zLT5jb25uID0gJmxjaGFuLT5jb25uOworCQl1c2Vfc3Vic2NyX2Nvbih0cmFucy0+Y29ubik7CisJfQorCisJc3dpdGNoKG1zZ190eXBlKSB7CisJY2FzZSBHU000MTFfTVRfQ1BfREFUQToKKwkJREVCVUdQQyhEU01TLCAiUlggU01TIENQLURBVEFcbiIpOworCisJCS8qIDUuNDogRm9yIE1PLCBpZiBhIENQLURBVEEgaXMgcmVjZWl2ZWQgZm9yIGEgbmV3CisJCSAqIHRyYW5zYWN0aW9uLCBlcXVhbHMgcmVjZXB0aW9uIG9mIGFuIGltcGxpY2l0CisJCSAqIGxhc3QgQ1AtQUNLIGZvciBwcmV2aW91cyB0cmFuc2FjdGlvbiAqLworCQlpZiAodHJhbnMtPnNtcy5jcF9zdGF0ZSA9PSBHU000MTFfQ1BTX0lETEUpIHsKKwkJCWludCBpOworCQkJc3RydWN0IGdzbV90cmFucyAqcHRyYW5zOworCisJCQkvKiBTY2FuIHRocm91Z2ggYWxsIHJlbW90ZSBpbml0aWF0ZWQgdHJhbnNhY3Rpb25zICovCisJCQlmb3IgKGk9ODsgaTwxNTsgaSsrKSB7CisJCQkJaWYgKGkgPT0gdHJhbnNhY3Rpb25faWQpCisJCQkJCWNvbnRpbnVlOworCisJCQkJcHRyYW5zID0gdHJhbnNfZmluZF9ieV9pZChsY2hhbi0+Y29ubi5zdWJzY3IsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICBHU000OF9QRElTQ19TTVMsIGkpOworCQkJCWlmICghcHRyYW5zKQorCQkJCQljb250aW51ZTsKKworCQkJCURFQlVHUChEU01TLCAiSW1wbGljaXQgQ1AtQUNLIGZvciB0cmFuc19pZD0leFxuIiwgaSk7CisKKwkJCQkvKiBGaW5pc2ggaXQgZm9yIGdvb2QgKi8KKwkJCQlic2NfZGVsX3RpbWVyKCZwdHJhbnMtPnNtcy5jcF90aW1lcik7CisJCQkJcHRyYW5zLT5zbXMuY3Bfc3RhdGUgPSBHU000MTFfQ1BTX0lETEU7CisJCQkJdHJhbnNfZnJlZShwdHJhbnMpOworCQkJfQorCQl9CisKKwkJLyogNS4yLjMuMS4zOiBNTyBzdGF0ZSBleGlzdHMgd2hlbiBTTUMgaGFzIHJlY2VpdmVkCisJCSAqIENQLURBVEEsIGluY2x1ZGluZyBzZW5kaW5nIG9mIHRoZSBhc3NvYy4gQ1AtQUNLICovCisJCS8qIDUuMi4zLjIuNDogTVQgc3RhdGUgZXhpc3RzIHdoZW4gU01DIGhhcyByZWNlaXZlZAorCQkgKiBDUC1EQVRBLCBpbmNsdWRpbmcgc2VuZGluZyBvZiB0aGUgYXNzb2MuIENQLUFDSyAqLworCQl0cmFucy0+c21zLmNwX3N0YXRlID0gR1NNNDExX0NQU19NTV9FU1RBQkxJU0hFRDsKKworCQkvKiBTTUMgaW5zdGFuY2UgYWNrbm93bGVkZ2VzIHRoZSBDUC1EQVRBIGZyYW1lICovCisJCWdzbTQxMV90eF9jcF9hY2sodHJhbnMpOworCQkKKwkJcmMgPSBnc200MTFfcnhfY3BfZGF0YShtc2csIGdoLCB0cmFucyk7CisjaWYgMAorCQkvKiBTZW5kIENQLUFDSyBvciBDUC1FUk9SUiBpbiByZXNwb25zZSAqLworCQlpZiAocmMgPCAwKSB7CisJCQlyYyA9IGdzbTQxMV90eF9jcF9lcnJvcih0cmFucywgR1NNNDExX0NQX0NBVVNFX05FVF9GQUlMKTsKKwkJfSBlbHNlCisJCQlyYyA9IGdzbTQxMV90eF9jcF9hY2sodHJhbnMpOworI2VuZGlmCisJCWJyZWFrOworCWNhc2UgR1NNNDExX01UX0NQX0FDSzoKKwkJLyogcHJldmlvdXMgQ1AtREFUQSBpbiB0aGlzIHRyYW5zYWN0aW9uIHdhcyBjb25maXJtZWQgKi8KKwkJREVCVUdQQyhEU01TLCAiUlggU01TIENQLUFDS1xuIik7CisJCS8qIDUuMi4zLjEuMzogTU8gc3RhdGUgZXhpc3RzIHdoZW4gU01DIGhhcyByZWNlaXZlZCBDUC1BQ0sgKi8KKwkJLyogNS4yLjMuMi40OiBNVCBzdGF0ZSBleGlzdHMgd2hlbiBTTUMgaGFzIHJlY2VpdmVkIENQLUFDSyAqLworCQl0cmFucy0+c21zLmNwX3N0YXRlID0gR1NNNDExX0NQU19NTV9FU1RBQkxJU0hFRDsKKwkJLyogU3RvcCBUQzEqIGFmdGVyIENQLUFDSyBoYXMgYmVlbiByZWNlaXZlZCAqLworCQlic2NfZGVsX3RpbWVyKCZ0cmFucy0+c21zLmNwX3RpbWVyKTsKKworCQlpZiAoIXRyYW5zLT5zbXMuaXNfbXQpIHsKKwkJCS8qIEZJWE1FOiB3ZSBoYXZlIHNvbnQgb25lIENQLURBVEEsIHdoaWNoIHdhcyBub3cKKwkJCSAqIGFja25vd2xlZGdlZC4gIENoZWNrIGlmIHdlIHdhbnQgdG8gdHJhbnNmZXIgbW9yZSwKKwkJCSAqIGkuZS4gbXVsdGktcGFydCBtZXNzYWdlICovCisJCQl0cmFucy0+c21zLmNwX3N0YXRlID0gR1NNNDExX0NQU19JRExFOworCQkJdHJhbnNfZnJlZSh0cmFucyk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBHU000MTFfTVRfQ1BfRVJST1I6CisJCURFQlVHUEMoRFNNUywgIlJYIFNNUyBDUC1FUlJPUiwgY2F1c2UgJWQgKCVzKVxuIiwgZ2gtPmRhdGFbMF0sCisJCQlnZXRfdmFsdWVfc3RyaW5nKGNwX2NhdXNlX3N0cnMsIGdoLT5kYXRhWzBdKSk7CisJCWJzY19kZWxfdGltZXIoJnRyYW5zLT5zbXMuY3BfdGltZXIpOworCQl0cmFucy0+c21zLmNwX3N0YXRlID0gR1NNNDExX0NQU19JRExFOworCQl0cmFuc19mcmVlKHRyYW5zKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREVCVUdQQyhEU01TLCAiUlggVW5pbXBsZW1lbnRlZCBDUCBtc2dfdHlwZTogMHglMDJ4XG4iLCBtc2dfdHlwZSk7CisJCXJjID0gZ3NtNDExX3R4X2NwX2Vycm9yKHRyYW5zLCBHU000MTFfQ1BfQ0FVU0VfTVNHVFlQRV9OT1RFWElTVCk7CisJCXRyYW5zLT5zbXMuY3Bfc3RhdGUgPSBHU000MTFfQ1BTX0lETEU7CisJCXRyYW5zX2ZyZWUodHJhbnMpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKyNpZiAwCisvKiBUZXN0IFRQRFUgLSBBTEwgWU9VUiAqLworc3RhdGljIHVfaW50OF90IHRwZHVfdGVzdFtdID0geworCTB4MDQsIDB4MDQsIDB4ODEsIDB4MzIsIDB4MjQsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MjEsIDB4MDMsIDB4NDEsIDB4MjQsCisJMHgzMiwgMHg0MCwgMHgxRiwgMHg0MSwgMHgyNiwgMHgxMywgMHg5NCwgMHg3RCwgMHg1NiwgMHhBNSwgMHgyMCwgMHgyOCwKKwkweEYyLCAweEU5LCAweDJDLCAweDgyLCAweDgyLCAweEQyLCAweDIyLCAweDQ4LCAweDU4LCAweDY0LCAweDNFLCAweDlELAorCTB4NDcsIDB4MTAsIDB4RjUsIDB4MDksIDB4QUEsIDB4NEUsIDB4MDEKK307CisjZW5kaWYKKworLyogVGFrZSBhIFNNUyBpbiBnc21fc21zIHN0cnVjdHVyZSBhbmQgc2VuZCBpdCB0aHJvdWdoIGFuIGFscmVhZHkKKyAqIGV4aXN0aW5nIGxjaGFuLiBXZSBhbHNvIGFzc3VtZSB0aGF0IHRoZSBjYWxsZXIgZW5zdXJlZCB0aGlzIGxjaGFuIGFscmVhZHkKKyAqIGhhcyBhIFNBUEkzIFJMTCBjb25uZWN0aW9uISAqLworaW50IGdzbTQxMV9zZW5kX3Ntc19sY2hhbihzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubiwgc3RydWN0IGdzbV9zbXMgKnNtcykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDExX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuczsKKwl1X2ludDhfdCAqZGF0YSwgKnJwX3VkX2xlbjsKKwl1X2ludDhfdCBtc2dfcmVmID0gNDI7CisJaW50IHRyYW5zYWN0aW9uX2lkOworCWludCByYzsKKworCXRyYW5zYWN0aW9uX2lkID0gdHJhbnNfYXNzaWduX3RyYW5zX2lkKGNvbm4tPnN1YnNjciwgR1NNNDhfUERJU0NfU01TLCAwKTsKKwlpZiAodHJhbnNhY3Rpb25faWQgPT0gLTEpIHsKKwkJTE9HUChEU01TLCBMT0dMX0VSUk9SLCAiTm8gYXZhaWxhYmxlIHRyYW5zYWN0aW9uIGlkc1xuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJREVCVUdQKERTTVMsICJzZW5kX3Ntc19sY2hhbigpXG4iKTsKKworCS8qIEZJWE1FOiBhbGxvY2F0ZSB0cmFuc2FjdGlvbiB3aXRoIG1lc3NhZ2UgcmVmZXJlbmNlICovCisJdHJhbnMgPSB0cmFuc19hbGxvYyhjb25uLT5zdWJzY3IsIEdTTTQ4X1BESVNDX1NNUywKKwkJCSAgICB0cmFuc2FjdGlvbl9pZCwgbmV3X2NhbGxyZWYrKyk7CisJaWYgKCF0cmFucykgeworCQlMT0dQKERTTVMsIExPR0xfRVJST1IsICJObyBtZW1vcnkgZm9yIHRyYW5zXG4iKTsKKwkJLyogRklYTUU6IHNlbmQgc29tZSBlcnJvciBtZXNzYWdlICovCisJCXJldHVybiAtRU5PTUVNOworCX0KKwl0cmFucy0+c21zLmNwX3N0YXRlID0gR1NNNDExX0NQU19JRExFOworCXRyYW5zLT5zbXMucnBfc3RhdGUgPSBHU000MTFfUlBTX0lETEU7CisJdHJhbnMtPnNtcy5pc19tdCA9IDE7CisJdHJhbnMtPnNtcy5zbXMgPSBzbXM7CisJdHJhbnMtPnNtcy5saW5rX2lkID0gVU1fU0FQSV9TTVM7CS8qIEZJWE1FOiBtYWluIG9yIFNBQ0NIID8gKi8KKworCXRyYW5zLT5jb25uID0gY29ubjsKKwl1c2Vfc3Vic2NyX2Nvbih0cmFucy0+Y29ubik7CisKKwkvKiBIYXJkY29kZSBTTVNDIE9yaWdpbmF0aW5nIEFkZHJlc3MgZm9yIG5vdyAqLworCWRhdGEgPSAodV9pbnQ4X3QgKiltc2diX3B1dChtc2csIDgpOworCWRhdGFbMF0gPSAweDA3OwkvKiBvcmlnaW5hdG9yIGxlbmd0aCA9PSA3ICovCisJZGF0YVsxXSA9IDB4OTE7IC8qIHR5cGUgb2YgbnVtYmVyOiBpbnRlcm5hdGlvbmFsLCBJU0ROICovCisJZGF0YVsyXSA9IDB4NDQ7IC8qIDQ0Nzc4NTAxNjAwNSAqLworCWRhdGFbM10gPSAweDc3OworCWRhdGFbNF0gPSAweDU4OworCWRhdGFbNV0gPSAweDEwOworCWRhdGFbNl0gPSAweDA2OworCWRhdGFbN10gPSAweDUwOworCisJLyogSGFyZGNvZGVkIERlc3RpbmF0aW9uIEFkZHJlc3MgKi8KKwlkYXRhID0gKHVfaW50OF90ICopbXNnYl9wdXQobXNnLCAxKTsKKwlkYXRhWzBdID0gMDsJLyogZGVzdGluYXRpb24gbGVuZ3RoID09IDAgKi8KKworCS8qIG9idGFpbiBhIHBvaW50ZXIgZm9yIHRoZSBycF91ZF9sZW4sIHNvIHdlIGNhbiBmaWxsIGl0IGxhdGVyICovCisJcnBfdWRfbGVuID0gKHVfaW50OF90ICopbXNnYl9wdXQobXNnLCAxKTsKKworI2lmIDEKKwkvKiBnZW5lcmF0ZSB0aGUgMDMuNDAgVFBEVSAqLworCXJjID0gZ3NtMzQwX2dlbl90cGR1KG1zZywgc21zKTsKKwlpZiAocmMgPCAwKSB7CisJCW1zZ2JfZnJlZShtc2cpOworCQlyZXR1cm4gcmM7CisJfQorCisJKnJwX3VkX2xlbiA9IHJjOworI2Vsc2UKKwlkYXRhID0gbXNnYl9wdXQobXNnLCBzaXplb2YodHBkdV90ZXN0KSk7CisJbWVtY3B5KGRhdGEsIHRwZHVfdGVzdCwgc2l6ZW9mKHRwZHVfdGVzdCkpOworCSpycF91ZF9sZW4gPSBzaXplb2YodHBkdV90ZXN0KTsKKyNlbmRpZgorCisJREVCVUdQKERTTVMsICJUWDogU01TIERFTElWRVJcbiIpOworCisJY291bnRlcl9pbmMoY29ubi0+YnRzLT5uZXR3b3JrLT5zdGF0cy5zbXMuZGVsaXZlcmVkKTsKKworCXJldHVybiBnc200MTFfcnBfc2VuZG1zZyhtc2csIHRyYW5zLCBHU000MTFfTVRfUlBfREFUQV9NVCwgbXNnX3JlZik7CisJLyogRklYTUU6IGVudGVyICd3YWl0IGZvciBSUC1BQ0snIHN0YXRlLCBzdGFydCBUUjFOICovCit9CisKKy8qIFJMTCBTQVBJMyBlc3RhYmxpc2ggY2FsbGJhY2suIE5vdyB3ZSBoYXZlIGEgUkxMIGNvbm5lY3Rpb24gYW5kCisgKiBjYW4gZGVsaXZlciB0aGUgYWN0dWFsIG1lc3NhZ2UgKi8KK3N0YXRpYyB2b2lkIHJsbF9pbmRfY2Ioc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGxpbmtfaWQsCisJCQl2b2lkICpfc21zLCBlbnVtIGJzY19ybGxyX2luZCB0eXBlKQoreworCXN0cnVjdCBnc21fc21zICpzbXMgPSBfc21zOworCisJREVCVUdQKERTTVMsICJybGxfaW5kX2NiKGxjaGFuPSVwLCBsaW5rX2lkPSV1LCBzbXM9JXAsIHR5cGU9JXVcbiIsCisJCWxjaGFuLCBsaW5rX2lkLCBzbXMsIHR5cGUpOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBCU0NfUkxMUl9JTkRfRVNUX0NPTkY6Cisjd2FybmluZyAiQlJPS0VOOiBUaGUgQlNDIHdpbGwgZXN0YWJsaXNoIHRoaXMgdHJhbnNwYXJlbnRseSIKKwkJZ3NtNDExX3NlbmRfc21zX2xjaGFuKCZsY2hhbi0+Y29ubiwgc21zKTsKKwkJYnJlYWs7CisJY2FzZSBCU0NfUkxMUl9JTkRfUkVMX0lORDoKKwljYXNlIEJTQ19STExSX0lORF9FUlJfSU5EOgorCWNhc2UgQlNDX1JMTFJfSU5EX1RJTUVPVVQ6Cisjd2FybmluZyAiQlJPS0VOOiBXZSB3aWxsIG5lZWQgdG8gaGFuZGxlIFNBUEkgbiBSZWplY3QiCisJCXNtc19mcmVlKHNtcyk7CisJCWJyZWFrOworCX0KK30KKworLyogcGFnaW5nIGNhbGxiYWNrLiBIZXJlIHdlIGdldCBjYWxsZWQgaWYgcGFnaW5nIGEgc3Vic2NyaWJlciBoYXMKKyAqIHN1Y2NlZWRlZCBvciBmYWlsZWQuICovCitzdGF0aWMgaW50IHBhZ2luZ19jYl9zZW5kX3Ntcyh1bnNpZ25lZCBpbnQgaG9va251bSwgdW5zaWduZWQgaW50IGV2ZW50LAorCQkJICAgICAgc3RydWN0IG1zZ2IgKm1zZywgdm9pZCAqX2xjaGFuLCB2b2lkICpfc21zKQoreworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gX2xjaGFuOworCXN0cnVjdCBnc21fc21zICpzbXMgPSBfc21zOworCWludCByYzsKKworCURFQlVHUChEU01TLCAicGFnaW5nX2NiX3NlbmRfc21zKGhvb2tudW09JXUsIGV2ZW50PSV1LCBtc2c9JXAsIgorCQkibGNoYW49JXAsIHNtcz0lcClcbiIsIGhvb2tudW0sIGV2ZW50LCBtc2csIGxjaGFuLCBzbXMpOworCisJaWYgKGhvb2tudW0gIT0gR1NNX0hPT0tfUlJfUEFHSU5HKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEdTTV9QQUdJTkdfU1VDQ0VFREVEOgorCQkvKiBQYWdpbmcgYWJvcnRlZCB3aXRob3V0IGxjaGFuID8hPyAqLworCQlpZiAoIWxjaGFuKSB7CisJCQlzbXNfZnJlZShzbXMpOworCQkJcmMgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKwkJLyogRXN0YWJsaXNoIGEgU0FQSTMgUkxMIGNvbm5lY3Rpb24gZm9yIFNNUyAqLworCQlyYyA9IHJsbF9lc3RhYmxpc2gobGNoYW4sIFVNX1NBUElfU01TLCBybGxfaW5kX2NiLCBzbXMpOworCQlicmVhazsKKwljYXNlIEdTTV9QQUdJTkdfRVhQSVJFRDoKKwkJc21zX2ZyZWUoc21zKTsKKwkJcmMgPSAtRVRJTUVET1VUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyYyA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworLyogaGlnaC1sZXZlbCBmdW5jdGlvbiB0byBzZW5kIGEgU01TIHRvIGEgZ2l2ZW4gc3Vic2NyaWJlci4gVGhlIGZ1bmN0aW9uCisgKiB3aWxsIHRha2UgY2FyZSBvZiBwYWdpbmcgdGhlIHN1YnNjcmliZXIsIGVzdGFibGlzaGluZyB0aGUgUkxMIFNBUEkzCisgKiBjb25uZWN0aW9uLCBldGMuICovCitpbnQgZ3NtNDExX3NlbmRfc21zX3N1YnNjcihzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwKKwkJCSAgIHN0cnVjdCBnc21fc21zICpzbXMpCit7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisJaW50IHJjOworCisJLyogY2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIGFuIG9wZW4gbGNoYW4gdG8gdGhlIHN1YnNjcmliZXIuCisJICogaWYgeWVzLCBzZW5kIHRoZSBTTVMgdGhpcyB3YXkgKi8KKwlsY2hhbiA9IGxjaGFuX2Zvcl9zdWJzY3Ioc3Vic2NyKTsKKwlpZiAobGNoYW4pCisJCXJldHVybiBybGxfZXN0YWJsaXNoKGxjaGFuLCBVTV9TQVBJX1NNUywKKwkJCQkgICAgIHJsbF9pbmRfY2IsIHNtcyk7CisKKwkvKiBpZiBub3QsIHdlIGhhdmUgdG8gc3RhcnQgcGFnaW5nICovCisJcmMgPSBwYWdpbmdfcmVxdWVzdChzdWJzY3ItPm5ldCwgc3Vic2NyLCBSU0xfQ0hBTk5FRURfU0RDQ0gsCisJCQkgICAgcGFnaW5nX2NiX3NlbmRfc21zLCBzbXMpOworCWlmIChyYyA8PSAwKQorCQlzbXNfZnJlZShzbXMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3Vic2NyX3NpZ19jYih1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgc2lnbmFsLAorCQkJIHZvaWQgKmhhbmRsZXJfZGF0YSwgdm9pZCAqc2lnbmFsX2RhdGEpCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisJc3RydWN0IGdzbV9zbXMgKnNtczsKKworCXN3aXRjaCAoc2lnbmFsKSB7CisJY2FzZSBTX1NVQlNDUl9BVFRBQ0hFRDoKKwkJLyogQSBzdWJzY3JpYmVyIGhhcyBhdHRhY2hlZC4gQ2hlY2sgaWYgdGhlcmUgYXJlCisJCSAqIGFueSBwZW5kaW5nIFNNUyBmb3IgaGltIHRvIGJlIGRlbGl2ZXJlZCAqLworCQlzdWJzY3IgPSBzaWduYWxfZGF0YTsKKwkJbGNoYW4gPSBsY2hhbl9mb3Jfc3Vic2NyKHN1YnNjcik7CisJCWlmICghbGNoYW4pCisJCQlicmVhazsKKwkJc21zID0gZGJfc21zX2dldF91bnNlbnRfZm9yX3N1YnNjcihzdWJzY3IpOworCQlpZiAoIXNtcykKKwkJCWJyZWFrOworCQkvKiBFc3RhYmxpc2ggYSBTQVBJMyBSTEwgY29ubmVjdGlvbiBmb3IgU01TICovCisJCXJsbF9lc3RhYmxpc2gobGNoYW4sIFVNX1NBUElfU01TLCBybGxfaW5kX2NiLCBzbXMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX2dzbTQxMV9zbXNfdHJhbnNfZnJlZShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucykKK3sKKwlic2NfZGVsX3RpbWVyKCZ0cmFucy0+c21zLmNwX3RpbWVyKTsKK30KKworc3RhdGljIF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSkgdm9pZCBvbl9kc29fbG9hZF9zbXModm9pZCkKK3sKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19TVUJTQ1IsIHN1YnNjcl9zaWdfY2IsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3NtXzA0XzgwLmMgYi9vcGVuYnNjL3NyYy9nc21fMDRfODAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjEwYjE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3NtXzA0XzgwLmMKQEAgLTAsMCArMSwzMjggQEAKKy8qIEdTTSBNb2JpbGUgUmFkaW8gSW50ZXJmYWNlIExheWVyIDMgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZQorICogM0dQUCBUUyAwNC4wOCB2ZXJzaW9uIDcuMjEuMCBSZWxlYXNlIDE5OTggLyBFVFNJIFRTIDEwMCA5NDAgVjcuMjEuMCAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOCwgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiAoQykgMjAwOSBieSBNaWtlIEhhYmVuIDxtaWNoYWVsLmhhYmVuQGJ0aW50ZXJuZXQuY29tPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc21fdXRpbHMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzgwLmg+CisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitzdGF0aWMgaW50IHBhcnNlX3Vzc2QodV9pbnQ4X3QgKnVzc2QsIHN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcSk7CitzdGF0aWMgaW50IHBhcnNlX3Vzc2RfaW5mb19lbGVtZW50cyh1X2ludDhfdCAqdXNzZF9pZSwKKwkJCQkJc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKTsKK3N0YXRpYyBpbnQgcGFyc2VfZmFjaWxpdHlfaWUodV9pbnQ4X3QgKmZhY2lsaXR5X2llLCB1X2ludDhfdCBsZW5ndGgsCisJCQkJCXN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcSk7CitzdGF0aWMgaW50IHBhcnNlX3NzX2ludm9rZSh1X2ludDhfdCAqaW52b2tlX2RhdGEsIHVfaW50OF90IGxlbmd0aCwKKwkJCQkJc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKTsKK3N0YXRpYyBpbnQgcGFyc2VfcHJvY2Vzc191c3NfcmVxKHVfaW50OF90ICp1c3NfcmVxX2RhdGEsIHVfaW50OF90IGxlbmd0aCwKKwkJCQkJc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyICptc2diX3dyYXBfd2l0aF9UTChzdHJ1Y3QgbXNnYiAqbXNnYiwgdV9pbnQ4X3QgdGFnKQoreworCW1zZ2ItPmRhdGEgLT0gMjsKKwltc2diLT5kYXRhWzBdID0gdGFnOworCW1zZ2ItPmRhdGFbMV0gPSBtc2diLT5sZW47CisJbXNnYi0+bGVuICs9IDI7CisJcmV0dXJuIG1zZ2ItPmRhdGE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciAqbXNnYl9wdXNoX1RMVjEoc3RydWN0IG1zZ2IgKm1zZ2IsIHVfaW50OF90IHRhZywKKwkJCQkJICAgIHVfaW50OF90IHZhbHVlKQoreworCW1zZ2ItPmRhdGEgLT0gMzsKKwltc2diLT5sZW4gKz0gMzsKKwltc2diLT5kYXRhWzBdID0gdGFnOworCW1zZ2ItPmRhdGFbMV0gPSAxOworCW1zZ2ItPmRhdGFbMl0gPSB2YWx1ZTsKKwlyZXR1cm4gbXNnYi0+ZGF0YTsKK30KKworCisvKiBEZWNvZGUgYSBtb2JpbGUtb3JpZ2luYXRlZCBVU1NELXJlcXVlc3QgbWVzc2FnZSAqLworaW50IGdzbTA0ODBfZGVjb2RlX3Vzc2RfcmVxdWVzdChjb25zdCBzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgdXNzZF9yZXF1ZXN0ICpyZXEpCit7CisJaW50IHJjID0gMDsKKwl1X2ludDhfdCAqcGFyc2VfcHRyID0gbXNnYl9sMyhtc2cpOworCisJaWYgKCgqcGFyc2VfcHRyICYgMHgwRikgPT0gR1NNNDhfUERJU0NfTkNfU1MpIHsKKwkJcmVxLT50cmFuc2FjdGlvbl9pZCA9ICpwYXJzZV9wdHIgJiAweDcwOworCQlyYyA9IHBhcnNlX3Vzc2QocGFyc2VfcHRyKzEsIHJlcSk7CisJfQorCisJaWYgKCFyYykKKwkJREVCVUdQKERNTSwgIkVycm9yIG9jY3VycmVkIHdoaWxlIHBhcnNpbmcgcmVjZWl2ZWQgVVNTRCFcbiIpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHBhcnNlX3Vzc2QodV9pbnQ4X3QgKnVzc2QsIHN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcSkKK3sKKwlpbnQgcmMgPSAxOworCXVfaW50OF90IG1zZ190eXBlID0gdXNzZFswXSAmIDB4QkY7ICAvKiBtZXNzYWdlLXR5cGUgLSBzZWN0aW9uIDMuNCAqLworCisJc3dpdGNoIChtc2dfdHlwZSkgeworCWNhc2UgR1NNMDQ4MF9NVFlQRV9SRUxFQVNFX0NPTVBMRVRFOgorCQlERUJVR1AoRE1NLCAiVVNTIFJlbGVhc2UgQ29tcGxldGVcbiIpOworCQkvKiBjb3VsZCBhbHNvIHBhcnNlIG91dCB0aGUgb3B0aW9uYWwgQ2F1c2UvRmFjaWxpdHkgZGF0YSAqLworCQlyZXEtPnRleHRbMF0gPSAweEZGOworCQlicmVhazsKKwljYXNlIEdTTTA0ODBfTVRZUEVfUkVHSVNURVI6CisJY2FzZSBHU00wNDgwX01UWVBFX0ZBQ0lMSVRZOgorCQlyYyAmPSBwYXJzZV91c3NkX2luZm9fZWxlbWVudHModXNzZCsxLCByZXEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gR1NNIDA0LjgwIG1lc3NhZ2UtdHlwZSBmaWVsZCAweCUwMnhcbiIsCisJCQl1c3NkWzBdKTsKKwkJcmMgPSAwOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfdXNzZF9pbmZvX2VsZW1lbnRzKHVfaW50OF90ICp1c3NkX2llLCBzdHJ1Y3QgdXNzZF9yZXF1ZXN0ICpyZXEpCit7CisJaW50IHJjOworCS8qIEluZm9ybWF0aW9uIEVsZW1lbnQgSWRlbnRpZmllciAtIHRhYmxlIDMuMiAmIEdTTSAwNC4wOCBzZWN0aW9uIDEwLjUgKi8KKwl1X2ludDhfdCBpZWkgPSB1c3NkX2llWzBdOworCXVfaW50OF90IGllaV9sZW5ndGggPSB1c3NkX2llWzFdOworCisJc3dpdGNoIChpZWkpIHsKKwljYXNlIEdTTTQ4X0lFX0NBVVNFOgorCQlicmVhazsKKwljYXNlIEdTTTA0ODBfSUVfRkFDSUxJVFk6CisJCXJjID0gcGFyc2VfZmFjaWxpdHlfaWUodXNzZF9pZSsyLCBpZWlfbGVuZ3RoLCByZXEpOworCQlicmVhazsKKwljYXNlIEdTTTA0ODBfSUVfU1NfVkVSU0lPTjoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZnByaW50ZihzdGRlcnIsICJVbmhhbmRsZWQgR1NNIDA0LjA4IG9yIDA0LjgwIElFSSAweCUwMnhcbiIsCisJCQlpZWkpOworCQlyYyA9IDA7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBwYXJzZV9mYWNpbGl0eV9pZSh1X2ludDhfdCAqZmFjaWxpdHlfaWUsIHVfaW50OF90IGxlbmd0aCwKKwkJCQkJCXN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcSkKK3sKKwlpbnQgcmMgPSAxOworCXVfaW50OF90IG9mZnNldCA9IDA7CisKKwlkbyB7CisJCS8qIENvbXBvbmVudCBUeXBlIHRhZyAtIHRhYmxlIDMuNyAqLworCQl1X2ludDhfdCBjb21wb25lbnRfdHlwZSA9IGZhY2lsaXR5X2llW29mZnNldF07CisJCXVfaW50OF90IGNvbXBvbmVudF9sZW5ndGggPSBmYWNpbGl0eV9pZVtvZmZzZXQrMV07CisKKwkJc3dpdGNoIChjb21wb25lbnRfdHlwZSkgeworCQljYXNlIEdTTTA0ODBfQ1RZUEVfSU5WT0tFOgorCQkJcmMgJj0gcGFyc2Vfc3NfaW52b2tlKGZhY2lsaXR5X2llKzIsCisJCQkJCQljb21wb25lbnRfbGVuZ3RoLAorCQkJCQkJcmVxKTsKKwkJCWJyZWFrOworCQljYXNlIEdTTTA0ODBfQ1RZUEVfUkVUVVJOX1JFU1VMVDoKKwkJCWJyZWFrOworCQljYXNlIEdTTTA0ODBfQ1RZUEVfUkVUVVJOX0VSUk9SOgorCQkJYnJlYWs7CisJCWNhc2UgR1NNMDQ4MF9DVFlQRV9SRUpFQ1Q6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWZwcmludGYoc3RkZXJyLCAiVW5rbm93biBHU00gMDQuODAgRmFjaWxpdHkgIgorCQkJCSJDb21wb25lbnQgVHlwZSAweCUwMnhcbiIsIGNvbXBvbmVudF90eXBlKTsKKwkJCXJjID0gMDsKKwkJCWJyZWFrOworCQl9CisJCW9mZnNldCArPSAoY29tcG9uZW50X2xlbmd0aCsyKTsKKwl9IHdoaWxlIChvZmZzZXQgPCBsZW5ndGgpOworCisJcmV0dXJuIHJjOworfQorCisvKiBQYXJzZSBhbiBJbnZva2UgY29tcG9uZW50IC0gc2VlIHRhYmxlIDMuMyAqLworc3RhdGljIGludCBwYXJzZV9zc19pbnZva2UodV9pbnQ4X3QgKmludm9rZV9kYXRhLCB1X2ludDhfdCBsZW5ndGgsCisJCQkJCQlzdHJ1Y3QgdXNzZF9yZXF1ZXN0ICpyZXEpCit7CisJaW50IHJjID0gMTsKKwl1X2ludDhfdCBvZmZzZXQ7CisKKwkvKiBtYW5kYXRvcnkgcGFydCAqLworCWlmIChpbnZva2VfZGF0YVswXSAhPSBHU00wNDgwX0NPTVBJRFRBR19JTlZPS0VfSUQpIHsKKwkJZnByaW50ZihzdGRlcnIsICJVbmV4cGVjdGVkIEdTTSAwNC44MCBDb21wb25lbnQtSUQgdGFnICIKKwkJCSIweCUwMnggKGV4cGVjdGluZyBJbnZva2UgSUQgdGFnKVxuIiwgaW52b2tlX2RhdGFbMF0pOworCX0KKworCW9mZnNldCA9IGludm9rZV9kYXRhWzFdICsgMjsKKwlyZXEtPmludm9rZV9pZCA9IGludm9rZV9kYXRhWzJdOworCisJLyogb3B0aW9uYWwgcGFydCAqLworCWlmIChpbnZva2VfZGF0YVtvZmZzZXRdID09IEdTTTA0ODBfQ09NUElEVEFHX0xJTktFRF9JRCkKKwkJb2Zmc2V0ICs9IGludm9rZV9kYXRhW29mZnNldCsxXSArIDI7ICAvKiBza2lwIG92ZXIgaXQgKi8KKworCS8qIG1hbmRhdG9yeSBwYXJ0ICovCisJaWYgKGludm9rZV9kYXRhW29mZnNldF0gPT0gR1NNMDQ4MF9PUEVSQVRJT05fQ09ERSkgeworCQl1X2ludDhfdCBvcGVyYXRpb25fY29kZSA9IGludm9rZV9kYXRhW29mZnNldCsyXTsKKwkJc3dpdGNoIChvcGVyYXRpb25fY29kZSkgeworCQljYXNlIEdTTTA0ODBfT1BfQ09ERV9QUk9DRVNTX1VTU19SRVE6CisJCQlyYyA9IHBhcnNlX3Byb2Nlc3NfdXNzX3JlcShpbnZva2VfZGF0YSArIG9mZnNldCArIDMsCisJCQkJCQkgICBsZW5ndGggLSBvZmZzZXQgLSAzLAorCQkJCQkJICAgcmVxKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZnByaW50ZihzdGRlcnIsICJHU00gMDQuODAgb3BlcmF0aW9uIGNvZGUgMHglMDJ4ICIKKwkJCQkiaXMgbm90IHlldCBoYW5kbGVkXG4iLCBvcGVyYXRpb25fY29kZSk7CisJCQlyYyA9IDA7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCWZwcmludGYoc3RkZXJyLCAiVW5leHBlY3RlZCBHU00gMDQuODAgQ29tcG9uZW50LUlEIHRhZyAweCUwMnggIgorCQkJIihleHBlY3RpbmcgT3BlcmF0aW9uIENvZGUgdGFnKVxuIiwKKwkJCWludm9rZV9kYXRhWzBdKTsKKwkJcmMgPSAwOworCX0KKworCXJldHVybiByYzsKK30KKworLyogUGFyc2UgdGhlIHBhcmFtZXRlcnMgb2YgYSBQcm9jZXNzIFVuc3RydWN0dXJlZFNTIFJlcXVlc3QgKi8KK3N0YXRpYyBpbnQgcGFyc2VfcHJvY2Vzc191c3NfcmVxKHVfaW50OF90ICp1c3NfcmVxX2RhdGEsIHVfaW50OF90IGxlbmd0aCwKKwkJCQkJc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKQoreworCWludCByYyA9IDA7CisJaW50IG51bV9jaGFyczsKKwl1X2ludDhfdCBkY3M7CisKKwlpZiAodXNzX3JlcV9kYXRhWzBdID09IEdTTV8wNDgwX1NFUVVFTkNFX1RBRykgeworCQlpZiAodXNzX3JlcV9kYXRhWzJdID09IEFTTjFfT0NURVRfU1RSSU5HX1RBRykgeworCQkJZGNzID0gdXNzX3JlcV9kYXRhWzRdOworCQkJaWYgKChkY3MgPT0gMHgwRikgJiYKKwkJCSAgICAodXNzX3JlcV9kYXRhWzVdID09IEFTTjFfT0NURVRfU1RSSU5HX1RBRykpIHsKKwkJCQludW1fY2hhcnMgPSAodXNzX3JlcV9kYXRhWzZdICogOCkgLyA3OworCQkJCS8qIFByZXZlbnQgYSBtb2JpbGUtb3JpZ2luYXRlZCBidWZmZXItb3ZlcnJ1biEgKi8KKwkJCQlpZiAobnVtX2NoYXJzID4gTUFYX0xFTl9VU1NEX1NUUklORykKKwkJCQkJbnVtX2NoYXJzID0gTUFYX0xFTl9VU1NEX1NUUklORzsKKwkJCQlnc21fN2JpdF9kZWNvZGUocmVxLT50ZXh0LAorCQkJCQkJJih1c3NfcmVxX2RhdGFbN10pLCBudW1fY2hhcnMpOworCQkJCS8qIGFwcGVuZCBudWxsLXRlcm1pbmF0b3IgKi8KKwkJCQlyZXEtPnRleHRbbnVtX2NoYXJzKzFdID0gMDsKKwkJCQlyYyA9IDE7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHJjOworfQorCisvKiBTZW5kIHJlc3BvbnNlIHRvIGEgbW9iaWxlLW9yaWdpbmF0ZWQgUHJvY2Vzc1Vuc3RydWN0dXJlZFNTLVJlcXVlc3QgKi8KK2ludCBnc20wNDgwX3NlbmRfdXNzZF9yZXNwb25zZShjb25zdCBzdHJ1Y3QgbXNnYiAqaW5fbXNnLCBjb25zdCBjaGFyICpyZXNwb25zZV90ZXh0LAorCQkJCQkJY29uc3Qgc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisJdV9pbnQ4X3QgKnB0cjg7CisJaW50IHJlc3BvbnNlX2xlbjsKKworCXJlc3BvbnNlX2xlbiA9IChzdHJsZW4ocmVzcG9uc2VfdGV4dCkgKiA3KSAvIDg7CisJaWYgKCgoc3RybGVuKHJlc3BvbnNlX3RleHQpICogNykgJSA4KSAhPSAwKQorCQlyZXNwb25zZV9sZW4gKz0gMTsKKworCW1zZy0+bGNoYW4gPSBpbl9tc2ctPmxjaGFuOworCisJLyogRmlyc3QgcHV0IHRoZSBwYXlsb2FkIHRleHQgaW50byB0aGUgbWVzc2FnZSAqLworCXB0cjggPSBtc2diX3B1dChtc2csIHJlc3BvbnNlX2xlbik7CisJZ3NtXzdiaXRfZW5jb2RlKHB0cjgsIHJlc3BvbnNlX3RleHQpOworCisJLyogVGhlbiB3cmFwIGl0IGFzIGFuIE9jdGV0IFN0cmluZyAqLworCW1zZ2Jfd3JhcF93aXRoX1RMKG1zZywgQVNOMV9PQ1RFVF9TVFJJTkdfVEFHKTsKKworCS8qIFByZS1wZW5kIHRoZSBEQ1Mgb2N0ZXQgc3RyaW5nICovCisJbXNnYl9wdXNoX1RMVjEobXNnLCBBU04xX09DVEVUX1NUUklOR19UQUcsIDB4MEYpOworCisJLyogVGhlbiB3cmFwIHRoZXNlIGFzIGEgU2VxdWVuY2UgKi8KKwltc2diX3dyYXBfd2l0aF9UTChtc2csIEdTTV8wNDgwX1NFUVVFTkNFX1RBRyk7CisKKwkvKiBQcmUtcGVuZCB0aGUgb3BlcmF0aW9uIGNvZGUgKi8KKwltc2diX3B1c2hfVExWMShtc2csIEdTTTA0ODBfT1BFUkFUSU9OX0NPREUsCisJCQlHU00wNDgwX09QX0NPREVfUFJPQ0VTU19VU1NfUkVRKTsKKworCS8qIFdyYXAgdGhlIG9wZXJhdGlvbiBjb2RlIGFuZCBJQTUgc3RyaW5nIGFzIGEgc2VxdWVuY2UgKi8KKwltc2diX3dyYXBfd2l0aF9UTChtc2csIEdTTV8wNDgwX1NFUVVFTkNFX1RBRyk7CisKKwkvKiBQcmUtcGVuZCB0aGUgaW52b2tlIElEICovCisJbXNnYl9wdXNoX1RMVjEobXNnLCBHU00wNDgwX0NPTVBJRFRBR19JTlZPS0VfSUQsIHJlcS0+aW52b2tlX2lkKTsKKworCS8qIFdyYXAgdGhpcyB1cCBhcyBhIFJldHVybiBSZXN1bHQgY29tcG9uZW50ICovCisJbXNnYl93cmFwX3dpdGhfVEwobXNnLCBHU00wNDgwX0NUWVBFX1JFVFVSTl9SRVNVTFQpOworCisJLyogV3JhcCB0aGUgY29tcG9uZW50IGluIGEgRmFjaWxpdHkgbWVzc2FnZSAqLworCW1zZ2Jfd3JhcF93aXRoX1RMKG1zZywgR1NNMDQ4MF9JRV9GQUNJTElUWSk7CisKKwkvKiBBbmQgZmluYWxseSBwcmUtcGVuZCB0aGUgTDMgaGVhZGVyICovCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1c2gobXNnLCBzaXplb2YoKmdoKSk7CisJZ2gtPnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfTkNfU1MgfCByZXEtPnRyYW5zYWN0aW9uX2lkCisJCQkJCXwgKDE8PDcpOyAgLyogVEkgZGlyZWN0aW9uID0gMSAqLworCWdoLT5tc2dfdHlwZSA9IEdTTTA0ODBfTVRZUEVfUkVMRUFTRV9DT01QTEVURTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7Cit9CisKK2ludCBnc20wNDgwX3NlbmRfdXNzZF9yZWplY3QoY29uc3Qgc3RydWN0IG1zZ2IgKmluX21zZywKKwkJCQljb25zdCBzdHJ1Y3QgdXNzZF9yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaDsKKworCW1zZy0+bGNoYW4gPSBpbl9tc2ctPmxjaGFuOworCisJLyogRmlyc3QgaW5zZXJ0IHRoZSBwcm9ibGVtIGNvZGUgKi8KKwltc2diX3B1c2hfVExWMShtc2csIEdTTV8wNDgwX1BST0JMRU1fQ09ERV9UQUdfR0VORVJBTCwKKwkJCUdTTV8wNDgwX0dFTl9QUk9CX0NPREVfVU5SRUNPR05JU0VEKTsKKworCS8qIEJlZm9yZSBpdCBpbnNlcnQgdGhlIGludm9rZSBJRCAqLworCW1zZ2JfcHVzaF9UTFYxKG1zZywgR1NNMDQ4MF9DT01QSURUQUdfSU5WT0tFX0lELCByZXEtPmludm9rZV9pZCk7CisKKwkvKiBXcmFwIHRoaXMgdXAgYXMgYSBSZWplY3QgY29tcG9uZW50ICovCisJbXNnYl93cmFwX3dpdGhfVEwobXNnLCBHU00wNDgwX0NUWVBFX1JFSkVDVCk7CisKKwkvKiBXcmFwIHRoZSBjb21wb25lbnQgaW4gYSBGYWNpbGl0eSBtZXNzYWdlICovCisJbXNnYl93cmFwX3dpdGhfVEwobXNnLCBHU00wNDgwX0lFX0ZBQ0lMSVRZKTsKKworCS8qIEFuZCBmaW5hbGx5IHByZS1wZW5kIHRoZSBMMyBoZWFkZXIgKi8KKwlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHVzaChtc2csIHNpemVvZigqZ2gpKTsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19OQ19TUzsKKwlnaC0+cHJvdG9fZGlzY3IgfD0gcmVxLT50cmFuc2FjdGlvbl9pZCB8ICgxPDw3KTsgIC8qIFRJIGRpcmVjdGlvbiA9IDEgKi8KKwlnaC0+bXNnX3R5cGUgPSBHU00wNDgwX01UWVBFX1JFTEVBU0VfQ09NUExFVEU7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3NtX2RhdGEuYyBiL29wZW5ic2Mvc3JjL2dzbV9kYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjljY2E0OQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dzbV9kYXRhLmMKQEAgLTAsMCArMSw1MzIgQEAKKy8qIChDKSAyMDA4LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtX3V0aWxzLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc3RhdGlzdGljcy5oPgorCit2b2lkICp0YWxsX2JzY19jdHg7CisKK3N0YXRpYyBMTElTVF9IRUFEKGJ0c19tb2RlbHMpOworCit2b2lkIHNldF90c19lMWxpbmsoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cywgdV9pbnQ4X3QgZTFfbnIsCisJCSAgIHVfaW50OF90IGUxX3RzLCB1X2ludDhfdCBlMV90c19zcykKK3sKKwl0cy0+ZTFfbGluay5lMV9uciA9IGUxX25yOworCXRzLT5lMV9saW5rLmUxX3RzID0gZTFfdHM7CisJdHMtPmUxX2xpbmsuZTFfdHNfc3MgPSBlMV90c19zczsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgcGNoYW5fbmFtZXNbXSA9IHsKKwl7IEdTTV9QQ0hBTl9OT05FLAkiTk9ORSIgfSwKKwl7IEdTTV9QQ0hBTl9DQ0NILAkiQ0NDSCIgfSwKKwl7IEdTTV9QQ0hBTl9DQ0NIX1NEQ0NINCwiQ0NDSCtTRENDSDQiIH0sCisJeyBHU01fUENIQU5fVENIX0YsCSJUQ0gvRiIgfSwKKwl7IEdTTV9QQ0hBTl9UQ0hfSCwJIlRDSC9IIiB9LAorCXsgR1NNX1BDSEFOX1NEQ0NIOF9TQUNDSDhDLCAiU0RDQ0g4IiB9LAorCXsgR1NNX1BDSEFOX1BEQ0gsCSJQRENIIiB9LAorCXsgR1NNX1BDSEFOX1RDSF9GX1BEQ0gsCSJUQ0gvRl9QRENIIiB9LAorCXsgR1NNX1BDSEFOX1VOS05PV04sCSJVTktOT1dOIiB9LAorCXsgMCwJCQlOVUxMIH0KK307CisKK2NvbnN0IGNoYXIgKmdzbV9wY2hhbl9uYW1lKGVudW0gZ3NtX3BoeXNfY2hhbl9jb25maWcgYykKK3sKKwlyZXR1cm4gZ2V0X3ZhbHVlX3N0cmluZyhwY2hhbl9uYW1lcywgYyk7Cit9CisKK2VudW0gZ3NtX3BoeXNfY2hhbl9jb25maWcgZ3NtX3BjaGFuX3BhcnNlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIGdldF9zdHJpbmdfdmFsdWUocGNoYW5fbmFtZXMsIG5hbWUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBsY2hhbnRfbmFtZXNbXSA9IHsKKwl7IEdTTV9MQ0hBTl9OT05FLAkiTk9ORSIgfSwKKwl7IEdTTV9MQ0hBTl9TRENDSCwJIlNEQ0NIIiB9LAorCXsgR1NNX0xDSEFOX1RDSF9GLAkiVENIL0YiIH0sCisJeyBHU01fTENIQU5fVENIX0gsCSJUQ0gvSCIgfSwKKwl7IEdTTV9MQ0hBTl9VTktOT1dOLAkiVU5LTk9XTiIgfSwKKwl7IDAsCQkJTlVMTCB9Cit9OworCitjb25zdCBjaGFyICpnc21fbGNoYW50X25hbWUoZW51bSBnc21fY2hhbl90IGMpCit7CisJcmV0dXJuIGdldF92YWx1ZV9zdHJpbmcobGNoYW50X25hbWVzLCBjKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgbGNoYW5fc19uYW1lc1tdID0geworCXsgTENIQU5fU19OT05FLAkJIk5PTkUiIH0sCisJeyBMQ0hBTl9TX0FDVF9SRVEsCSJBQ1RJVkFUSU9OIFJFUVVFU1RFRCIgfSwKKwl7IExDSEFOX1NfQUNUSVZFLAkiQUNUSVZFIiB9LAorCXsgTENIQU5fU19JTkFDVElWRSwJIklOQUNUSVZFIiB9LAorCXsgTENIQU5fU19SRUxfUkVRLAkiUkVMRUFTRSBSRVFVRVNURUQiIH0sCisJeyAwLAkJCU5VTEwgfQorfTsKKworY29uc3QgY2hhciAqZ3NtX2xjaGFuc19uYW1lKGVudW0gZ3NtX2xjaGFuX3N0YXRlIHMpCit7CisJcmV0dXJuIGdldF92YWx1ZV9zdHJpbmcobGNoYW5fc19uYW1lcywgcyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIGNocmVxX25hbWVzW10gPSB7CisJeyBHU01fQ0hSRVFfUkVBU09OX0VNRVJHLAkiRU1FUkdFTkNZIiB9LAorCXsgR1NNX0NIUkVRX1JFQVNPTl9QQUcsCQkiUEFHSU5HIiB9LAorCXsgR1NNX0NIUkVRX1JFQVNPTl9DQUxMLAkiQ0FMTCIgfSwKKwl7IEdTTV9DSFJFUV9SRUFTT05fTE9DQVRJT05fVVBELCJMT0NBVElPTl9VUERBVEUiIH0sCisJeyBHU01fQ0hSRVFfUkVBU09OX09USEVSLAkiT1RIRVIiIH0sCisJeyAwLAkJCQlOVUxMIH0KK307CisKK2NvbnN0IGNoYXIgKmdzbV9jaHJlcV9uYW1lKGVudW0gZ3NtX2NocmVxX3JlYXNvbl90IGMpCit7CisJcmV0dXJuIGdldF92YWx1ZV9zdHJpbmcoY2hyZXFfbmFtZXMsIGMpOworfQorCitzdGF0aWMgc3RydWN0IGdzbV9idHNfbW9kZWwgKmJ0c19tb2RlbF9maW5kKGVudW0gZ3NtX2J0c190eXBlIHR5cGUpCit7CisJc3RydWN0IGdzbV9idHNfbW9kZWwgKm1vZGVsOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkobW9kZWwsICZidHNfbW9kZWxzLCBsaXN0KSB7CisJCWlmIChtb2RlbC0+dHlwZSA9PSB0eXBlKQorCQkJcmV0dXJuIG1vZGVsOworCX0KKworCXJldHVybiBOVUxMOworfQorCitpbnQgZ3NtX2J0c19tb2RlbF9yZWdpc3RlcihzdHJ1Y3QgZ3NtX2J0c19tb2RlbCAqbW9kZWwpCit7CisJaWYgKGJ0c19tb2RlbF9maW5kKG1vZGVsLT50eXBlKSkKKwkJcmV0dXJuIC1FRVhJU1Q7CisKKwl0bHZfZGVmX3BhdGNoKCZtb2RlbC0+bm1fYXR0X3RsdmRlZiwgJm5tX2F0dF90bHZkZWYpOworCWxsaXN0X2FkZF90YWlsKCZtb2RlbC0+bGlzdCwgJmJ0c19tb2RlbHMpOworCXJldHVybiAwOworfQorCisKK3N0cnVjdCBnc21fYnRzX3RyeCAqZ3NtX2J0c190cnhfYWxsb2Moc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IHRhbGxvY196ZXJvKGJ0cywgc3RydWN0IGdzbV9idHNfdHJ4KTsKKwlpbnQgazsKKworCWlmICghdHJ4KQorCQlyZXR1cm4gTlVMTDsKKworCXRyeC0+YnRzID0gYnRzOworCXRyeC0+bnIgPSBidHMtPm51bV90cngrKzsKKwl0cngtPm5tX3N0YXRlLmFkbWluaXN0cmF0aXZlID0gTk1fU1RBVEVfVU5MT0NLRUQ7CisKKwlmb3IgKGsgPSAwOyBrIDwgVFJYX05SX1RTOyBrKyspIHsKKwkJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9ICZ0cngtPnRzW2tdOworCQlpbnQgbDsKKwkJCisJCXRzLT50cnggPSB0cng7CisJCXRzLT5uciA9IGs7CisJCXRzLT5wY2hhbiA9IEdTTV9QQ0hBTl9OT05FOworCisJCWZvciAobCA9IDA7IGwgPCBUU19NQVhfTENIQU47IGwrKykgeworCQkJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisJCQlsY2hhbiA9ICZ0cy0+bGNoYW5bbF07CisKKwkJCWxjaGFuLT50cyA9IHRzOworCQkJbGNoYW4tPm5yID0gbDsKKwkJCWxjaGFuLT50eXBlID0gR1NNX0xDSEFOX05PTkU7CisJCX0KKwl9CisKKwlpZiAodHJ4LT5uciAhPSAwKQorCQl0cngtPm5vbWluYWxfcG93ZXIgPSBidHMtPmMwLT5ub21pbmFsX3Bvd2VyOworCisJbGxpc3RfYWRkX3RhaWwoJnRyeC0+bGlzdCwgJmJ0cy0+dHJ4X2xpc3QpOworCisJcmV0dXJuIHRyeDsKK30KKworc3RydWN0IGdzbV9idHMgKmdzbV9idHNfYWxsb2Moc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGVudW0gZ3NtX2J0c190eXBlIHR5cGUsCisJCQkgICAgICB1X2ludDhfdCB0c2MsIHVfaW50OF90IGJzaWMpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHRhbGxvY196ZXJvKG5ldCwgc3RydWN0IGdzbV9idHMpOworCXN0cnVjdCBnc21fYnRzX21vZGVsICptb2RlbCA9IGJ0c19tb2RlbF9maW5kKHR5cGUpOworCWludCBpOworCisJaWYgKCFidHMpCisJCXJldHVybiBOVUxMOworCisJaWYgKCFtb2RlbCAmJiB0eXBlICE9IEdTTV9CVFNfVFlQRV9VTktOT1dOKSB7CisJCXRhbGxvY19mcmVlKGJ0cyk7CisJCXJldHVybiBOVUxMOworCX0KKworCWJ0cy0+bmV0d29yayA9IG5ldDsKKwlidHMtPm5yID0gbmV0LT5udW1fYnRzKys7CisJYnRzLT50eXBlID0gdHlwZTsKKwlidHMtPm1vZGVsID0gbW9kZWw7CisJYnRzLT50c2MgPSB0c2M7CisJYnRzLT5ic2ljID0gYnNpYzsKKwlidHMtPm51bV90cnggPSAwOworCUlOSVRfTExJU1RfSEVBRCgmYnRzLT50cnhfbGlzdCk7CisJYnRzLT5tc19tYXhfcG93ZXIgPSAxNTsJLyogZEJtICovCisJYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyLmNlbGxfcmVzZWxfaHlzdCA9IDI7IC8qIDQgZEIgKi8KKwlidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIucnhsZXZfYWNjX21pbiA9IDA7CisJYnRzLT5zaV9jb21tb24ubmVpZ2hfbGlzdC5kYXRhID0gYnRzLT5zaV9jb21tb24uZGF0YS5uZWlnaF9saXN0OworCWJ0cy0+c2lfY29tbW9uLm5laWdoX2xpc3QuZGF0YV9sZW4gPQorCQkJCXNpemVvZihidHMtPnNpX2NvbW1vbi5kYXRhLm5laWdoX2xpc3QpOworCWJ0cy0+c2lfY29tbW9uLmNlbGxfYWxsb2MuZGF0YSA9IGJ0cy0+c2lfY29tbW9uLmRhdGEuY2VsbF9hbGxvYzsKKwlidHMtPnNpX2NvbW1vbi5jZWxsX2FsbG9jLmRhdGFfbGVuID0KKwkJCQlzaXplb2YoYnRzLT5zaV9jb21tb24uZGF0YS5jZWxsX2FsbG9jKTsKKwlidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wucmUgPSAxOyAvKiBubyByZS1lc3RhYmxpc2htZW50ICovCisJYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLnR4X2ludGVnZXIgPSA5OyAgLyogMTIgc2xvdHMgc3ByZWFkIC0gMjE3LzExNSBzbG90cyBkZWxheSAqLworCWJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbC5tYXhfdHJhbnMgPSAzOyAvKiA3IHJldHJhbnNtaXNzaW9ucyAqLworCWJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbC50MiA9IDQ7IC8qIG5vIGVtZXJnZW5jeSBjYWxscyAqLworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYnRzLT5ncHJzLm5zdmMpOyBpKyspIHsKKwkJYnRzLT5ncHJzLm5zdmNbaV0uYnRzID0gYnRzOworCQlidHMtPmdwcnMubnN2Y1tpXS5pZCA9IGk7CisJfQorCisJLyogY3JlYXRlIG91ciBwcmltYXJ5IFRSWCAqLworCWJ0cy0+YzAgPSBnc21fYnRzX3RyeF9hbGxvYyhidHMpOworCWlmICghYnRzLT5jMCkgeworCQl0YWxsb2NfZnJlZShidHMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYnRzLT5jMC0+dHNbMF0ucGNoYW4gPSBHU01fUENIQU5fQ0NDSF9TRENDSDQ7CisKKwlidHMtPnJhY2hfYl90aHJlc2ggPSAtMTsKKwlidHMtPnJhY2hfbGRhdmdfc2xvdHMgPSAtMTsKKwlsbGlzdF9hZGRfdGFpbCgmYnRzLT5saXN0LCAmbmV0LT5idHNfbGlzdCk7CisKKwlyZXR1cm4gYnRzOworfQorCitzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbV9uZXR3b3JrX2luaXQodV9pbnQxNl90IGNvdW50cnlfY29kZSwgdV9pbnQxNl90IG5ldHdvcmtfY29kZSwKKwkJCQkgICAgIGludCAoKm1uY2NfcmVjdikoc3RydWN0IGdzbV9uZXR3b3JrICosIGludCwgdm9pZCAqKSkKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldDsKKworCW5ldCA9IHRhbGxvY196ZXJvKHRhbGxfYnNjX2N0eCwgc3RydWN0IGdzbV9uZXR3b3JrKTsKKwlpZiAoIW5ldCkKKwkJcmV0dXJuIE5VTEw7CisKKwluZXQtPmNvdW50cnlfY29kZSA9IGNvdW50cnlfY29kZTsKKwluZXQtPm5ldHdvcmtfY29kZSA9IG5ldHdvcmtfY29kZTsKKwluZXQtPm51bV9idHMgPSAwOworCW5ldC0+cmVqZWN0X2NhdXNlID0gR1NNNDhfUkVKRUNUX1JPQU1JTkdfTk9UX0FMTE9XRUQ7CisJbmV0LT5UMzEwMSA9IEdTTV9UMzEwMV9ERUZBVUxUOworCW5ldC0+VDMxMTMgPSBHU01fVDMxMTNfREVGQVVMVDsKKwkvKiBGSVhNRTogaW5pdGlhbGl6ZSBhbGwgb3RoZXIgdGltZXJzISAqLworCisJLyogZGVmYXVsdCBzZXQgb2YgaGFuZG92ZXIgcGFyYW1ldGVycyAqLworCW5ldC0+aGFuZG92ZXIud2luX3J4bGV2X2F2ZyA9IDEwOworCW5ldC0+aGFuZG92ZXIud2luX3J4cXVhbF9hdmcgPSAxOworCW5ldC0+aGFuZG92ZXIud2luX3J4bGV2X2F2Z19uZWlnaCA9IDEwOworCW5ldC0+aGFuZG92ZXIucHdyX2ludGVydmFsID0gNjsKKwluZXQtPmhhbmRvdmVyLnB3cl9oeXN0ZXJlc2lzID0gMzsKKwluZXQtPmhhbmRvdmVyLm1heF9kaXN0YW5jZSA9IDk5OTk7CisKKwlJTklUX0xMSVNUX0hFQUQoJm5ldC0+dHJhbnNfbGlzdCk7CisJSU5JVF9MTElTVF9IRUFEKCZuZXQtPnVwcXVldWUpOworCUlOSVRfTExJU1RfSEVBRCgmbmV0LT5idHNfbGlzdCk7CisKKwluZXQtPnN0YXRzLmNocmVxLnRvdGFsID0gY291bnRlcl9hbGxvYygibmV0LmNocmVxLnRvdGFsIik7CisJbmV0LT5zdGF0cy5jaHJlcS5ub19jaGFubmVsID0gY291bnRlcl9hbGxvYygibmV0LmNocmVxLm5vX2NoYW5uZWwiKTsKKwluZXQtPnN0YXRzLmhhbmRvdmVyLmF0dGVtcHRlZCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5oYW5kb3Zlci5hdHRlbXB0ZWQiKTsKKwluZXQtPnN0YXRzLmhhbmRvdmVyLm5vX2NoYW5uZWwgPSBjb3VudGVyX2FsbG9jKCJuZXQuaGFuZG92ZXIubm9fY2hhbm5lbCIpOworCW5ldC0+c3RhdHMuaGFuZG92ZXIudGltZW91dCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5oYW5kb3Zlci50aW1lb3V0Iik7CisJbmV0LT5zdGF0cy5oYW5kb3Zlci5jb21wbGV0ZWQgPSBjb3VudGVyX2FsbG9jKCJuZXQuaGFuZG92ZXIuY29tcGxldGVkIik7CisJbmV0LT5zdGF0cy5oYW5kb3Zlci5mYWlsZWQgPSBjb3VudGVyX2FsbG9jKCJuZXQuaGFuZG92ZXIuZmFpbGVkIik7CisJbmV0LT5zdGF0cy5sb2NfdXBkX3R5cGUuYXR0YWNoID0gY291bnRlcl9hbGxvYygibmV0LmxvY191cGRfdHlwZS5hdHRhY2giKTsKKwluZXQtPnN0YXRzLmxvY191cGRfdHlwZS5ub3JtYWwgPSBjb3VudGVyX2FsbG9jKCJuZXQubG9jX3VwZF90eXBlLm5vcm1hbCIpOworCW5ldC0+c3RhdHMubG9jX3VwZF90eXBlLnBlcmlvZGljID0gY291bnRlcl9hbGxvYygibmV0LmxvY191cGRfdHlwZS5wZXJpb2RpYyIpOworCW5ldC0+c3RhdHMubG9jX3VwZF90eXBlLmRldGFjaCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5pbXNpX2RldGFjaC5jb3VudCIpOworCW5ldC0+c3RhdHMubG9jX3VwZF9yZXNwLnJlamVjdCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5sb2NfdXBkX3Jlc3AucmVqZWN0Iik7CisJbmV0LT5zdGF0cy5sb2NfdXBkX3Jlc3AuYWNjZXB0ID0gY291bnRlcl9hbGxvYygibmV0LmxvY191cGRfcmVzcC5hY2NlcHQiKTsKKwluZXQtPnN0YXRzLnBhZ2luZy5hdHRlbXB0ZWQgPSBjb3VudGVyX2FsbG9jKCJuZXQucGFnaW5nLmF0dGVtcHRlZCIpOworCW5ldC0+c3RhdHMucGFnaW5nLmRldGFjaGVkID0gY291bnRlcl9hbGxvYygibmV0LnBhZ2luZy5kZXRhY2hlZCIpOworCW5ldC0+c3RhdHMucGFnaW5nLmNvbXBsZXRlZCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5wYWdpbmcuY29tcGxldGVkIik7CisJbmV0LT5zdGF0cy5wYWdpbmcuZXhwaXJlZCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5wYWdpbmcuZXhwaXJlZCIpOworCW5ldC0+c3RhdHMuc21zLnN1Ym1pdHRlZCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5zbXMuc3VibWl0dGVkIik7CisJbmV0LT5zdGF0cy5zbXMubm9fcmVjZWl2ZXIgPSBjb3VudGVyX2FsbG9jKCJuZXQuc21zLm5vX3JlY2VpdmVyIik7CisJbmV0LT5zdGF0cy5zbXMuZGVsaXZlcmVkID0gY291bnRlcl9hbGxvYygibmV0LnNtcy5kZWxpdmVyZWQiKTsKKwluZXQtPnN0YXRzLnNtcy5ycF9lcnJfbWVtID0gY291bnRlcl9hbGxvYygibmV0LnNtcy5ycF9lcnJfbWVtIik7CisJbmV0LT5zdGF0cy5zbXMucnBfZXJyX290aGVyID0gY291bnRlcl9hbGxvYygibmV0LnNtcy5ycF9lcnJfb3RoZXIiKTsKKwluZXQtPnN0YXRzLmNhbGwuZGlhbGxlZCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5jYWxsLmRpYWxsZWQiKTsKKwluZXQtPnN0YXRzLmNhbGwuYWxlcnRlZCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5jYWxsLmFsZXJ0ZWQiKTsKKwluZXQtPnN0YXRzLmNhbGwuY29ubmVjdGVkID0gY291bnRlcl9hbGxvYygibmV0LmNhbGwuY29ubmVjdGVkIik7CisJbmV0LT5zdGF0cy5jaGFuLnJmX2ZhaWwgPSBjb3VudGVyX2FsbG9jKCJuZXQuY2hhbi5yZl9mYWlsIik7CisJbmV0LT5zdGF0cy5jaGFuLnJsbF9lcnIgPSBjb3VudGVyX2FsbG9jKCJuZXQuY2hhbi5ybGxfZXJyIik7CisJbmV0LT5zdGF0cy5idHMub21sX2ZhaWwgPSBjb3VudGVyX2FsbG9jKCJuZXQuYnRzLm9tbF9mYWlsIik7CisJbmV0LT5zdGF0cy5idHMucnNsX2ZhaWwgPSBjb3VudGVyX2FsbG9jKCJuZXQuYnRzLnJzbF9mYWlsIik7CisKKwluZXQtPm1uY2NfcmVjdiA9IG1uY2NfcmVjdjsKKworCXJldHVybiBuZXQ7Cit9CisKK3N0cnVjdCBnc21fYnRzICpnc21fYnRzX251bShzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgaW50IG51bSkKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCisJaWYgKG51bSA+PSBuZXQtPm51bV9idHMpCisJCXJldHVybiBOVUxMOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoYnRzLCAmbmV0LT5idHNfbGlzdCwgbGlzdCkgeworCQlpZiAoYnRzLT5uciA9PSBudW0pCisJCQlyZXR1cm4gYnRzOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKiBHZXQgcmVmZXJlbmNlIHRvIGEgbmVpZ2hib3IgY2VsbCBvbiBhIGdpdmVuIEJDQ0ggQVJGQ04gKi8KK3N0cnVjdCBnc21fYnRzICpnc21fYnRzX25laWdoYm9yKGNvbnN0IHN0cnVjdCBnc21fYnRzICpidHMsCisJCQkJIHVfaW50MTZfdCBhcmZjbiwgdV9pbnQ4X3QgYnNpYykKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqbmVpZ2g7CisJLyogRklYTUU6IHVzZSBzb21lIGJldHRlciBoZXVyaXN0aWNzIGhlcmUgdG8gZGV0ZXJtaW5lIHdoaWNoIGNlbGwKKwkgKiB1c2luZyB0aGlzIEFSRkNOIHJlYWxseSBpcyBjbG9zZXN0IHRvIHRoZSB0YXJnZXQgY2VsbC4gIEZvcgorCSAqIG5vdyB3ZSBzaW1wbHkgYXNzdW1lIHRoYXQgZWFjaCBBUkZDTiB3aWxsIG9ubHkgYmUgdXNlZCBieSBvbmUKKwkgKiBjZWxsICovCisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShuZWlnaCwgJmJ0cy0+bmV0d29yay0+YnRzX2xpc3QsIGxpc3QpIHsKKwkJaWYgKG5laWdoLT5jMC0+YXJmY24gPT0gYXJmY24gJiYKKwkJICAgIG5laWdoLT5ic2ljID09IGJzaWMpCisJCQlyZXR1cm4gbmVpZ2g7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBnc21fYnRzX3RyeCAqZ3NtX2J0c190cnhfbnVtKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBudW0pCit7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisKKwlpZiAobnVtID49IGJ0cy0+bnVtX3RyeCkKKwkJcmV0dXJuIE5VTEw7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cngsICZidHMtPnRyeF9saXN0LCBsaXN0KSB7CisJCWlmICh0cngtPm5yID09IG51bSkKKwkJCXJldHVybiB0cng7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjaGFyIHRzMnN0clsyNTVdOworCitjaGFyICpnc21fdHJ4X25hbWUoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJc25wcmludGYodHMyc3RyLCBzaXplb2YodHMyc3RyKSwgIihidHM9JWQsdHJ4PSVkKSIsCisJCSB0cngtPmJ0cy0+bnIsIHRyeC0+bnIpOworCisJcmV0dXJuIHRzMnN0cjsKK30KKworCitjaGFyICpnc21fdHNfbmFtZShzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzKQoreworCXNucHJpbnRmKHRzMnN0ciwgc2l6ZW9mKHRzMnN0ciksICIoYnRzPSVkLHRyeD0lZCx0cz0lZCkiLAorCQkgdHMtPnRyeC0+YnRzLT5uciwgdHMtPnRyeC0+bnIsIHRzLT5ucik7CisKKwlyZXR1cm4gdHMyc3RyOworfQorCitjaGFyICpnc21fbGNoYW5fbmFtZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzID0gbGNoYW4tPnRzOworCisJc25wcmludGYodHMyc3RyLCBzaXplb2YodHMyc3RyKSwgIihidHM9JWQsdHJ4PSVkLHRzPSVkLHNzPSVkKSIsCisJCSB0cy0+dHJ4LT5idHMtPm5yLCB0cy0+dHJ4LT5uciwgdHMtPm5yLCBsY2hhbi0+bnIpOworCisJcmV0dXJuIHRzMnN0cjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgYnRzX3R5cGVzW10gPSB7CisJeyBHU01fQlRTX1RZUEVfVU5LTk9XTiwJInVua25vd24iIH0sCisJeyBHU01fQlRTX1RZUEVfQlMxMSwJImJzMTEiIH0sCisJeyBHU01fQlRTX1RZUEVfTkFOT0JUUywJIm5hbm9idHMiIH0sCisJeyAwLAkJCU5VTEwgfQorfTsKKworZW51bSBnc21fYnRzX3R5cGUgcGFyc2VfYnRzdHlwZShjb25zdCBjaGFyICphcmcpCit7CisJcmV0dXJuIGdldF9zdHJpbmdfdmFsdWUoYnRzX3R5cGVzLCBhcmcpOworfQorCitjb25zdCBjaGFyICpidHN0eXBlMnN0cihlbnVtIGdzbV9idHNfdHlwZSB0eXBlKQoreworCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKGJ0c190eXBlcywgdHlwZSk7Cit9CisKK3N0cnVjdCBnc21fYnRzX3RyeCAqZ3NtX2J0c190cnhfYnlfbnIoc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IG5yKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJ4LCAmYnRzLT50cnhfbGlzdCwgbGlzdCkgeworCQlpZiAodHJ4LT5uciA9PSBucikKKwkJCXJldHVybiB0cng7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiBTZWFyY2ggZm9yIGEgQlRTIGluIHRoZSBnaXZlbiBMb2NhdGlvbiBBcmVhOyBvcHRpb25hbGx5IHN0YXJ0IHNlYXJjaGluZworICogd2l0aCBzdGFydF9idHMgKGZvciBjb250aW51aW5nIHRvIHNlYXJjaCBhZnRlciB0aGUgZmlyc3QgcmVzdWx0KSAqLworc3RydWN0IGdzbV9idHMgKmdzbV9idHNfYnlfbGFjKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCB1bnNpZ25lZCBpbnQgbGFjLAorCQkJCXN0cnVjdCBnc21fYnRzICpzdGFydF9idHMpCit7CisJaW50IGk7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlpbnQgc2tpcCA9IDA7CisKKwlpZiAoc3RhcnRfYnRzKQorCQlza2lwID0gMTsKKworCWZvciAoaSA9IDA7IGkgPCBuZXQtPm51bV9idHM7IGkrKykgeworCQlidHMgPSBnc21fYnRzX251bShuZXQsIGkpOworCisJCWlmIChza2lwKSB7CisJCQlpZiAoc3RhcnRfYnRzID09IGJ0cykKKwkJCQlza2lwID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGxhYyA9PSBHU01fTEFDX1JFU0VSVkVEX0FMTF9CVFMgfHwgYnRzLT5sb2NhdGlvbl9hcmVhX2NvZGUgPT0gbGFjKQorCQkJcmV0dXJuIGJ0czsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIGF1dGhfcG9saWN5X25hbWVzW10gPSB7CisJeyBHU01fQVVUSF9QT0xJQ1lfQ0xPU0VELAkiY2xvc2VkIiB9LAorCXsgR1NNX0FVVEhfUE9MSUNZX0FDQ0VQVF9BTEwsCSJhY2NlcHQtYWxsIiB9LAorCXsgR1NNX0FVVEhfUE9MSUNZX1RPS0VOLAkidG9rZW4iIH0sCisJeyAwLAkJCQlOVUxMIH0KK307CisKK2VudW0gZ3NtX2F1dGhfcG9saWN5IGdzbV9hdXRoX3BvbGljeV9wYXJzZShjb25zdCBjaGFyICphcmcpCit7CisJcmV0dXJuIGdldF9zdHJpbmdfdmFsdWUoYXV0aF9wb2xpY3lfbmFtZXMsIGFyZyk7Cit9CisKK2NvbnN0IGNoYXIgKmdzbV9hdXRoX3BvbGljeV9uYW1lKGVudW0gZ3NtX2F1dGhfcG9saWN5IHBvbGljeSkKK3sKKwlyZXR1cm4gZ2V0X3ZhbHVlX3N0cmluZyhhdXRoX3BvbGljeV9uYW1lcywgcG9saWN5KTsKK30KKwordm9pZCBncHJzX3JhX2lkX2J5X2J0cyhzdHJ1Y3QgZ3Byc19yYV9pZCAqcmFpZCwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlyYWlkLT5tY2MgPSBidHMtPm5ldHdvcmstPmNvdW50cnlfY29kZTsKKwlyYWlkLT5tbmMgPSBidHMtPm5ldHdvcmstPm5ldHdvcmtfY29kZTsKKwlyYWlkLT5sYWMgPSBidHMtPmxvY2F0aW9uX2FyZWFfY29kZTsKKwlyYWlkLT5yYWMgPSBidHMtPmdwcnMucmFjOworfQorCitpbnQgZ3NtNDhfcmFfaWRfYnlfYnRzKHVfaW50OF90ICpidWYsIHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGdwcnNfcmFfaWQgcmFpZDsKKworCWdwcnNfcmFfaWRfYnlfYnRzKCZyYWlkLCBidHMpOworCisJcmV0dXJuIGdzbTQ4X2NvbnN0cnVjdF9yYShidWYsICZyYWlkKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgcnJscF9tb2RlX25hbWVzW10gPSB7CisJeyBSUkxQX01PREVfTk9ORSwJIm5vbmUiIH0sCisJeyBSUkxQX01PREVfTVNfQkFTRUQsCSJtcy1iYXNlZCIgfSwKKwl7IFJSTFBfTU9ERV9NU19QUkVGLAkibXMtcHJlZmVycmVkIiB9LAorCXsgUlJMUF9NT0RFX0FTU19QUkVGLAkiYXNzLXByZWZlcnJlZCIgfSwKKwl7IDAsCQkJTlVMTCB9Cit9OworCitlbnVtIHJybHBfbW9kZSBycmxwX21vZGVfcGFyc2UoY29uc3QgY2hhciAqYXJnKQoreworCXJldHVybiBnZXRfc3RyaW5nX3ZhbHVlKHJybHBfbW9kZV9uYW1lcywgYXJnKTsKK30KKworY29uc3QgY2hhciAqcnJscF9tb2RlX25hbWUoZW51bSBycmxwX21vZGUgbW9kZSkKK3sKKwlyZXR1cm4gZ2V0X3ZhbHVlX3N0cmluZyhycmxwX21vZGVfbmFtZXMsIG1vZGUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBidHNfZ3Byc19tb2RlX25hbWVzW10gPSB7CisJeyBCVFNfR1BSU19OT05FLAkibm9uZSIgfSwKKwl7IEJUU19HUFJTX0dQUlMsCSJncHJzIiB9LAorCXsgQlRTX0dQUlNfRUdQUlMsCSJlZ3BycyIgfSwKKwl7IDAsCQkJTlVMTCB9Cit9OworCitlbnVtIGJ0c19ncHJzX21vZGUgYnRzX2dwcnNfbW9kZV9wYXJzZShjb25zdCBjaGFyICphcmcpCit7CisJcmV0dXJuIGdldF9zdHJpbmdfdmFsdWUoYnRzX2dwcnNfbW9kZV9uYW1lcywgYXJnKTsKK30KKworY29uc3QgY2hhciAqYnRzX2dwcnNfbW9kZV9uYW1lKGVudW0gYnRzX2dwcnNfbW9kZSBtb2RlKQoreworCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKGJ0c19ncHJzX21vZGVfbmFtZXMsIG1vZGUpOworfQorCitzdHJ1Y3QgZ3NtX21lYXNfcmVwICpsY2hhbl9uZXh0X21lYXNfcmVwKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN0cnVjdCBnc21fbWVhc19yZXAgKm1lYXNfcmVwOworCisJbWVhc19yZXAgPSAmbGNoYW4tPm1lYXNfcmVwW2xjaGFuLT5tZWFzX3JlcF9pZHhdOworCW1lbXNldChtZWFzX3JlcCwgMCwgc2l6ZW9mKCptZWFzX3JlcCkpOworCW1lYXNfcmVwLT5sY2hhbiA9IGxjaGFuOworCWxjaGFuLT5tZWFzX3JlcF9pZHggPSAobGNoYW4tPm1lYXNfcmVwX2lkeCArIDEpCisJCQkJCSUgQVJSQVlfU0laRShsY2hhbi0+bWVhc19yZXApOworCisJcmV0dXJuIG1lYXNfcmVwOworfQorCitpbnQgZ3NtX3NldF9idHNfdHlwZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBlbnVtIGdzbV9idHNfdHlwZSB0eXBlKQoreworCXN0cnVjdCBnc21fYnRzX21vZGVsICptb2RlbDsKKworCW1vZGVsID0gYnRzX21vZGVsX2ZpbmQodHlwZSk7CisJaWYgKCFtb2RlbCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlidHMtPnR5cGUgPSB0eXBlOworCWJ0cy0+bW9kZWwgPSBtb2RlbDsKKworCXN3aXRjaCAoYnRzLT50eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfTkFOT0JUUzoKKwkJLyogU2V0IHRoZSBkZWZhdWx0IE9NTCBTdHJlYW0gSUQgdG8gMHhmZiAqLworCQlidHMtPm9tbF90ZWkgPSAweGZmOworCQlidHMtPmMwLT5ub21pbmFsX3Bvd2VyID0gMjM7CisJCWJyZWFrOworCWNhc2UgR1NNX0JUU19UWVBFX0JTMTE6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3NtX3N1YnNjcmliZXIuYyBiL29wZW5ic2Mvc3JjL2dzbV9zdWJzY3JpYmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkyNTA4NwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dzbV9zdWJzY3JpYmVyLmMKQEAgLTAsMCArMSwxMzAgQEAKKy8qIFRoZSBjb25jZXB0IG9mIGEgc3Vic2NyaWJlciBmb3IgdGhlIE1TQywgcm91Z2hseSBITFIvVkxSIGZ1bmN0aW9uYWxpdHkgKi8KKworLyogKEMpIDIwMDggYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kYi5oPgorCitleHRlcm4gc3RydWN0IGxsaXN0X2hlYWQgKnN1YnNjcl9ic2NfYWN0aXZlX3N1YnNjcmliZXIodm9pZCk7CisKK2NoYXIgKnN1YnNjcl9uYW1lKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCWlmIChzdHJsZW4oc3Vic2NyLT5uYW1lKSkKKwkJcmV0dXJuIHN1YnNjci0+bmFtZTsKKworCXJldHVybiBzdWJzY3ItPmltc2k7Cit9CisKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX2dldF9ieV90bXNpKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LAorCQkJCQkgIHVfaW50MzJfdCB0bXNpKQoreworCWNoYXIgdG1zaV9zdHJpbmdbMTRdOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCisJLyogd2UgbWlnaHQgaGF2ZSBhIHJlY29yZCBpbiBtZW1vcnkgYWxyZWFkeSAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHN1YnNjciwgc3Vic2NyX2JzY19hY3RpdmVfc3Vic2NyaWJlcigpLCBlbnRyeSkgeworCQlpZiAodG1zaSA9PSBzdWJzY3ItPnRtc2kpCisJCQlyZXR1cm4gc3Vic2NyX2dldChzdWJzY3IpOworCX0KKworCXNwcmludGYodG1zaV9zdHJpbmcsICIldSIsIHRtc2kpOworCXJldHVybiBkYl9nZXRfc3Vic2NyaWJlcihuZXQsIEdTTV9TVUJTQ1JJQkVSX1RNU0ksIHRtc2lfc3RyaW5nKTsKK30KKworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfZ2V0X2J5X2ltc2koc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCSAgY29uc3QgY2hhciAqaW1zaSkKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHN1YnNjciwgc3Vic2NyX2JzY19hY3RpdmVfc3Vic2NyaWJlcigpLCBlbnRyeSkgeworCQlpZiAoc3RyY21wKHN1YnNjci0+aW1zaSwgaW1zaSkgPT0gMCkKKwkJCXJldHVybiBzdWJzY3JfZ2V0KHN1YnNjcik7CisJfQorCisJcmV0dXJuIGRiX2dldF9zdWJzY3JpYmVyKG5ldCwgR1NNX1NVQlNDUklCRVJfSU1TSSwgaW1zaSk7Cit9CisKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX2dldF9ieV9leHRlbnNpb24oc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCSAgICAgICBjb25zdCBjaGFyICpleHQpCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShzdWJzY3IsIHN1YnNjcl9ic2NfYWN0aXZlX3N1YnNjcmliZXIoKSwgZW50cnkpIHsKKwkJaWYgKHN0cmNtcChzdWJzY3ItPmV4dGVuc2lvbiwgZXh0KSA9PSAwKQorCQkJcmV0dXJuIHN1YnNjcl9nZXQoc3Vic2NyKTsKKwl9CisKKwlyZXR1cm4gZGJfZ2V0X3N1YnNjcmliZXIobmV0LCBHU01fU1VCU0NSSUJFUl9FWFRFTlNJT04sIGV4dCk7Cit9CisKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX2dldF9ieV9pZChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCQkJdW5zaWduZWQgbG9uZyBsb25nIGlkKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCWNoYXIgYnVmWzMyXTsKKwlzcHJpbnRmKGJ1ZiwgIiVsbHUiLCBpZCk7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShzdWJzY3IsIHN1YnNjcl9ic2NfYWN0aXZlX3N1YnNjcmliZXIoKSwgZW50cnkpIHsKKwkJaWYgKHN1YnNjci0+aWQgPT0gaWQpCisJCQlyZXR1cm4gc3Vic2NyX2dldChzdWJzY3IpOworCX0KKworCXJldHVybiBkYl9nZXRfc3Vic2NyaWJlcihuZXQsIEdTTV9TVUJTQ1JJQkVSX0lELCBidWYpOworfQorCisKK2ludCBzdWJzY3JfdXBkYXRlKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqcywgc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IHJlYXNvbikKK3sKKwkvKiBGSVhNRTogTWlncmF0ZSBwZW5kaW5nIHJlcXVlc3RzIGZyb20gb25lIEJTQyB0byBhbm90aGVyICovCisJc3dpdGNoIChyZWFzb24pIHsKKwljYXNlIEdTTV9TVUJTQ1JJQkVSX1VQREFURV9BVFRBQ0hFRDoKKwkJcy0+bmV0ID0gYnRzLT5uZXR3b3JrOworCQkvKiBJbmRpY2F0ZSAiYXR0YWNoZWQgdG8gTEFDIiAqLworCQlzLT5sYWMgPSBidHMtPmxvY2F0aW9uX2FyZWFfY29kZTsKKwkJTE9HUChETU0sIExPR0xfSU5GTywgIlN1YnNjcmliZXIgJXMgQVRUQUNIRUQgTEFDPSV1XG4iLAorCQkJc3Vic2NyX25hbWUocyksIHMtPmxhYyk7CisJCWRpc3BhdGNoX3NpZ25hbChTU19TVUJTQ1IsIFNfU1VCU0NSX0FUVEFDSEVELCBzKTsKKwkJYnJlYWs7CisJY2FzZSBHU01fU1VCU0NSSUJFUl9VUERBVEVfREVUQUNIRUQ6CisJCS8qIE9ubHkgZGV0YWNoIGlmIHdlIGFyZSBjdXJyZW50bHkgaW4gdGhpcyBhcmVhICovCisJCWlmIChidHMtPmxvY2F0aW9uX2FyZWFfY29kZSA9PSBzLT5sYWMpCisJCQlzLT5sYWMgPSBHU01fTEFDX1JFU0VSVkVEX0RFVEFDSEVEOworCQlMT0dQKERNTSwgTE9HTF9JTkZPLCAiU3Vic2NyaWJlciAlcyBERVRBQ0hFRFxuIiwgc3Vic2NyX25hbWUocykpOworCQlkaXNwYXRjaF9zaWduYWwoU1NfU1VCU0NSLCBTX1NVQlNDUl9ERVRBQ0hFRCwgcyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZwcmludGYoc3RkZXJyLCAic3Vic2NyX3VwZGF0ZSB3aXRoIHVua25vd24gcmVhc29uOiAlZFxuIiwKKwkJCXJlYXNvbik7CisJCWJyZWFrOworCX07CisJcmV0dXJuIGRiX3N5bmNfc3Vic2NyaWJlcihzKTsKK30KKworCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9nc21fc3Vic2NyaWJlcl9iYXNlLmMgYi9vcGVuYnNjL3NyYy9nc21fc3Vic2NyaWJlcl9iYXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBjM2JiZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dzbV9zdWJzY3JpYmVyX2Jhc2UuYwpAQCAtMCwwICsxLDIxNCBAQAorLyogVGhlIGNvbmNlcHQgb2YgYSBzdWJzY3JpYmVyIGFzIHNlZW4gYnkgdGhlIEJTQyAqLworCisvKiAoQykgMjAwOCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3BhZ2luZy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKworTExJU1RfSEVBRChhY3RpdmVfc3Vic2NyaWJlcnMpOwordm9pZCAqdGFsbF9zdWJzY3JfY3R4Owordm9pZCAqdGFsbF9zdWJfcmVxX2N0eDsKKworLyogZm9yIHRoZSBnc21fc3Vic2NyaWJlci5jICovCitzdHJ1Y3QgbGxpc3RfaGVhZCAqc3Vic2NyX2JzY19hY3RpdmVfc3Vic2NyaWJlcih2b2lkKQoreworCXJldHVybiAmYWN0aXZlX3N1YnNjcmliZXJzOworfQorCisvKgorICogU3RydWN0IGZvciBwZW5kaW5nIGNoYW5uZWwgcmVxdWVzdHMuIFRoaXMgaXMgbWFuYWdlZCBpbiB0aGUKKyAqIGxsaXN0X2hlYWQgcmVxdWVzdHMgb2YgZWFjaCBzdWJzY3JpYmVyLiBUaGUgcmVmZXJlbmNlIGNvdW50aW5nCisgKiBzaG91bGQgd29yayBpbiBzdWNoIGEgd2F5IHRoYXQgYSBzdWJzY3JpYmVyIHdpdGggYSBwZW5kaW5nIHJlcXVlc3QKKyAqIHJlbWFpbnMgaW4gbWVtb3J5LgorICovCitzdHJ1Y3Qgc3Vic2NyX3JlcXVlc3QgeworCXN0cnVjdCBsbGlzdF9oZWFkIGVudHJ5OworCisJLyogYmFjayByZWZlcmVuY2UgKi8KKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKworCS8qIHRoZSByZXF1ZXN0ZWQgY2hhbm5lbCB0eXBlICovCisJaW50IGNoYW5uZWxfdHlwZTsKKworCS8qIHRoZSBjYWxsYmFjayBkYXRhICovCisJZ3NtX2NiZm4gKmNiZm47CisJdm9pZCAqcGFyYW07Cit9OworCisvKgorICogV2UgZ290IHRoZSBjaGFubmVsIGFzc2lnbmVkIGFuZCBjYW4gbm93IGhhbmQgdGhpcyBjaGFubmVsCisgKiBvdmVyIHRvIG9uZSBvZiBvdXIgY2FsbGJhY2tzLgorICovCitzdGF0aWMgaW50IHN1YnNjcl9wYWdpbmdfY2IodW5zaWduZWQgaW50IGhvb2tudW0sIHVuc2lnbmVkIGludCBldmVudCwKKwkJCSAgICAgc3RydWN0IG1zZ2IgKm1zZywgdm9pZCAqZGF0YSwgdm9pZCAqcGFyYW0pCit7CisJc3RydWN0IHN1YnNjcl9yZXF1ZXN0ICpyZXF1ZXN0OworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqKXBhcmFtOworCisJLyogVGhlcmUgaXMgbm8gcmVxdWVzdCBhbnltb3JlLi4uICovCisJaWYgKGxsaXN0X2VtcHR5KCZzdWJzY3ItPnJlcXVlc3RzKSkKKwkJcmV0dXJuIC0xOworCisJLyoKKwkgKiBGSVhNRTogV2hhdCB0byBkbyB3aXRoIHBhZ2luZyByZXF1ZXN0cyBjb21pbmcgZHVyaW5nCisJICogdGhpcyBjYWxsYmFjaz8gV2UgbXVzdCBiZSBzdXJlIHRvIG5vdCBzdGFydCBwYWdpbmcgd2hlbgorCSAqIHdlIGhhdmUgYW4gYWN0aXZlIGNvbm5lY3Rpb24gdG8gYSBzdWJzY3JpYmVyIGFuZCB0byBtYWtlCisJICogdGhlIHN1YnNjcl9wdXRfY2hhbm5lbCB3b3JrIGFzIHJlcXVpcmVkLi4uCisJICovCisJcmVxdWVzdCA9IChzdHJ1Y3Qgc3Vic2NyX3JlcXVlc3QgKilzdWJzY3ItPnJlcXVlc3RzLm5leHQ7CisJbGxpc3RfZGVsKCZyZXF1ZXN0LT5lbnRyeSk7CisJc3Vic2NyLT5pbl9jYWxsYmFjayA9IDE7CisJcmVxdWVzdC0+Y2Jmbihob29rbnVtLCBldmVudCwgbXNnLCBkYXRhLCByZXF1ZXN0LT5wYXJhbSk7CisJc3Vic2NyLT5pbl9jYWxsYmFjayA9IDA7CisKKwl0YWxsb2NfZnJlZShyZXF1ZXN0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3Vic2NyX3NlbmRfcGFnaW5nX3JlcXVlc3Qoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJc3RydWN0IHN1YnNjcl9yZXF1ZXN0ICpyZXF1ZXN0OworCWludCByYzsKKworCWFzc2VydCghbGxpc3RfZW1wdHkoJnN1YnNjci0+cmVxdWVzdHMpKTsKKworCXJlcXVlc3QgPSAoc3RydWN0IHN1YnNjcl9yZXF1ZXN0ICopc3Vic2NyLT5yZXF1ZXN0cy5uZXh0OworCXJjID0gcGFnaW5nX3JlcXVlc3Qoc3Vic2NyLT5uZXQsIHN1YnNjciwgcmVxdWVzdC0+Y2hhbm5lbF90eXBlLAorCQkJICAgIHN1YnNjcl9wYWdpbmdfY2IsIHN1YnNjcik7CisKKwkvKiBwYWdpbmcgZmFpbGVkLCBxdWl0IG5vdyAqLworCWlmIChyYyA8PSAwKSB7CisJCXN1YnNjcl9wYWdpbmdfY2IoR1NNX0hPT0tfUlJfUEFHSU5HLCBHU01fUEFHSU5HX0VYUElSRUQsCisJCQkJIE5VTEwsIE5VTEwsIHJlcXVlc3QtPnBhcmFtKTsKKwl9Cit9CisKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX2FsbG9jKHZvaWQpCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzOworCisJcyA9IHRhbGxvY196ZXJvKHRhbGxfc3Vic2NyX2N0eCwgc3RydWN0IGdzbV9zdWJzY3JpYmVyKTsKKwlpZiAoIXMpCisJCXJldHVybiBOVUxMOworCisJbGxpc3RfYWRkX3RhaWwoJnMtPmVudHJ5LCAmYWN0aXZlX3N1YnNjcmliZXJzKTsKKwlzLT51c2VfY291bnQgPSAxOworCXMtPnRtc2kgPSBHU01fUkVTRVJWRURfVE1TSTsKKworCUlOSVRfTExJU1RfSEVBRCgmcy0+cmVxdWVzdHMpOworCisJcmV0dXJuIHM7Cit9CisKK3N0YXRpYyB2b2lkIHN1YnNjcl9mcmVlKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCWxsaXN0X2RlbCgmc3Vic2NyLT5lbnRyeSk7CisJdGFsbG9jX2ZyZWUoc3Vic2NyKTsKK30KKworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfZ2V0KHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCXN1YnNjci0+dXNlX2NvdW50Kys7CisJREVCVUdQKERSRUYsICJzdWJzY3IgJXMgdXNhZ2UgaW5jcmVhc2VzIHVzYWdlIHRvOiAlZFxuIiwKKwkJCXN1YnNjci0+ZXh0ZW5zaW9uLCBzdWJzY3ItPnVzZV9jb3VudCk7CisJcmV0dXJuIHN1YnNjcjsKK30KKworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfcHV0KHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCXN1YnNjci0+dXNlX2NvdW50LS07CisJREVCVUdQKERSRUYsICJzdWJzY3IgJXMgdXNhZ2UgZGVjcmVhc2VkIHVzYWdlIHRvOiAlZFxuIiwKKwkJCXN1YnNjci0+ZXh0ZW5zaW9uLCBzdWJzY3ItPnVzZV9jb3VudCk7CisJaWYgKHN1YnNjci0+dXNlX2NvdW50IDw9IDApCisJCXN1YnNjcl9mcmVlKHN1YnNjcik7CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgc3Vic2NyX2dldF9jaGFubmVsKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJaW50IHR5cGUsIGdzbV9jYmZuICpjYmZuLCB2b2lkICpwYXJhbSkKK3sKKwlzdHJ1Y3Qgc3Vic2NyX3JlcXVlc3QgKnJlcXVlc3Q7CisKKwlyZXF1ZXN0ID0gdGFsbG9jKHRhbGxfc3ViX3JlcV9jdHgsIHN0cnVjdCBzdWJzY3JfcmVxdWVzdCk7CisJaWYgKCFyZXF1ZXN0KSB7CisJCWlmIChjYmZuKQorCQkJY2JmbihHU01fSE9PS19SUl9QQUdJTkcsIEdTTV9QQUdJTkdfT09NLAorCQkJCU5VTEwsIE5VTEwsIHBhcmFtKTsKKwkJcmV0dXJuOworCX0KKworCW1lbXNldChyZXF1ZXN0LCAwLCBzaXplb2YoKnJlcXVlc3QpKTsKKwlyZXF1ZXN0LT5zdWJzY3IgPSBzdWJzY3I7CisJcmVxdWVzdC0+Y2hhbm5lbF90eXBlID0gdHlwZTsKKwlyZXF1ZXN0LT5jYmZuID0gY2JmbjsKKwlyZXF1ZXN0LT5wYXJhbSA9IHBhcmFtOworCisJLyoKKwkgKiBGSVhNRTogV2UgbWlnaHQgYmUgYWJsZSB0byBhc3NpZ24gbW9yZSB0aGFuIG9uZQorCSAqIGNoYW5uZWwsIGUuZy4gdm9pY2UgYW5kIFNNUyBzdWJtaXQgYXQgdGhlIHNhbWUKKwkgKiB0aW1lLgorCSAqLworCWlmICghc3Vic2NyLT5pbl9jYWxsYmFjayAmJiBsbGlzdF9lbXB0eSgmc3Vic2NyLT5yZXF1ZXN0cykpIHsKKwkJLyogYWRkIHRvIHRoZSBsaXN0LCBzZW5kIGEgcmVxdWVzdCAqLworCQlsbGlzdF9hZGRfdGFpbCgmcmVxdWVzdC0+ZW50cnksICZzdWJzY3ItPnJlcXVlc3RzKTsKKwkJc3Vic2NyX3NlbmRfcGFnaW5nX3JlcXVlc3Qoc3Vic2NyKTsKKwl9IGVsc2UgeworCQkvKiB0aGlzIHdpbGwgYmUgcGlja2VkIHVwIGxhdGVyLCBmcm9tIHN1YnNjcl9wdXRfY2hhbm5lbCAqLworCQlsbGlzdF9hZGRfdGFpbCgmcmVxdWVzdC0+ZW50cnksICZzdWJzY3ItPnJlcXVlc3RzKTsKKwl9Cit9CisKK3ZvaWQgc3Vic2NyX3B1dF9jaGFubmVsKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uID0gJmxjaGFuLT5jb25uOworCS8qCisJICogRklYTUU6IENvbnRpbnVlIHdpdGggb3RoZXIgcmVxdWVzdHMgbm93Li4uIGJ5IGNoZWNraW5nCisJICogdGhlIGdzbV9zdWJzY3JpYmVyIGluc2lkZSB0aGUgZ3NtX2xjaGFuLiBEcm9wIHRoZSByZWYgY291bnQKKwkgKiBvZiB0aGUgbGNoYW4gYWZ0ZXIgaGF2aW5nIGFza2VkIHRoZSBuZXh0IHJlcXVlc3RlZSB0byBoYW5kbGUKKwkgKiB0aGUgY2hhbm5lbC4KKwkgKi8KKwkvKgorCSAqIEZJWE1FOiBpcyB0aGUgbGNoYW4gaXMgb2YgYSBkaWZmZXJlbnQgdHlwZSB3ZSBjb3VsZCBzdGlsbAorCSAqIGlzc3VlIGFuIGltbWVkaWF0ZSBhc3NpZ25tZW50IGZvciBhbm90aGVyIGNoYW5uZWwgYW5kIHRoZW4KKwkgKiBjbG9zZSB0aGlzIG9uZS4KKwkgKi8KKwkvKgorCSAqIEN1cnJlbnRseSB3ZSB3aWxsIGRyb3AgdGhlIGxhc3QgcmVmIG9mIHRoZSBsY2hhbiB3aGljaAorCSAqIHdpbGwgcmVzdWx0IGluIGEgY2hhbm5lbCByZWxlYXNlIG9uIFJTTCBhbmQgd2Ugd2lsbCBzdGFydAorCSAqIHRoZSBwYWdpbmcuIFRoaXMgc2hvdWxkIHdvcmsgbW9zdCBvZiB0aGUgdGltZSBhcyB0aGUgTVMKKwkgKiB3aWxsIGxpc3RlbiB0byB0aGUgcGFnaW5nIHJlcXVlc3RzIGJlZm9yZSB3ZSB0aW1lb3V0CisJICovCisKKwlwdXRfc3Vic2NyX2Nvbihjb25uKTsKKworCWlmIChsY2hhbi0+Y29ubi5zdWJzY3IgJiYgIWxsaXN0X2VtcHR5KCZsY2hhbi0+Y29ubi5zdWJzY3ItPnJlcXVlc3RzKSkKKwkJc3Vic2NyX3NlbmRfcGFnaW5nX3JlcXVlc3QobGNoYW4tPmNvbm4uc3Vic2NyKTsKK30KKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvaGFuZG92ZXJfZGVjaXNpb24uYyBiL29wZW5ic2Mvc3JjL2hhbmRvdmVyX2RlY2lzaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZhZmNhNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2hhbmRvdmVyX2RlY2lzaW9uLmMKQEAgLTAsMCArMSwyOTggQEAKKy8qIEhhbmRvdmVyIERlY2lzaW9uIG1ha2luZyBmb3IgSW50ZXItQlRTIChJbnRyYS1CU0MpIEhhbmRvdmVyLiAgVGhpcworICogb25seSBpbXBsZW1lbnRzIHRoZSBoYW5kb3ZlciBhbGdvcml0aG0vZGVjaXNpb24sIGJ1dCBub3QgZXhlY3V0aW9uCisgKiBvZiBpdCAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWVhc19yZXAuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvaGFuZG92ZXIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc21fdXRpbHMuaD4KKworLyogaXNzdWUgaGFuZG92ZXIgdG8gYSBjZWxsIGlkZW50aWZpZWQgYnkgQVJGQ04gYW5kIEJTSUMgKi8KK3N0YXRpYyBpbnQgaGFuZG92ZXJfdG9fYXJmY25fYnNpYyhzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwKKwkJCQkgIHVfaW50MTZfdCBhcmZjbiwgdV9pbnQ4X3QgYnNpYykKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqbmV3X2J0czsKKworCS8qIHJlc29sdmUgdGhlIGdzbV9idHMgc3RydWN0dXJlIGZvciB0aGUgYmVzdCBuZWlnaGJvciAqLworCW5ld19idHMgPSBnc21fYnRzX25laWdoYm9yKGxjaGFuLT50cy0+dHJ4LT5idHMsIGFyZmNuLCBic2ljKTsKKwlpZiAoIW5ld19idHMpIHsKKwkJTE9HUChESE8sIExPR0xfTk9USUNFLCAidW5hYmxlIHRvIGRldGVybWluZSBuZWlnaGJvciBCVFMgIgorCQkgICAgICJmb3IgQVJGQ04gJXUgQlNJQyAldSA/IT9cbiIsIGFyZmNuLCBic2ljKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogYW5kIGFjdHVhbGx5IHRyeSB0byBoYW5kb3ZlciB0byB0aGF0IGNlbGwgKi8KKwlyZXR1cm4gYnNjX2hhbmRvdmVyX3N0YXJ0KGxjaGFuLCBuZXdfYnRzKTsKK30KKworLyogZGlkIHdlIGdldCBhIFJYTEVWIGZvciBhIGdpdmVuIGNlbGwgaW4gdGhlIGdpdmVuIHJlcG9ydD8gKi8KK3N0YXRpYyBpbnQgcnhsZXZfZm9yX2NlbGxfaW5fcmVwKHN0cnVjdCBnc21fbWVhc19yZXAgKm1yLAorCQkJCSB1X2ludDE2X3QgYXJmY24sIHVfaW50OF90IGJzaWMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbXItPm51bV9jZWxsOyBpKyspIHsKKwkJc3RydWN0IGdzbV9tZWFzX3JlcF9jZWxsICptcmMgPSAmbXItPmNlbGxbaV07CisKKwkJLyogc2VhcmNoIGZvciBtYXRjaGluZyByZXBvcnQgKi8KKwkJaWYgKCEobXJjLT5hcmZjbiA9PSBhcmZjbiAmJiBtcmMtPmJzaWMgPT0gYnNpYykpCisJCQljb250aW51ZTsKKworCQltcmMtPmZsYWdzIHw9IE1SQ19GX1BST0NFU1NFRDsKKwkJcmV0dXJuIG1yYy0+cnhsZXY7CisJfQorCXJldHVybiAtRU5PREVWOworfQorCisvKiBvYnRhaW4gYXZlcmFnZWQgcnhsZXYgZm9yIGdpdmVuIG5laWdoYm9yICovCitzdGF0aWMgaW50IG5laWdoX21lYXNfYXZnKHN0cnVjdCBuZWlnaF9tZWFzX3Byb2MgKm5tcCwgaW50IHdpbmRvdykKK3sKKwl1bnNpZ25lZCBpbnQgaSwgaWR4OworCWludCBhdmcgPSAwOworCisJaWR4ID0gY2FsY19pbml0aWFsX2lkeChBUlJBWV9TSVpFKG5tcC0+cnhsZXYpLAorCQkJCW5tcC0+cnhsZXZfY250ICUgQVJSQVlfU0laRShubXAtPnJ4bGV2KSwKKwkJCQl3aW5kb3cpOworCisJZm9yIChpID0gMDsgaSA8IHdpbmRvdzsgaSsrKSB7CisJCWludCBqID0gKGlkeCtpKSAlIEFSUkFZX1NJWkUobm1wLT5yeGxldik7CisKKwkJYXZnICs9IG5tcC0+cnhsZXZbal07CisJfQorCisJcmV0dXJuIGF2ZyAvIHdpbmRvdzsKK30KKworLyogZmluZCBlbXB0eSBvciBldmljdCBiYWQgbmVpZ2hib3IgKi8KK3N0YXRpYyBzdHJ1Y3QgbmVpZ2hfbWVhc19wcm9jICpmaW5kX2V2aWN0X25laWdoKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCWludCBqLCB3b3JzdCA9IDk5OTk5OTsKKwlzdHJ1Y3QgbmVpZ2hfbWVhc19wcm9jICpubXBfd29yc3Q7CisKKwkvKiBmaXJzdCB0cnkgdG8gZmluZCBhbiBlbXB0eS91bnVzZWQgc2xvdCAqLworCWZvciAoaiA9IDA7IGogPCBBUlJBWV9TSVpFKGxjaGFuLT5uZWlnaF9tZWFzKTsgaisrKSB7CisJCXN0cnVjdCBuZWlnaF9tZWFzX3Byb2MgKm5tcCA9ICZsY2hhbi0+bmVpZ2hfbWVhc1tqXTsKKwkJaWYgKCFubXAtPmFyZmNuKQorCQkJcmV0dXJuIG5tcDsKKwl9CisKKwkvKiBubyBlbXB0eSBzbG90IGZvdW5kLiBldmljdCB3b3JzdCBuZWlnaGJvciBmcm9tIGxpc3QgKi8KKwlmb3IgKGogPSAwOyBqIDwgQVJSQVlfU0laRShsY2hhbi0+bmVpZ2hfbWVhcyk7IGorKykgeworCQlzdHJ1Y3QgbmVpZ2hfbWVhc19wcm9jICpubXAgPSAmbGNoYW4tPm5laWdoX21lYXNbal07CisJCWludCBhdmcgPSBuZWlnaF9tZWFzX2F2ZyhubXAsIE1BWF9XSU5fTkVJR0hfQVZHKTsKKwkJaWYgKGF2ZyA8IHdvcnN0KSB7CisJCQl3b3JzdCA9IGF2ZzsKKwkJCW5tcF93b3JzdCA9IG5tcDsKKwkJfQorCX0KKworCXJldHVybiBubXBfd29yc3Q7Cit9CisKKy8qIHByb2Nlc3MgbmVpZ2hib3IgY2VsbCBtZWFzdXJlbWVudCByZXBvcnRzICovCitzdGF0aWMgdm9pZCBwcm9jZXNzX21lYXNfbmVpZ2goc3RydWN0IGdzbV9tZWFzX3JlcCAqbXIpCit7CisJaW50IGksIGosIGlkeDsKKworCS8qIGZvciBlYWNoIHJlcG9ydGVkIGNlbGwsIHRyeSB0byB1cGRhdGUgZ2xvYmFsIHN0YXRlICovCisJZm9yIChqID0gMDsgaiA8IEFSUkFZX1NJWkUobXItPmxjaGFuLT5uZWlnaF9tZWFzKTsgaisrKSB7CisJCXN0cnVjdCBuZWlnaF9tZWFzX3Byb2MgKm5tcCA9ICZtci0+bGNoYW4tPm5laWdoX21lYXNbal07CisJCXVuc2lnbmVkIGludCBpZHg7CisJCWludCByeGxldjsKKworCQkvKiBza2lwIHVudXNlZCBlbnRyaWVzICovCisJCWlmICghbm1wLT5hcmZjbikKKwkJCWNvbnRpbnVlOworCisJCXJ4bGV2ID0gcnhsZXZfZm9yX2NlbGxfaW5fcmVwKG1yLCBubXAtPmFyZmNuLCBubXAtPmJzaWMpOworCQlpZHggPSBubXAtPnJ4bGV2X2NudCAlIEFSUkFZX1NJWkUobm1wLT5yeGxldik7CisJCWlmIChyeGxldiA+PSAwKSB7CisJCQlubXAtPnJ4bGV2W2lkeF0gPSByeGxldjsKKwkJCW5tcC0+bGFzdF9zZWVuX25yID0gbXItPm5yOworCQl9IGVsc2UKKwkJCW5tcC0+cnhsZXZbaWR4XSA9IDA7CisJCW5tcC0+cnhsZXZfY250Kys7CisJfQorCisJLyogaXRlcmF0ZSBvdmVyIGxpc3Qgb2YgcmVwb3J0ZWQgY2VsbHMsIGNoZWNrIGlmIHdlIGRpZCBub3QKKwkgKiBwcm9jZXNzIGFsbCBvZiB0aGVtICovCisJZm9yIChpID0gMDsgaSA8IG1yLT5udW1fY2VsbDsgaSsrKSB7CisJCXN0cnVjdCBnc21fbWVhc19yZXBfY2VsbCAqbXJjID0gJm1yLT5jZWxsW2ldOworCQlzdHJ1Y3QgbmVpZ2hfbWVhc19wcm9jICpubXA7CisKKwkJaWYgKG1yYy0+ZmxhZ3MgJiBNUkNfRl9QUk9DRVNTRUQpCisJCQljb250aW51ZTsKKworCQlubXAgPSBmaW5kX2V2aWN0X25laWdoKG1yLT5sY2hhbik7CisKKwkJbm1wLT5hcmZjbiA9IG1yYy0+YXJmY247CisJCW5tcC0+YnNpYyA9IG1yYy0+YnNpYzsKKworCQlpZHggPSBubXAtPnJ4bGV2X2NudCAlIEFSUkFZX1NJWkUobm1wLT5yeGxldik7CisJCW5tcC0+cnhsZXZbaWR4XSA9IG1yYy0+cnhsZXY7CisJCW5tcC0+cnhsZXZfY250Kys7CisJCW5tcC0+bGFzdF9zZWVuX25yID0gbXItPm5yOworCisJCW1yYy0+ZmxhZ3MgfD0gTVJDX0ZfUFJPQ0VTU0VEOworCX0KK30KKworLyogYXR0ZW1wdCB0byBkbyBhIGhhbmRvdmVyICovCitzdGF0aWMgaW50IGF0dGVtcHRfaGFuZG92ZXIoc3RydWN0IGdzbV9tZWFzX3JlcCAqbXIpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBtci0+bGNoYW4tPnRzLT50cngtPmJ0cy0+bmV0d29yazsKKwlzdHJ1Y3QgbmVpZ2hfbWVhc19wcm9jICpiZXN0X2NlbGwgPSBOVUxMOworCXVuc2lnbmVkIGludCBiZXN0X2JldHRlcl9kYiA9IDA7CisJaW50IGksIHJjOworCisJLyogZmluZCB0aGUgYmVzdCBjZWxsIGluIHRoaXMgcmVwb3J0IHRoYXQgaXMgYXQgbGVhc3QgUlhMRVZfSFlTVAorCSAqIGJldHRlciB0aGFuIHRoZSBjdXJyZW50IHNlcnZpbmcgY2VsbCAqLworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobXItPmxjaGFuLT5uZWlnaF9tZWFzKTsgaSsrKSB7CisJCXN0cnVjdCBuZWlnaF9tZWFzX3Byb2MgKm5tcCA9ICZtci0+bGNoYW4tPm5laWdoX21lYXNbaV07CisJCWludCBhdmcsIGJldHRlcjsKKworCQkvKiBza2lwIGVtcHR5IHNsb3RzICovCisJCWlmIChubXAtPmFyZmNuID09IDApCisJCQljb250aW51ZTsKKworCQkvKiBjYWN1bGF0ZSBhdmVyYWdlIHJ4bGV2IGZvciB0aGlzIGNlbGwgb3ZlciB0aGUgd2luZG93ICovCisJCWF2ZyA9IG5laWdoX21lYXNfYXZnKG5tcCwgbmV0LT5oYW5kb3Zlci53aW5fcnhsZXZfYXZnX25laWdoKTsKKworCQkvKiBjaGVjayBpZiBoeXN0ZXJlc2lzIGlzIGZ1bGZpbGxlZCAqLworCQlpZiAoYXZnIDwgbXItPmRsLmZ1bGwucnhfbGV2ICsgbmV0LT5oYW5kb3Zlci5wd3JfaHlzdGVyZXNpcykKKwkJCWNvbnRpbnVlOworCisJCWJldHRlciA9IGF2ZyAtIG1yLT5kbC5mdWxsLnJ4X2xldjsKKwkJaWYgKGJldHRlciA+IGJlc3RfYmV0dGVyX2RiKSB7CisJCQliZXN0X2NlbGwgPSBubXA7CisJCQliZXN0X2JldHRlcl9kYiA9IGJldHRlcjsKKwkJfQorCX0KKworCWlmICghYmVzdF9jZWxsKQorCQlyZXR1cm4gMDsKKworCUxPR1AoREhPLCBMT0dMX0lORk8sICIlczogQ2VsbCBvbiBBUkZDTiAldSBpcyBiZXR0ZXI6ICIsCisJCWdzbV90c19uYW1lKG1yLT5sY2hhbi0+dHMpLCBiZXN0X2NlbGwtPmFyZmNuKTsKKwlpZiAoIW5ldC0+aGFuZG92ZXIuYWN0aXZlKSB7CisJCUxPR1BDKERITywgTE9HTF9JTkZPLCAiU2tpcHBpbmcsIEhhbmRvdmVyIGRpc2FibGVkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmMgPSBoYW5kb3Zlcl90b19hcmZjbl9ic2ljKG1yLT5sY2hhbiwgYmVzdF9jZWxsLT5hcmZjbiwgYmVzdF9jZWxsLT5ic2ljKTsKKwlzd2l0Y2ggKHJjKSB7CisJY2FzZSAwOgorCQlMT0dQQyhESE8sIExPR0xfSU5GTywgIlN0YXJ0aW5nIGhhbmRvdmVyXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAtRU5PU1BDOgorCQlMT0dQQyhESE8sIExPR0xfSU5GTywgIk5vIGNoYW5uZWwgYXZhaWxhYmxlXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAtRUJVU1k6CisJCUxPR1BDKERITywgTE9HTF9JTkZPLCAiSGFuZG92ZXIgYWxyZWFkeSBhY3RpdmVcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQQyhESE8sIExPR0xfRVJST1IsICJVbmtub3duIGVycm9yXG4iKTsKKwl9CisJcmV0dXJuIHJjOworfQorCisvKiBwcm9jZXNzIGFuIGFscmVhZHkgcGFyc2VkIG1lYXN1cmVtZW50IHJlcG9ydCBhbmQgZGVjaWRlIGlmIHdlIHdhbnQgdG8KKyAqIGF0dGVtcHQgYSBoYW5kb3ZlciAqLworc3RhdGljIGludCBwcm9jZXNzX21lYXNfcmVwKHN0cnVjdCBnc21fbWVhc19yZXAgKm1yKQoreworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gbXItPmxjaGFuLT50cy0+dHJ4LT5idHMtPm5ldHdvcms7CisJaW50IGF2X3J4bGV2OworCisJLyogd2UgY3VycmVudGx5IG9ubHkgZG8gaGFuZG92ZXIgZm9yIFRDSCBjaGFubmVscyAqLworCXN3aXRjaCAobXItPmxjaGFuLT50eXBlKSB7CisJY2FzZSBHU01fTENIQU5fVENIX0Y6CisJY2FzZSBHU01fTENIQU5fVENIX0g6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCS8qIHBhcnNlIGFjdHVhbCBuZWlnaGJvciBjZWxsIGluZm8gKi8KKwlpZiAobXItPm51bV9jZWxsID4gMCAmJiBtci0+bnVtX2NlbGwgPCA3KQorCQlwcm9jZXNzX21lYXNfbmVpZ2gobXIpOworCisJYXZfcnhsZXYgPSBnZXRfbWVhc19yZXBfYXZnKG1yLT5sY2hhbiwgTUVBU19SRVBfRExfUlhMRVZfRlVMTCwKKwkJCQkgICAgbmV0LT5oYW5kb3Zlci53aW5fcnhsZXZfYXZnKTsKKworCS8qIEludGVyZmVyZW5jZSBITyAqLworCWlmIChyeGxldjJkYm0oYXZfcnhsZXYpID4gLTg1ICYmCisJICAgIG1lYXNfcmVwX25fb3V0X29mX21fYmUobXItPmxjaGFuLCBNRUFTX1JFUF9ETF9SWFFVQUxfRlVMTCwKKwkJCQkgICAzLCA0LCA1KSkKKwkJcmV0dXJuIGF0dGVtcHRfaGFuZG92ZXIobXIpOworCisJLyogQmFkIFF1YWxpdHkgKi8KKwlpZiAobWVhc19yZXBfbl9vdXRfb2ZfbV9iZShtci0+bGNoYW4sIE1FQVNfUkVQX0RMX1JYUVVBTF9GVUxMLAorCQkJCSAgIDMsIDQsIDUpKQorCQlyZXR1cm4gYXR0ZW1wdF9oYW5kb3Zlcihtcik7CisKKwkvKiBMb3cgTGV2ZWwgKi8KKwlpZiAocnhsZXYyZGJtKGF2X3J4bGV2KSA8PSAtMTEwKQorCQlyZXR1cm4gYXR0ZW1wdF9oYW5kb3Zlcihtcik7CisKKwkvKiBEaXN0YW5jZSAqLworCWlmIChtci0+bXNfbDEudGEgPiBuZXQtPmhhbmRvdmVyLm1heF9kaXN0YW5jZSkKKwkJcmV0dXJuIGF0dGVtcHRfaGFuZG92ZXIobXIpOworCisJLyogUG93ZXIgQnVkZ2V0IEFLQSBCZXR0ZXIgQ2VsbCAqLworCWlmICgobXItPm5yICUgbmV0LT5oYW5kb3Zlci5wd3JfaW50ZXJ2YWwpID09IDApCisJCXJldHVybiBhdHRlbXB0X2hhbmRvdmVyKG1yKTsKKworCXJldHVybiAwOworCit9CisKK3N0YXRpYyBpbnQgaG9fZGVjX3NpZ19jYih1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgc2lnbmFsLAorCQkJICAgdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX21lYXNfcmVwICptcjsKKworCWlmIChzdWJzeXMgIT0gU1NfTENIQU4pCisJCXJldHVybiAwOworCisJc3dpdGNoIChzaWduYWwpIHsKKwljYXNlIFNfTENIQU5fTUVBU19SRVA6CisJCW1yID0gc2lnbmFsX2RhdGE7CisJCXByb2Nlc3NfbWVhc19yZXAobXIpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBvbl9kc29fbG9hZF9ob19kZWModm9pZCkKK3sKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19MQ0hBTiwgaG9fZGVjX3NpZ19jYiwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9oYW5kb3Zlcl9sb2dpYy5jIGIvb3BlbmJzYy9zcmMvaGFuZG92ZXJfbG9naWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmZmZTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvaGFuZG92ZXJfbG9naWMuYwpAQCAtMCwwICsxLDM3OSBAQAorLyogSGFuZG92ZXIgTG9naWMgZm9yIEludGVyLUJUUyAoSW50cmEtQlNDKSBIYW5kb3Zlci4gIFRoaXMgZG9lcyBub3QKKyAqIGFjdHVhbGx5IGltcGxlbWVudCB0aGUgaGFuZG92ZXIgYWxnb3JpdGhtL2RlY2lzaW9uLCBidXQgZXhlY3V0ZXMgYQorICogaGFuZG92ZXIgZGVjaXNpb24gKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtX3V0aWxzLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvY2hhbl9hbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmFuc2FjdGlvbi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcnRwX3Byb3h5Lmg+CisKK3N0cnVjdCBic2NfaGFuZG92ZXIgeworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpvbGRfbGNoYW47CisJc3RydWN0IGdzbV9sY2hhbiAqbmV3X2xjaGFuOworCisJc3RydWN0IHRpbWVyX2xpc3QgVDMxMDM7CisKKwl1X2ludDhfdCBob19yZWY7Cit9OworCitzdGF0aWMgTExJU1RfSEVBRChic2NfaGFuZG92ZXJzKTsKKworc3RhdGljIHN0cnVjdCBic2NfaGFuZG92ZXIgKmJzY19ob19ieV9uZXdfbGNoYW4oc3RydWN0IGdzbV9sY2hhbiAqbmV3X2xjaGFuKQoreworCXN0cnVjdCBic2NfaGFuZG92ZXIgKmhvOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoaG8sICZic2NfaGFuZG92ZXJzLCBsaXN0KSB7CisJCWlmIChoby0+bmV3X2xjaGFuID09IG5ld19sY2hhbikKKwkJCXJldHVybiBobzsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBic2NfaGFuZG92ZXIgKmJzY19ob19ieV9vbGRfbGNoYW4oc3RydWN0IGdzbV9sY2hhbiAqb2xkX2xjaGFuKQoreworCXN0cnVjdCBic2NfaGFuZG92ZXIgKmhvOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoaG8sICZic2NfaGFuZG92ZXJzLCBsaXN0KSB7CisJCWlmIChoby0+b2xkX2xjaGFuID09IG9sZF9sY2hhbikKKwkJCXJldHVybiBobzsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyogSGFuZCBvdmVyIHRoZSBzcGVjaWZpZWQgbG9naWNhbCBjaGFubmVsIHRvIHRoZSBzcGVjaWZpZWQgbmV3IEJUUy4KKyAqIFRoaXMgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSBhY3R1YWwgaGFuZG92ZXIgYWxnb3JpdGhtLAorICogYWZ0ZXIgaXQgaGFzIGRlY2lkZWQgaXQgd2FudHMgdG8gaW5pdGlhdGUgSE8gdG8gYSBzcGVjaWZpYyBCVFMgKi8KK2ludCBic2NfaGFuZG92ZXJfc3RhcnQoc3RydWN0IGdzbV9sY2hhbiAqb2xkX2xjaGFuLCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBnc21fbGNoYW4gKm5ld19sY2hhbjsKKwlzdHJ1Y3QgYnNjX2hhbmRvdmVyICpobzsKKwlzdGF0aWMgdV9pbnQ4X3QgaG9fcmVmOworCWludCByYzsKKworCS8qIGRvbid0IGF0dGVtcHQgbXVsdGlwbGUgaGFuZG92ZXJzIGZvciB0aGUgc2FtZSBsY2hhbiBhdAorCSAqIHRoZSBzYW1lIHRpbWUgKi8KKwlpZiAoYnNjX2hvX2J5X29sZF9sY2hhbihvbGRfbGNoYW4pKQorCQlyZXR1cm4gLUVCVVNZOworCisJREVCVUdQKERITywgIihvbGRfbGNoYW4gb24gQlRTICV1LCBuZXcgQlRTICV1KVxuIiwKKwkJb2xkX2xjaGFuLT50cy0+dHJ4LT5idHMtPm5yLCBidHMtPm5yKTsKKworCWNvdW50ZXJfaW5jKGJ0cy0+bmV0d29yay0+c3RhdHMuaGFuZG92ZXIuYXR0ZW1wdGVkKTsKKworCW5ld19sY2hhbiA9IGxjaGFuX2FsbG9jKGJ0cywgb2xkX2xjaGFuLT50eXBlKTsKKwlpZiAoIW5ld19sY2hhbikgeworCQlMT0dQKERITywgTE9HTF9OT1RJQ0UsICJObyBmcmVlIGNoYW5uZWxcbiIpOworCQljb3VudGVyX2luYyhidHMtPm5ldHdvcmstPnN0YXRzLmhhbmRvdmVyLm5vX2NoYW5uZWwpOworCQlyZXR1cm4gLUVOT1NQQzsKKwl9CisKKwlobyA9IHRhbGxvY196ZXJvKE5VTEwsIHN0cnVjdCBic2NfaGFuZG92ZXIpOworCWlmICghaG8pIHsKKwkJTE9HUChESE8sIExPR0xfRkFUQUwsICJPdXQgb2YgTWVtb3J5XG4iKTsKKwkJbGNoYW5fZnJlZShuZXdfbGNoYW4pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaG8tPm9sZF9sY2hhbiA9IG9sZF9sY2hhbjsKKwloby0+bmV3X2xjaGFuID0gbmV3X2xjaGFuOworCWhvLT5ob19yZWYgPSBob19yZWYrKzsKKworCS8qIGNvcHkgc29tZSBwYXJhbWV0ZXJzIGZyb20gb2xkIGxjaGFuICovCisJbWVtY3B5KCZuZXdfbGNoYW4tPmVuY3IsICZvbGRfbGNoYW4tPmVuY3IsIHNpemVvZihuZXdfbGNoYW4tPmVuY3IpKTsKKwluZXdfbGNoYW4tPm1zX3Bvd2VyID0gb2xkX2xjaGFuLT5tc19wb3dlcjsKKwluZXdfbGNoYW4tPmJzX3Bvd2VyID0gb2xkX2xjaGFuLT5ic19wb3dlcjsKKwluZXdfbGNoYW4tPnJzbF9jbW9kZSA9IG9sZF9sY2hhbi0+cnNsX2Ntb2RlOworCW5ld19sY2hhbi0+dGNoX21vZGUgPSBvbGRfbGNoYW4tPnRjaF9tb2RlOworCW5ld19sY2hhbi0+Y29ubi5zdWJzY3IgPSBzdWJzY3JfZ2V0KG9sZF9sY2hhbi0+Y29ubi5zdWJzY3IpOworCisJLyogRklYTUU6IGRvIHdlIGhhdmUgYSBiZXR0ZXIgaWRlYSBvZiB0aGUgdGltaW5nIGFkdmFuY2U/ICovCisJcmMgPSByc2xfY2hhbl9hY3RpdmF0ZV9sY2hhbihuZXdfbGNoYW4sIFJTTF9BQ1RfSU5URVJfQVNZTkMsIDAsCisJCQkJICAgICBoby0+aG9fcmVmKTsKKwlpZiAocmMgPCAwKSB7CisJCUxPR1AoREhPLCBMT0dMX0VSUk9SLCAiY291bGQgbm90IGFjdGl2YXRlIGNoYW5uZWxcbiIpOworCQl0YWxsb2NfZnJlZShobyk7CisJCWxjaGFuX2ZyZWUobmV3X2xjaGFuKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJzbF9sY2hhbl9zZXRfc3RhdGUobmV3X2xjaGFuLCBMQ0hBTl9TX0FDVF9SRVEpOworCWxsaXN0X2FkZCgmaG8tPmxpc3QsICZic2NfaGFuZG92ZXJzKTsKKwkvKiB3ZSBjb250aW51ZSBpbiB0aGUgU1NfTENIQU4gaGFuZGxlciAvIGhvX2NoYW5fYWN0aXZfYWNrICovCisKKwlyZXR1cm4gMDsKK30KKworLyogVDMxMDMgZXhwaXJlZDogSGFuZG92ZXIgaGFzIGZhaWxlZCB3aXRob3V0IEhPIENPTVBMRVRFIG9yIEhPIEZBSUwgKi8KK3N0YXRpYyB2b2lkIGhvX1QzMTAzX2NiKHZvaWQgKl9obykKK3sKKwlzdHJ1Y3QgYnNjX2hhbmRvdmVyICpobyA9IF9obzsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGhvLT5uZXdfbGNoYW4tPnRzLT50cngtPmJ0cy0+bmV0d29yazsKKworCURFQlVHUChESE8sICJITyBUMzEwMyBleHBpcmVkXG4iKTsKKwljb3VudGVyX2luYyhuZXQtPnN0YXRzLmhhbmRvdmVyLnRpbWVvdXQpOworCisJbGNoYW5fZnJlZShoby0+bmV3X2xjaGFuKTsKKwlsbGlzdF9kZWwoJmhvLT5saXN0KTsKKwl0YWxsb2NfZnJlZShobyk7Cit9CisKKy8qIFJTTCBoYXMgYWNrbm93bGVkZ2VkIGFjdGl2YXRpb24gb2YgdGhlIG5ldyBsY2hhbiAqLworc3RhdGljIGludCBob19jaGFuX2FjdGl2X2FjayhzdHJ1Y3QgZ3NtX2xjaGFuICpuZXdfbGNoYW4pCit7CisJc3RydWN0IGJzY19oYW5kb3ZlciAqaG87CisJaW50IHJjOworCisJLyogd2UgbmVlZCB0byBjaGVjayBpZiB0aGlzIGNoYW5uZWwgYWN0aXZhdGlvbiBpcyByZWxhdGVkIHRvCisJICogYSBoYW5kb3ZlciBhdCBhbGwgKGFuZCBpZiwgd2hpY2ggcGFydGljdWxhciBoYW5kb3ZlcikgKi8KKwlobyA9IGJzY19ob19ieV9uZXdfbGNoYW4obmV3X2xjaGFuKTsKKwlpZiAoIWhvKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCURFQlVHUChESE8sICJoYW5kb3ZlciBhY3RpdmF0ZSBhY2ssIHNlbmQgSE8gQ29tbWFuZFxuIik7CisKKwkvKiB3ZSBjYW4gbm93IHNlbmQgdGhlIDA0LjA4IEhBTkRPVkVSIENPTU1BTkQgdG8gdGhlIE1TCisJICogdXNpbmcgdGhlIG9sZCBsY2hhbiAqLworCisJcmMgPSBnc200OF9zZW5kX2hvX2NtZChoby0+b2xkX2xjaGFuLCBuZXdfbGNoYW4sIDAsIGhvLT5ob19yZWYpOworCisJLyogc3RhcnQgVDMxMDMuICBXZSBjYW4gY29udGludWUgZWl0aGVyIHdpdGggVDMxMDMgZXhwaXJhdGlvbiwKKwkgKiAwNC4wOCBIQU5ET1ZFUiBDT01QTEVURSBvciAwNC4wOCBIQU5ET1ZFUiBGQUlMICovCisJaG8tPlQzMTAzLmNiID0gaG9fVDMxMDNfY2I7CisJaG8tPlQzMTAzLmRhdGEgPSBobzsKKwlic2Nfc2NoZWR1bGVfdGltZXIoJmhvLT5UMzEwMywgMTAsIDApOworCisJLyogY3JlYXRlIGEgUlRQIGNvbm5lY3Rpb24gKi8KKwlpZiAoaXNfaXBhY2Nlc3NfYnRzKG5ld19sY2hhbi0+dHMtPnRyeC0+YnRzKSkKKwkJcnNsX2lwYWNjX2NyY3gobmV3X2xjaGFuKTsKKworCXJldHVybiAwOworfQorCisvKiBSU0wgaGFzIG5vdCBhY2tub3dsZWRnZWQgYWN0aXZhdGlvbiBvZiB0aGUgbmV3IGxjaGFuICovCitzdGF0aWMgaW50IGhvX2NoYW5fYWN0aXZfbmFjayhzdHJ1Y3QgZ3NtX2xjaGFuICpuZXdfbGNoYW4pCit7CisJc3RydWN0IGJzY19oYW5kb3ZlciAqaG87CisKKwlobyA9IGJzY19ob19ieV9uZXdfbGNoYW4obmV3X2xjaGFuKTsKKwlpZiAoIWhvKSB7CisJCUxPR1AoREhPLCBMT0dMX0VSUk9SLCAidW5hYmxlIHRvIGZpbmQgSE8gcmVjb3JkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJbGxpc3RfZGVsKCZoby0+bGlzdCk7CisJdGFsbG9jX2ZyZWUoaG8pOworCisJLyogRklYTUU6IG1heWJlIHdlIHNob3VsZCB0cnkgdG8gYWxsb2NhdGUgYSBuZXcgTENIQU4gaGVyZT8gKi8KKworCXJldHVybiAwOworfQorCisvKiBHU00gMDQuMDggSEFORE9WRVIgQ09NUExFVEUgaGFzIGJlZW4gcmVjZWl2ZWQgb24gbmV3IGNoYW5uZWwgKi8KK3N0YXRpYyBpbnQgaG9fZ3NtNDhfaG9fY29tcGwoc3RydWN0IGdzbV9sY2hhbiAqbmV3X2xjaGFuKQoreworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gbmV3X2xjaGFuLT50cy0+dHJ4LT5idHMtPm5ldHdvcms7CisJc3RydWN0IGJzY19oYW5kb3ZlciAqaG87CisKKwlobyA9IGJzY19ob19ieV9uZXdfbGNoYW4obmV3X2xjaGFuKTsKKwlpZiAoIWhvKSB7CisJCUxPR1AoREhPLCBMT0dMX0VSUk9SLCAidW5hYmxlIHRvIGZpbmQgSE8gcmVjb3JkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJTE9HUChESE8sIExPR0xfSU5GTywgIlN1YnNjcmliZXIgJXMgSE8gZnJvbSBCVFMgJXUtPiV1IG9uIEFSRkNOICIKKwkgICAgICIldS0+JXVcbiIsIHN1YnNjcl9uYW1lKGhvLT5vbGRfbGNoYW4tPmNvbm4uc3Vic2NyKSwKKwkgICAgIGhvLT5vbGRfbGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsIG5ld19sY2hhbi0+dHMtPnRyeC0+YnRzLT5uciwKKwkgICAgIGhvLT5vbGRfbGNoYW4tPnRzLT50cngtPmFyZmNuLCBuZXdfbGNoYW4tPnRzLT50cngtPmFyZmNuKTsKKworCWNvdW50ZXJfaW5jKG5ldC0+c3RhdHMuaGFuZG92ZXIuY29tcGxldGVkKTsKKworCWJzY19kZWxfdGltZXIoJmhvLT5UMzEwMyk7CisKKwkvKiB1cGRhdGUgbGNoYW4gcG9pbnRlciBvZiB0cmFuc2FjdGlvbiAqLworCXRyYW5zX2xjaGFuX2NoYW5nZSgmaG8tPm9sZF9sY2hhbi0+Y29ubiwgJm5ld19sY2hhbi0+Y29ubik7CisKKwlyc2xfbGNoYW5fc2V0X3N0YXRlKGhvLT5vbGRfbGNoYW4sIExDSEFOX1NfSU5BQ1RJVkUpOworCWxjaGFuX2F1dG9fcmVsZWFzZShoby0+b2xkX2xjaGFuKTsKKworCS8qIGRvIHNvbWV0aGluZyB0byByZS1yb3V0ZSB0aGUgYWN0dWFsIHNwZWVjaCBmcmFtZXMgISAqLworCisJbGxpc3RfZGVsKCZoby0+bGlzdCk7CisJdGFsbG9jX2ZyZWUoaG8pOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEdTTSAwNC4wOCBIQU5ET1ZFUiBGQUlMIGhhcyBiZWVuIHJlY2VpdmVkICovCitzdGF0aWMgaW50IGhvX2dzbTQ4X2hvX2ZhaWwoc3RydWN0IGdzbV9sY2hhbiAqb2xkX2xjaGFuKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uOworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gb2xkX2xjaGFuLT50cy0+dHJ4LT5idHMtPm5ldHdvcms7CisJc3RydWN0IGJzY19oYW5kb3ZlciAqaG87CisKKwlobyA9IGJzY19ob19ieV9vbGRfbGNoYW4ob2xkX2xjaGFuKTsKKwlpZiAoIWhvKSB7CisJCUxPR1AoREhPLCBMT0dMX0VSUk9SLCAidW5hYmxlIHRvIGZpbmQgSE8gcmVjb3JkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJY291bnRlcl9pbmMobmV0LT5zdGF0cy5oYW5kb3Zlci5mYWlsZWQpOworCisJYnNjX2RlbF90aW1lcigmaG8tPlQzMTAzKTsKKwlsbGlzdF9kZWwoJmhvLT5saXN0KTsKKwljb25uID0gJmhvLT5uZXdfbGNoYW4tPmNvbm47CisJcHV0X3N1YnNjcl9jb24oY29ubik7CisJdGFsbG9jX2ZyZWUoaG8pOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEdTTSAwOC41OCBIQU5ET1ZFUiBERVRFQ1QgaGFzIGJlZW4gcmVjZWl2ZWQgKi8KK3N0YXRpYyBpbnQgaG9fcnNsX2RldGVjdChzdHJ1Y3QgZ3NtX2xjaGFuICpuZXdfbGNoYW4pCit7CisJc3RydWN0IGJzY19oYW5kb3ZlciAqaG87CisKKwlobyA9IGJzY19ob19ieV9uZXdfbGNoYW4obmV3X2xjaGFuKTsKKwlpZiAoIWhvKSB7CisJCUxPR1AoREhPLCBMT0dMX0VSUk9SLCAidW5hYmxlIHRvIGZpbmQgSE8gcmVjb3JkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogRklYTUU6IGRvIHdlIGFjdHVhbGx5IHdhbnQgdG8gZG8gc29tZXRoaW5nIGhlcmUgPyAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaG9faXBhY19jcmN4X2FjayhzdHJ1Y3QgZ3NtX2xjaGFuICpuZXdfbGNoYW4pCit7CisJc3RydWN0IGJzY19oYW5kb3ZlciAqaG87CisJc3RydWN0IHJ0cF9zb2NrZXQgKm9sZF9ycywgKm5ld19ycywgKm90aGVyX3JzOworCisJaG8gPSBic2NfaG9fYnlfbmV3X2xjaGFuKG5ld19sY2hhbik7CisJaWYgKCFobykgeworCQkvKiBpdCBpcyBwZXJmZWN0bHkgbm9ybWFsLCB3ZSBoYXZlIENSQ1ggZXZlbiBpbiBub24tSE8gY2FzZXMgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGlwYWNjX3J0cF9kaXJlY3QpIHsKKwkJTE9HUChESE8sIExPR0xfRVJST1IsICJ1bmFibGUgdG8gaGFuZG92ZXIgaW4gZGlyZWN0IFJUUCBtb2RlXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogUlRQIFByb3h5IG1vZGUgKi8KKwluZXdfcnMgPSBuZXdfbGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldDsKKwlvbGRfcnMgPSBoby0+b2xkX2xjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQ7CisKKwlpZiAoIW5ld19ycykgeworCQlMT0dQKERITywgTE9HTF9FUlJPUiwgIm5vIFJUUCBzb2NrZXQgZm9yIG5ld19sY2hhblxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXJzbF9pcGFjY19tZGN4X3RvX3J0cHNvY2sobmV3X2xjaGFuKTsKKworCWlmICghb2xkX3JzKSB7CisJCUxPR1AoREhPLCBMT0dMX0VSUk9SLCAibm8gUlRQIHNvY2VrdCBmb3Igb2xkX2xjaGFuXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogY29weSByeF9hY3Rpb24gYW5kIHJlZmVyZW5jZSB0byBvdGhlciBzb2NrICovCisJbmV3X3JzLT5yeF9hY3Rpb24gPSBvbGRfcnMtPnJ4X2FjdGlvbjsKKwluZXdfcnMtPnR4X2FjdGlvbiA9IG9sZF9ycy0+dHhfYWN0aW9uOworCW5ld19ycy0+dHJhbnNtaXQgPSBvbGRfcnMtPnRyYW5zbWl0OworCisJc3dpdGNoIChoby0+b2xkX2xjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQtPnJ4X2FjdGlvbikgeworCWNhc2UgUlRQX1BST1hZOgorCQlvdGhlcl9ycyA9IG9sZF9ycy0+cHJveHkub3RoZXJfc29jazsKKwkJcnRwX3NvY2tldF9wcm94eShuZXdfcnMsIG90aGVyX3JzKTsKKwkJLyogZGVsZXRlIHJlZmVyZW5jZSB0byBvdGhlciBlbmQgc29ja2V0IHRvIHByZXZlbnQKKwkJICogcnRwX3NvY2tldF9mcmVlKCkgZnJvbSByZW1vdmluZyB0aGUgaW52ZXJzZSByZWZlcmVuY2UgKi8KKwkJb2xkX3JzLT5wcm94eS5vdGhlcl9zb2NrID0gTlVMTDsKKwkJYnJlYWs7CisJY2FzZSBSVFBfUkVDVl9VUFNUUkVBTToKKwkJbmV3X3JzLT5yZWNlaXZlID0gb2xkX3JzLT5yZWNlaXZlOworCQlicmVhazsKKwljYXNlIFJUUF9OT05FOgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBob19sb2dpY19zaWdfY2IodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJCSAgIHZvaWQgKmhhbmRsZXJfZGF0YSwgdm9pZCAqc2lnbmFsX2RhdGEpCit7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisKKwlzd2l0Y2ggKHN1YnN5cykgeworCWNhc2UgU1NfTENIQU46CisJCWxjaGFuID0gc2lnbmFsX2RhdGE7CisJCXN3aXRjaCAoc2lnbmFsKSB7CisJCWNhc2UgU19MQ0hBTl9BQ1RJVkFURV9BQ0s6CisJCQlyZXR1cm4gaG9fY2hhbl9hY3Rpdl9hY2sobGNoYW4pOworCQljYXNlIFNfTENIQU5fQUNUSVZBVEVfTkFDSzoKKwkJCXJldHVybiBob19jaGFuX2FjdGl2X25hY2sobGNoYW4pOworCQljYXNlIFNfTENIQU5fSEFORE9WRVJfREVURUNUOgorCQkJcmV0dXJuIGhvX3JzbF9kZXRlY3QobGNoYW4pOworCQljYXNlIFNfTENIQU5fSEFORE9WRVJfQ09NUEw6CisJCQlyZXR1cm4gaG9fZ3NtNDhfaG9fY29tcGwobGNoYW4pOworCQljYXNlIFNfTENIQU5fSEFORE9WRVJfRkFJTDoKKwkJCXJldHVybiBob19nc200OF9ob19mYWlsKGxjaGFuKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNTX0FCSVNJUDoKKwkJbGNoYW4gPSBzaWduYWxfZGF0YTsKKwkJc3dpdGNoIChzaWduYWwpIHsKKwkJY2FzZSBTX0FCSVNJUF9DUkNYX0FDSzoKKwkJCXJldHVybiBob19pcGFjX2NyY3hfYWNrKGxjaGFuKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKSB2b2lkIG9uX2Rzb19sb2FkX2hvX2xvZ2ljKHZvaWQpCit7CisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfTENIQU4sIGhvX2xvZ2ljX3NpZ19jYiwgTlVMTCk7CisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfQUJJU0lQLCBob19sb2dpY19zaWdfY2IsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvaW5wdXQvaXBhY2Nlc3MuYyBiL29wZW5ic2Mvc3JjL2lucHV0L2lwYWNjZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIxY2FkZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2lucHV0L2lwYWNjZXNzLmMKQEAgLTAsMCArMSw3NzggQEAKKy8qIE9wZW5CU0MgQWJpcyBpbnB1dCBkcml2ZXIgZm9yIGlwLmFjY2VzcyAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKKyAqIChDKSAyMDEwIGJ5IE9uLVdhdmVzCisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy9mY250bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3N1YmNoYW5fZGVtdXguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2UxX2lucHV0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9pcGFjY2Vzcy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCisjZGVmaW5lIFBSSVZfT01MIDEKKyNkZWZpbmUgUFJJVl9SU0wgMgorCisvKiBkYXRhIHN0cnVjdHVyZSBmb3Igb25lIEUxIGludGVyZmFjZSB3aXRoIEEtYmlzICovCitzdHJ1Y3QgaWFfZTFfaGFuZGxlIHsKKwlzdHJ1Y3QgYnNjX2ZkIGxpc3Rlbl9mZDsKKwlzdHJ1Y3QgYnNjX2ZkIHJzbF9saXN0ZW5fZmQ7CisJc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQ7Cit9OworCitzdGF0aWMgc3RydWN0IGlhX2UxX2hhbmRsZSAqZTFoOworCisKKyNkZWZpbmUgVFMxX0FMTE9DX1NJWkUJOTAwCisKK3N0YXRpYyBjb25zdCB1X2ludDhfdCBwb25nW10gPSB7IDAsIDEsIElQQUNfUFJPVE9fSVBBQ0NFU1MsIElQQUNfTVNHVF9QT05HIH07CitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgaWRfYWNrW10gPSB7IDAsIDEsIElQQUNfUFJPVE9fSVBBQ0NFU1MsIElQQUNfTVNHVF9JRF9BQ0sgfTsKK3N0YXRpYyBjb25zdCB1X2ludDhfdCBpZF9yZXFbXSA9IHsgMCwgMTcsIElQQUNfUFJPVE9fSVBBQ0NFU1MsIElQQUNfTVNHVF9JRF9HRVQsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfVU5JVCwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19NQUNBRERSLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX0xPQ0FUSU9OMSwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19MT0NBVElPTjIsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfRVFVSVBWRVJTLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX1NXVkVSU0lPTiwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19VTklUTkFNRSwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19TRVJOUiwKKwkJCQl9OworCitzdGF0aWMgY29uc3QgY2hhciAqaWR0YWdfbmFtZXNbXSA9IHsKKwlbSVBBQ19JRFRBR19TRVJOUl0JPSAiU2VyaWFsX051bWJlciIsCisJW0lQQUNfSURUQUdfVU5JVE5BTUVdCT0gIlVuaXRfTmFtZSIsCisJW0lQQUNfSURUQUdfTE9DQVRJT04xXQk9ICJMb2NhdGlvbl8xIiwKKwlbSVBBQ19JRFRBR19MT0NBVElPTjJdCT0gIkxvY2F0aW9uXzIiLAorCVtJUEFDX0lEVEFHX0VRVUlQVkVSU10JPSAiRXF1aXBtZW50X1ZlcnNpb24iLAorCVtJUEFDX0lEVEFHX1NXVkVSU0lPTl0JPSAiU29mdHdhcmVfVmVyc2lvbiIsCisJW0lQQUNfSURUQUdfSVBBRERSXQk9ICJJUF9BZGRyZXNzIiwKKwlbSVBBQ19JRFRBR19NQUNBRERSXQk9ICJNQUNfQWRkcmVzcyIsCisJW0lQQUNfSURUQUdfVU5JVF0JPSAiVW5pdF9JRCIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqaXBhY19pZHRhZ19uYW1lKGludCB0YWcpCit7CisJaWYgKHRhZyA+PSBBUlJBWV9TSVpFKGlkdGFnX25hbWVzKSkKKwkJcmV0dXJuICJ1bmtub3duIjsKKworCXJldHVybiBpZHRhZ19uYW1lc1t0YWddOworfQorCitpbnQgaXBhY2Nlc3NfaWR0YWdfcGFyc2Uoc3RydWN0IHRsdl9wYXJzZWQgKmRlYywgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCXVfaW50OF90IHRfbGVuOworCXVfaW50OF90IHRfdGFnOworCXVfaW50OF90ICpjdXIgPSBidWY7CisKKwl3aGlsZSAoY3VyIDwgYnVmICsgbGVuKSB7CisJCXRfbGVuID0gKmN1cisrOworCQl0X3RhZyA9ICpjdXIrKzsKKworCQlERUJVR1BDKERNSSwgIiVzPSclcycgIiwgaXBhY19pZHRhZ19uYW1lKHRfdGFnKSwgY3VyKTsKKworCQlkZWMtPmx2W3RfdGFnXS5sZW4gPSB0X2xlbjsKKwkJZGVjLT5sdlt0X3RhZ10udmFsID0gY3VyOworCisJCWN1ciArPSB0X2xlbjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBnc21fYnRzICpmaW5kX2J0c19ieV91bml0aWQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJICAgdV9pbnQxNl90IHNpdGVfaWQsIHVfaW50MTZfdCBidHNfaWQpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ0cywgJm5ldC0+YnRzX2xpc3QsIGxpc3QpIHsKKworCQlpZiAoIWlzX2lwYWNjZXNzX2J0cyhidHMpKQorCQkJY29udGludWU7CisKKwkJaWYgKGJ0cy0+aXBfYWNjZXNzLnNpdGVfaWQgPT0gc2l0ZV9pZCAmJgorCQkgICAgYnRzLT5pcF9hY2Nlc3MuYnRzX2lkID09IGJ0c19pZCkKKwkJCXJldHVybiBidHM7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfdW5pdGlkKGNvbnN0IGNoYXIgKnN0ciwgdV9pbnQxNl90ICpzaXRlX2lkLCB1X2ludDE2X3QgKmJ0c19pZCwKKwkJCXVfaW50MTZfdCAqdHJ4X2lkKQoreworCXVuc2lnbmVkIGxvbmcgdWw7CisJY2hhciAqZW5kcHRyOworCWNvbnN0IGNoYXIgKm5wdHI7CisKKwlucHRyID0gc3RyOworCXVsID0gc3RydG91bChucHRyLCAmZW5kcHRyLCAxMCk7CisJaWYgKGVuZHB0ciA8PSBucHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoc2l0ZV9pZCkKKwkJKnNpdGVfaWQgPSB1bCAmIDB4ZmZmZjsKKworCWlmICgqZW5kcHRyKysgIT0gJy8nKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW5wdHIgPSBlbmRwdHI7CisJdWwgPSBzdHJ0b3VsKG5wdHIsICZlbmRwdHIsIDEwKTsKKwlpZiAoZW5kcHRyIDw9IG5wdHIpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChidHNfaWQpCisJCSpidHNfaWQgPSB1bCAmIDB4ZmZmZjsKKworCWlmICgqZW5kcHRyKysgIT0gJy8nKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkKKwlucHRyID0gZW5kcHRyOworCXVsID0gc3RydG91bChucHRyLCAmZW5kcHRyLCAxMCk7CisJaWYgKGVuZHB0ciA8PSBucHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodHJ4X2lkKQorCQkqdHJ4X2lkID0gdWwgJiAweGZmZmY7CisKKwlyZXR1cm4gMDsKK30KKworLyogc2VuZCB0aGUgaWQgYWNrICovCitpbnQgaXBhY2Nlc3Nfc2VuZF9pZF9hY2soaW50IGZkKQoreworCXJldHVybiB3cml0ZShmZCwgaWRfYWNrLCBzaXplb2YoaWRfYWNrKSk7Cit9CisKK2ludCBpcGFjY2Vzc19zZW5kX2lkX3JlcShpbnQgZmQpCit7CisJcmV0dXJuIHdyaXRlKGZkLCBpZF9yZXEsIHNpemVvZihpZF9yZXEpKTsKK30KKworLyogYmFzZSBoYW5kbGluZyBvZiB0aGUgaXAuYWNjZXNzIHByb3RvY29sICovCitpbnQgaXBhY2Nlc3NfcmN2bXNnX2Jhc2Uoc3RydWN0IG1zZ2IgKm1zZywKKwkJCSBzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJdV9pbnQ4X3QgbXNnX3R5cGUgPSAqKG1zZy0+bDJoKTsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAobXNnX3R5cGUpIHsKKwljYXNlIElQQUNfTVNHVF9QSU5HOgorCQlyZXQgPSB3cml0ZShiZmQtPmZkLCBwb25nLCBzaXplb2YocG9uZykpOworCQlicmVhazsKKwljYXNlIElQQUNfTVNHVF9QT05HOgorCQlERUJVR1AoRE1JLCAiUE9ORyFcbiIpOworCQlicmVhazsKKwljYXNlIElQQUNfTVNHVF9JRF9BQ0s6CisJCURFQlVHUChETUksICJJRF9BQ0s/IC0+IEFDSyFcbiIpOworCQlyZXQgPSBpcGFjY2Vzc19zZW5kX2lkX2FjayhiZmQtPmZkKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwYWNjZXNzX3Jjdm1zZyhzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSwgc3RydWN0IG1zZ2IgKm1zZywKKwkJCSAgIHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0bHZwOworCXVfaW50OF90IG1zZ190eXBlID0gKihtc2ctPmwyaCk7CisJdV9pbnQxNl90IHNpdGVfaWQgPSAwLCBidHNfaWQgPSAwLCB0cnhfaWQgPSAwOworCXN0cnVjdCBnc21fYnRzICpidHM7CisKKwkvKiBoYW5kbGUgYmFzZSBtZXNzYWdlcyAqLworCWlwYWNjZXNzX3Jjdm1zZ19iYXNlKG1zZywgYmZkKTsKKworCXN3aXRjaCAobXNnX3R5cGUpIHsKKwljYXNlIElQQUNfTVNHVF9JRF9SRVNQOgorCQlERUJVR1AoRE1JLCAiSURfUkVTUCAiKTsKKwkJLyogcGFyc2UgdGFncywgc2VhcmNoIGZvciBVbml0IElEICovCisJCWlwYWNjZXNzX2lkdGFnX3BhcnNlKCZ0bHZwLCAodV9pbnQ4X3QgKiltc2ctPmwyaCArIDIsCisJCQkJIG1zZ2JfbDJsZW4obXNnKS0yKTsKKwkJREVCVUdQKERNSSwgIlxuIik7CisKKwkJaWYgKCFUTFZQX1BSRVNFTlQoJnRsdnAsIElQQUNfSURUQUdfVU5JVCkpCisJCQlicmVhazsKKworCQkvKiBsb29rdXAgQlRTLCBjcmVhdGUgc2lnbl9saW5rLCAuLi4gKi8KKwkJcGFyc2VfdW5pdGlkKChjaGFyICopVExWUF9WQUwoJnRsdnAsIElQQUNfSURUQUdfVU5JVCksCisJCQkgICAgICZzaXRlX2lkLCAmYnRzX2lkLCAmdHJ4X2lkKTsKKwkJYnRzID0gZmluZF9idHNfYnlfdW5pdGlkKGUxaC0+Z3NtbmV0LCBzaXRlX2lkLCBidHNfaWQpOworCQlpZiAoIWJ0cykgeworCQkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiVW5hYmxlIHRvIGZpbmQgQlRTIGNvbmZpZ3VyYXRpb24gZm9yICIKKwkJCSAgICAgICAiICV1LyV1LyV1LCBkaXNjb25uZWN0aW5nXG4iLCBzaXRlX2lkLCBidHNfaWQsCisJCQkJdHJ4X2lkKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCURFQlVHUChESU5QLCAiSWRlbnRpZmllZCBCVFMgJXUvJXUvJXVcbiIsIHNpdGVfaWQsIGJ0c19pZCwgdHJ4X2lkKTsKKwkJaWYgKGJmZC0+cHJpdl9uciA9PSBQUklWX09NTCkgeworCQkJLyogZHJvcCBhbnkgb2xkIG9tbCBjb25uZWN0aW9uICovCisJCQlpcGFjY2Vzc19kcm9wX29tbChidHMpOworCQkJYnRzLT5vbWxfbGluayA9IGUxaW5wX3NpZ25fbGlua19jcmVhdGUoJmxpbmUtPnRzW1BSSVZfT01MIC0gMV0sCisJCQkJCQkgIEUxSU5QX1NJR05fT01MLCBidHMtPmMwLAorCQkJCQkJICBidHMtPm9tbF90ZWksIDApOworCQl9IGVsc2UgaWYgKGJmZC0+cHJpdl9uciA9PSBQUklWX1JTTCkgeworCQkJc3RydWN0IGUxaW5wX3RzICplMWlfdHM7CisJCQlzdHJ1Y3QgYnNjX2ZkICpuZXdiZmQ7CisJCQlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIHRyeF9pZCk7CisKKwkJCS8qIGRyb3AgYW55IG9sZCByc2wgY29ubmVjdGlvbiAqLworCQkJaXBhY2Nlc3NfZHJvcF9yc2wodHJ4KTsKKworCQkJaWYgKCFidHMtPm9tbF9saW5rKSB7CisJCQkJYnNjX3VucmVnaXN0ZXJfZmQoYmZkKTsKKwkJCQljbG9zZShiZmQtPmZkKTsKKwkJCQliZmQtPmZkID0gLTE7CisJCQkJdGFsbG9jX2ZyZWUoYmZkKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJYmZkLT5kYXRhID0gbGluZSA9IGJ0cy0+b21sX2xpbmstPnRzLT5saW5lOworCQkJZTFpX3RzID0gJmxpbmUtPnRzW1BSSVZfUlNMICsgdHJ4X2lkIC0gMV07CisJCQluZXdiZmQgPSAmZTFpX3RzLT5kcml2ZXIuaXBhY2Nlc3MuZmQ7CisJCQllMWlucF90c19jb25maWcoZTFpX3RzLCBsaW5lLCBFMUlOUF9UU19UWVBFX1NJR04pOworCisJCQl0cngtPnJzbF9saW5rID0gZTFpbnBfc2lnbl9saW5rX2NyZWF0ZShlMWlfdHMsCisJCQkJCQkJRTFJTlBfU0lHTl9SU0wsIHRyeCwKKwkJCQkJCQl0cngtPnJzbF90ZWksIDApOworCisJCQkvKiBnZXQgcmlkIG9mIG91ciBvbGQgdGVtcG9yYXJ5IGJmZCAqLworCQkJbWVtY3B5KG5ld2JmZCwgYmZkLCBzaXplb2YoKm5ld2JmZCkpOworCQkJbmV3YmZkLT5wcml2X25yID0gUFJJVl9SU0wgKyB0cnhfaWQ7CisJCQlic2NfdW5yZWdpc3Rlcl9mZChiZmQpOworCQkJYmZkLT5mZCA9IC0xOworCQkJdGFsbG9jX2ZyZWUoYmZkKTsKKwkJCWJzY19yZWdpc3Rlcl9mZChuZXdiZmQpOworCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBPTUxfVVAJCTB4MDAwMQorI2RlZmluZSBSU0xfVVAJCTB4MDAwMgorCisvKgorICogcmVhZCBvbmUgaXBhIG1lc3NhZ2UgZnJvbSB0aGUgc29ja2V0CisgKiByZXR1cm4gTlVMTCBpbiBjYXNlIG9mIGVycm9yCisgKi8KK3N0cnVjdCBtc2diICppcGFjY2Vzc19yZWFkX21zZyhzdHJ1Y3QgYnNjX2ZkICpiZmQsIGludCAqZXJyb3IpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2MoVFMxX0FMTE9DX1NJWkUsICJBYmlzL0lQIik7CisJc3RydWN0IGlwYWNjZXNzX2hlYWQgKmhoOworCWludCBsZW4sIHJldCA9IDA7CisKKwlpZiAoIW1zZykgeworCQkqZXJyb3IgPSAtRU5PTUVNOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBmaXJzdCByZWFkIG91ciAzLWJ5dGUgaGVhZGVyICovCisJaGggPSAoc3RydWN0IGlwYWNjZXNzX2hlYWQgKikgbXNnLT5kYXRhOworCXJldCA9IHJlY3YoYmZkLT5mZCwgbXNnLT5kYXRhLCBzaXplb2YoKmhoKSwgMCk7CisJaWYgKHJldCA9PSAwKSB7CisJCW1zZ2JfZnJlZShtc2cpOworCQkqZXJyb3IgPSByZXQ7CisJCXJldHVybiBOVUxMOworCX0gZWxzZSBpZiAocmV0ICE9IHNpemVvZigqaGgpKSB7CisJCWlmIChlcnJubyAhPSBFQUdBSU4pCisJCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJyZWN2IGVycm9yICVkICVzXG4iLCByZXQsIHN0cmVycm9yKGVycm5vKSk7CisJCW1zZ2JfZnJlZShtc2cpOworCQkqZXJyb3IgPSByZXQ7CisJCXJldHVybiBOVUxMOworCX0KKworCW1zZ2JfcHV0KG1zZywgcmV0KTsKKworCS8qIHRoZW4gcmVhZCB0ZSBsZW5ndGggYXMgc3BlY2lmaWVkIGluIGhlYWRlciAqLworCW1zZy0+bDJoID0gbXNnLT5kYXRhICsgc2l6ZW9mKCpoaCk7CisJbGVuID0gbnRvaHMoaGgtPmxlbik7CisKKwlpZiAobGVuIDwgMCB8fCBUUzFfQUxMT0NfU0laRSA8IGxlbiArIHNpemVvZigqaGgpKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgIkNhbiBub3QgcmVhZCB0aGlzIHBhY2tldC4gJWQgYXZhaWxcbiIsIGxlbik7CisJCW1zZ2JfZnJlZShtc2cpOworCQkqZXJyb3IgPSAtRUlPOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXQgPSByZWN2KGJmZC0+ZmQsIG1zZy0+bDJoLCBsZW4sIDApOworCWlmIChyZXQgPCBsZW4pIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAic2hvcnQgcmVhZCEgR290ICVkIGZyb20gJWRcbiIsIHJldCwgbGVuKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCSplcnJvciA9IC1FSU87CisJCXJldHVybiBOVUxMOworCX0KKwltc2diX3B1dChtc2csIHJldCk7CisKKwlyZXR1cm4gbXNnOworfQorCitpbnQgaXBhY2Nlc3NfZHJvcF9vbWwoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwlzdHJ1Y3QgZTFpbnBfdHMgKnRzOworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lOworCXN0cnVjdCBic2NfZmQgKmJmZDsKKworCWlmICghYnRzIHx8ICFidHMtPm9tbF9saW5rKQorCQlyZXR1cm4gLTE7CisKKwkvKiBzZW5kIE9NTCBkb3duICovCisJdHMgPSBidHMtPm9tbF9saW5rLT50czsKKwlsaW5lID0gdHMtPmxpbmU7CisJZTFpbnBfZXZlbnQodHMsIEVWVF9FMV9URUlfRE4sIGJ0cy0+b21sX2xpbmstPnRlaSwgYnRzLT5vbWxfbGluay0+c2FwaSk7CisKKwliZmQgPSAmdHMtPmRyaXZlci5pcGFjY2Vzcy5mZDsKKwlic2NfdW5yZWdpc3Rlcl9mZChiZmQpOworCWNsb3NlKGJmZC0+ZmQpOworCWJmZC0+ZmQgPSAtMTsKKworCS8qIGNsZWFuIHVwIE9NTCBhbmQgUlNMICovCisJZTFpbnBfc2lnbl9saW5rX2Rlc3Ryb3koYnRzLT5vbWxfbGluayk7CisJYnRzLT5vbWxfbGluayA9IE5VTEw7CisJYnRzLT5pcF9hY2Nlc3MuZmxhZ3MgPSAwOworCisJLyogZHJvcCBhbGwgUlNMIGNvbm5lY3Rpb25zIHRvbyAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyeCwgJmJ0cy0+dHJ4X2xpc3QsIGxpc3QpCisJCWlwYWNjZXNzX2Ryb3BfcnNsKHRyeCk7CisKKwkvKiBraWxsIHRoZSBFMSBsaW5lIG5vdy4uLiBhcyB3ZSBoYXZlIG5vIG9uZSBsZWZ0IHRvIHVzZSBpdCAqLworCXRhbGxvY19mcmVlKGxpbmUpOworCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGlwYWNjZXNzX2Ryb3Aoc3RydWN0IGUxaW5wX3RzICp0cywgc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKmxpbms7CisJaW50IGJ0c19ucjsKKworCWlmICghdHMpIHsKKwkJLyoKKwkJICogSWYgd2UgZG9uJ3QgaGF2ZSBhIFRTIHRoaXMgbWVhbnMgdGhhdCB0aGlzIGlzIGEgUlNMCisJCSAqIGNvbm5lY3Rpb24gYnV0IHdlIGFyZSBub3QgcGFzdCB0aGUgYXV0aGVudGljYXRpb24KKwkJICogaGFuZGxpbmcgeWV0LiBTbyB3ZSBjYW4gc2FmZWx5IGRlbGV0ZSB0aGlzIGJmZCBhbmQKKwkJICogd2FpdCBmb3IgYSByZWNvbm5lY3QuCisJCSAqLworCQlic2NfdW5yZWdpc3Rlcl9mZChiZmQpOworCQljbG9zZShiZmQtPmZkKTsKKwkJYmZkLT5mZCA9IC0xOworCQl0YWxsb2NfZnJlZShiZmQpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogYXR0ZW1wdCB0byBmaW5kIGEgc2lnbmFsbGluZyBsaW5rICovCisJaWYgKHRzLT50eXBlID09IEUxSU5QX1RTX1RZUEVfU0lHTikgeworCQlsbGlzdF9mb3JfZWFjaF9lbnRyeShsaW5rLCAmdHMtPnNpZ24uc2lnbl9saW5rcywgbGlzdCkgeworCQkJYnRzX25yID0gbGluay0+dHJ4LT5idHMtPmJ0c19ucjsKKwkJCS8qIHdlIGhhdmUgaXNzdWVzIGp1c3QgcmVjb25uZWN0aW5nIFJMUyBzbyB3ZSBkcm9wIE9NTCAqLworCQkJaXBhY2Nlc3NfZHJvcF9vbWwobGluay0+dHJ4LT5idHMpOworCQkJcmV0dXJuIGJ0c19ucjsKKwkJfQorCX0KKworCS8qIGVycm9yIGNhc2UgKi8KKwlMT0dQKERJTlAsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gZmluZCBhIHNpZ25hbGxpbmcgbGluayBmb3IgdHM6ICVwXG4iLCB0cyk7CisJYnNjX3VucmVnaXN0ZXJfZmQoYmZkKTsKKwljbG9zZShiZmQtPmZkKTsKKwliZmQtPmZkID0gLTE7CisJcmV0dXJuIC0xOworfQorCitpbnQgaXBhY2Nlc3NfZHJvcF9yc2woc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJc3RydWN0IGJzY19mZCAqYmZkOworCXN0cnVjdCBlMWlucF90cyAqdHM7CisKKwlpZiAoIXRyeCB8fCAhdHJ4LT5yc2xfbGluaykKKwkJcmV0dXJuIC0xOworCisJLyogc2VuZCBSU0wgZG93biAqLworCXRzID0gdHJ4LT5yc2xfbGluay0+dHM7CisJZTFpbnBfZXZlbnQodHMsIEVWVF9FMV9URUlfRE4sIHRyeC0+cnNsX2xpbmstPnRlaSwgdHJ4LT5yc2xfbGluay0+c2FwaSk7CisKKwkvKiBjbG9zZSB0aGUgc29ja2V0ICovCisJYmZkID0gJnRzLT5kcml2ZXIuaXBhY2Nlc3MuZmQ7CisJYnNjX3VucmVnaXN0ZXJfZmQoYmZkKTsKKwljbG9zZShiZmQtPmZkKTsKKwliZmQtPmZkID0gLTE7CisKKwkvKiBkZXN0cm95ICovCisJZTFpbnBfc2lnbl9saW5rX2Rlc3Ryb3kodHJ4LT5yc2xfbGluayk7CisJdHJ4LT5yc2xfbGluayA9IE5VTEw7CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX3RzMV9yZWFkKHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSA9IGJmZC0+ZGF0YTsKKwl1bnNpZ25lZCBpbnQgdHNfbnIgPSBiZmQtPnByaXZfbnI7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHMgPSAmbGluZS0+dHNbdHNfbnItMV07CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqbGluazsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXN0cnVjdCBpcGFjY2Vzc19oZWFkICpoaDsKKwlpbnQgcmV0ID0gMCwgZXJyb3I7CisKKwltc2cgPSBpcGFjY2Vzc19yZWFkX21zZyhiZmQsICZlcnJvcik7CisJaWYgKCFtc2cpIHsKKwkJaWYgKGVycm9yID09IDApIHsKKwkJCWludCByZXQgPSBpcGFjY2Vzc19kcm9wKGUxaV90cywgYmZkKTsKKwkJCWlmIChyZXQgPj0gMCkKKwkJCQlMT0dQKERJTlAsIExPR0xfTk9USUNFLCAiQlRTICV1IGRpc2FwcGVhcmVkLCBkZWFkIHNvY2tldFxuIiwKKwkJCQkJcmV0KTsKKwkJCWVsc2UKKwkJCQlMT0dQKERJTlAsIExPR0xfTk9USUNFLCAidW5rbm93biBCVFMgZGlzYXBwZWFyZWQsIGRlYWQgc29ja2V0XG4iKTsKKwkJfQorCQlyZXR1cm4gZXJyb3I7CisJfQorCisJREVCVUdQKERNSSwgIlJYICV1OiAlc1xuIiwgdHNfbnIsIGhleGR1bXAobXNnYl9sMihtc2cpLCBtc2diX2wybGVuKG1zZykpKTsKKworCWhoID0gKHN0cnVjdCBpcGFjY2Vzc19oZWFkICopIG1zZy0+ZGF0YTsKKwlpZiAoaGgtPnByb3RvID09IElQQUNfUFJPVE9fSVBBQ0NFU1MpIHsKKwkJcmV0ID0gaXBhY2Nlc3NfcmN2bXNnKGxpbmUsIG1zZywgYmZkKTsKKwkJaWYgKHJldCA8IDApCisJCQlpcGFjY2Vzc19kcm9wKGUxaV90cywgYmZkKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCXJldHVybiByZXQ7CisJfQorCS8qIEJJRyBGQVQgV0FSTklORzogYmZkIG1pZ2h0IG5vIGxvbmdlciBleGlzdCBoZXJlLCBzaW5jZSBpcGFjY2Vzc19yY3Ztc2coKQorCSAqIG1pZ2h0IGhhdmUgZnJlZSdkIGl0ICEhISAqLworCisJbGluayA9IGUxaW5wX2xvb2t1cF9zaWduX2xpbmsoZTFpX3RzLCBoaC0+cHJvdG8sIDApOworCWlmICghbGluaykgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJubyBtYXRjaGluZyBzaWduYWxsaW5nIGxpbmsgZm9yICIKKwkJCSJoaC0+cHJvdG89MHglMDJ4XG4iLCBoaC0+cHJvdG8pOworCQltc2diX2ZyZWUobXNnKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCW1zZy0+dHJ4ID0gbGluay0+dHJ4OworCisJc3dpdGNoIChsaW5rLT50eXBlKSB7CisJY2FzZSBFMUlOUF9TSUdOX1JTTDoKKwkJaWYgKCEobXNnLT50cngtPmJ0cy0+aXBfYWNjZXNzLmZsYWdzICYgKFJTTF9VUCA8PCBtc2ctPnRyeC0+bnIpKSkgeworCQkJZTFpbnBfZXZlbnQoZTFpX3RzLCBFVlRfRTFfVEVJX1VQLCBsaW5rLT50ZWksIGxpbmstPnNhcGkpOworCQkJbXNnLT50cngtPmJ0cy0+aXBfYWNjZXNzLmZsYWdzIHw9IChSU0xfVVAgPDwgbXNnLT50cngtPm5yKTsKKwkJfQorCQlyZXQgPSBhYmlzX3JzbF9yY3Ztc2cobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBFMUlOUF9TSUdOX09NTDoKKwkJaWYgKCEobXNnLT50cngtPmJ0cy0+aXBfYWNjZXNzLmZsYWdzICYgT01MX1VQKSkgeworCQkJZTFpbnBfZXZlbnQoZTFpX3RzLCBFVlRfRTFfVEVJX1VQLCBsaW5rLT50ZWksIGxpbmstPnNhcGkpOworCQkJbXNnLT50cngtPmJ0cy0+aXBfYWNjZXNzLmZsYWdzIHw9IE9NTF9VUDsKKwkJfQorCQlyZXQgPSBhYmlzX25tX3Jjdm1zZyhtc2cpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERJTlAsIExPR0xfTk9USUNFLCAiVW5rbm93biBJUC5hY2Nlc3MgcHJvdG9jb2wgcHJvdG89MHglMDJ4XG4iLCBoaC0+cHJvdG8pOworCQltc2diX2ZyZWUobXNnKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgaXBhY2Nlc3NfcHJlcGVuZF9oZWFkZXIoc3RydWN0IG1zZ2IgKm1zZywgaW50IHByb3RvKQoreworCXN0cnVjdCBpcGFjY2Vzc19oZWFkICpoaDsKKworCS8qIHByZXBlbmQgdGhlIGlwLmFjY2VzcyBoZWFkZXIgKi8KKwloaCA9IChzdHJ1Y3QgaXBhY2Nlc3NfaGVhZCAqKSBtc2diX3B1c2gobXNnLCBzaXplb2YoKmhoKSk7CisJaGgtPmxlbiA9IGh0b25zKG1zZy0+bGVuIC0gc2l6ZW9mKCpoaCkpOworCWhoLT5wcm90byA9IHByb3RvOworfQorCitzdGF0aWMgaW50IHRzX3dhbnRfd3JpdGUoc3RydWN0IGUxaW5wX3RzICplMWlfdHMpCit7CisJZTFpX3RzLT5kcml2ZXIuaXBhY2Nlc3MuZmQud2hlbiB8PSBCU0NfRkRfV1JJVEU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdGltZW91dF90czFfd3JpdGUodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cyA9IChzdHJ1Y3QgZTFpbnBfdHMgKilkYXRhOworCisJLyogdHJpZ2dlciB3cml0ZSBvZiB0czEsIGR1ZSB0byB0eCBkZWxheSB0aW1lciAqLworCXRzX3dhbnRfd3JpdGUoZTFpX3RzKTsKK30KKworc3RhdGljIGludCBoYW5kbGVfdHMxX3dyaXRlKHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSA9IGJmZC0+ZGF0YTsKKwl1bnNpZ25lZCBpbnQgdHNfbnIgPSBiZmQtPnByaXZfbnI7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHMgPSAmbGluZS0+dHNbdHNfbnItMV07CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqc2lnbl9saW5rOworCXN0cnVjdCBtc2diICptc2c7CisJdV9pbnQ4X3QgcHJvdG87CisJaW50IHJldDsKKworCWJmZC0+d2hlbiAmPSB+QlNDX0ZEX1dSSVRFOworCisJLyogZ2V0IHRoZSBuZXh0IG1zZyBmb3IgdGhpcyB0aW1lc2xvdCAqLworCW1zZyA9IGUxaW5wX3R4X3RzKGUxaV90cywgJnNpZ25fbGluayk7CisJaWYgKCFtc2cpIHsKKwkJLyogbm8gbWVzc2FnZSBhZnRlciB0eCBkZWxheSB0aW1lciAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlzd2l0Y2ggKHNpZ25fbGluay0+dHlwZSkgeworCWNhc2UgRTFJTlBfU0lHTl9PTUw6CisJCXByb3RvID0gSVBBQ19QUk9UT19PTUw7CisJCWJyZWFrOworCWNhc2UgRTFJTlBfU0lHTl9SU0w6CisJCXByb3RvID0gSVBBQ19QUk9UT19SU0w7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW1zZ2JfZnJlZShtc2cpOworCQliZmQtPndoZW4gfD0gQlNDX0ZEX1dSSVRFOyAvKiBjb21lIGJhY2sgZm9yIG1vcmUgbXNnICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1zZy0+bDJoID0gbXNnLT5kYXRhOworCWlwYWNjZXNzX3ByZXBlbmRfaGVhZGVyKG1zZywgc2lnbl9saW5rLT50ZWkpOworCisJREVCVUdQKERNSSwgIlRYICV1OiAlc1xuIiwgdHNfbnIsIGhleGR1bXAobXNnLT5sMmgsIG1zZ2JfbDJsZW4obXNnKSkpOworCisJcmV0ID0gc2VuZChiZmQtPmZkLCBtc2ctPmRhdGEsIG1zZy0+bGVuLCAwKTsKKwltc2diX2ZyZWUobXNnKTsKKworCS8qIHNldCB0eCBkZWxheSB0aW1lciBmb3IgbmV4dCBldmVudCAqLworCWUxaV90cy0+c2lnbi50eF90aW1lci5jYiA9IHRpbWVvdXRfdHMxX3dyaXRlOworCWUxaV90cy0+c2lnbi50eF90aW1lci5kYXRhID0gZTFpX3RzOworCisJLyogUmVkdWNpbmcgdGhpcyBtaWdodCBicmVhayB0aGUgbmFub0JUUyA5MDAgaW5pdC4gKi8KKwlic2Nfc2NoZWR1bGVfdGltZXIoJmUxaV90cy0+c2lnbi50eF90aW1lciwgMCwgMTAwMDAwKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIGNhbGxiYWNrIGZyb20gc2VsZWN0LmMgaW4gY2FzZSBvbmUgb2YgdGhlIGZkJ3MgY2FuIGJlIHJlYWQvd3JpdHRlbiAqLworc3RhdGljIGludCBpcGFjY2Vzc19mZF9jYihzdHJ1Y3QgYnNjX2ZkICpiZmQsIHVuc2lnbmVkIGludCB3aGF0KQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lID0gYmZkLT5kYXRhOworCXVuc2lnbmVkIGludCB0c19uciA9IGJmZC0+cHJpdl9ucjsKKwl1bnNpZ25lZCBpbnQgaWR4ID0gdHNfbnItMTsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90czsKKwlpbnQgcmMgPSAwOworCisJLyogSW4gY2FzZSBvZiBlYXJseSBSU0wgd2UgbWlnaHQgbm90IHlldCBoYXZlIGEgbGluZSAqLworCisJaWYgKGxpbmUpCisgCQllMWlfdHMgPSAmbGluZS0+dHNbaWR4XTsKKworCWlmICghbGluZSB8fCBlMWlfdHMtPnR5cGUgPT0gRTFJTlBfVFNfVFlQRV9TSUdOKSB7CisJCWlmICh3aGF0ICYgQlNDX0ZEX1JFQUQpCisJCQlyYyA9IGhhbmRsZV90czFfcmVhZChiZmQpOworCQlpZiAod2hhdCAmIEJTQ19GRF9XUklURSkKKwkJCXJjID0gaGFuZGxlX3RzMV93cml0ZShiZmQpOworCX0gZWxzZQorCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJ1bmtub3duIEUxIFRTIHR5cGUgJXVcbiIsIGUxaV90cy0+dHlwZSk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0cnVjdCBlMWlucF9kcml2ZXIgaXBhY2Nlc3NfZHJpdmVyID0geworCS5uYW1lID0gImlwLmFjY2VzcyIsCisJLndhbnRfd3JpdGUgPSB0c193YW50X3dyaXRlLAorfTsKKworLyogY2FsbGJhY2sgb2YgdGhlIE9NTCBsaXN0ZW5pbmcgZmlsZWRlc2NyaXB0b3IgKi8KK3N0YXRpYyBpbnQgbGlzdGVuX2ZkX2NiKHN0cnVjdCBic2NfZmQgKmxpc3Rlbl9iZmQsIHVuc2lnbmVkIGludCB3aGF0KQoreworCWludCByZXQ7CisJaW50IGlkeCA9IDA7CisJaW50IGk7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmU7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHM7CisJc3RydWN0IGJzY19mZCAqYmZkOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzYTsKKwlzb2NrbGVuX3Qgc2FfbGVuID0gc2l6ZW9mKHNhKTsKKworCWlmICghKHdoYXQgJiBCU0NfRkRfUkVBRCkpCisJCXJldHVybiAwOworCisJcmV0ID0gYWNjZXB0KGxpc3Rlbl9iZmQtPmZkLCAoc3RydWN0IHNvY2thZGRyICopICZzYSwgJnNhX2xlbik7CisJaWYgKHJldCA8IDApIHsKKwkJcGVycm9yKCJhY2NlcHQiKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJTE9HUChESU5QLCBMT0dMX05PVElDRSwgImFjY2VwdCgpZWQgbmV3IE9NTCBsaW5rIGZyb20gJXNcbiIsCisJCWluZXRfbnRvYShzYS5zaW5fYWRkcikpOworCisJbGluZSA9IHRhbGxvY196ZXJvKHRhbGxfYnNjX2N0eCwgc3RydWN0IGUxaW5wX2xpbmUpOworCWlmICghbGluZSkgeworCQljbG9zZShyZXQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbGluZS0+ZHJpdmVyID0gJmlwYWNjZXNzX2RyaXZlcjsKKwkvL2xpbmUtPmRyaXZlcl9kYXRhID0gZTFoOworCS8qIGNyZWF0ZSB2aXJydHVhbCBFMSB0aW1lc2xvdHMgZm9yIHNpZ25hbGxpbmcgKi8KKwllMWlucF90c19jb25maWcoJmxpbmUtPnRzWzEtMV0sIGxpbmUsIEUxSU5QX1RTX1RZUEVfU0lHTik7CisKKwkvKiBpbml0aWFsaXplIHRoZSBmZHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsaW5lLT50cyk7ICsraSkKKwkJbGluZS0+dHNbaV0uZHJpdmVyLmlwYWNjZXNzLmZkLmZkID0gLTE7CisKKwllMWlfdHMgPSAmbGluZS0+dHNbaWR4XTsKKworCWJmZCA9ICZlMWlfdHMtPmRyaXZlci5pcGFjY2Vzcy5mZDsKKwliZmQtPmZkID0gcmV0OworCWJmZC0+ZGF0YSA9IGxpbmU7CisJYmZkLT5wcml2X25yID0gUFJJVl9PTUw7CisJYmZkLT5jYiA9IGlwYWNjZXNzX2ZkX2NiOworCWJmZC0+d2hlbiA9IEJTQ19GRF9SRUFEOworCXJldCA9IGJzY19yZWdpc3Rlcl9mZChiZmQpOworCWlmIChyZXQgPCAwKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgImNvdWxkIG5vdCByZWdpc3RlciBGRFxuIik7CisJCWNsb3NlKGJmZC0+ZmQpOworCQl0YWxsb2NfZnJlZShsaW5lKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBSZXF1ZXN0IElELiBGSVhNRTogcmVxdWVzdCBMT0NBVElPTiwgSFcvU1cgVkVyc2lvbiwgVW5pdCBOYW1lLCBTZXJubyAqLworCXJldCA9IGlwYWNjZXNzX3NlbmRfaWRfcmVxKGJmZC0+ZmQpOworCisgICAgICAgIHJldHVybiByZXQ7CisJLy9yZXR1cm4gZTFpbnBfbGluZV9yZWdpc3RlcihsaW5lKTsKK30KKworc3RhdGljIGludCByc2xfbGlzdGVuX2ZkX2NiKHN0cnVjdCBic2NfZmQgKmxpc3Rlbl9iZmQsIHVuc2lnbmVkIGludCB3aGF0KQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBzYTsKKwlzb2NrbGVuX3Qgc2FfbGVuID0gc2l6ZW9mKHNhKTsKKwlzdHJ1Y3QgYnNjX2ZkICpiZmQ7CisJaW50IHJldDsKKworCWlmICghKHdoYXQgJiBCU0NfRkRfUkVBRCkpCisJCXJldHVybiAwOworCisJYmZkID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3QgYnNjX2ZkKTsKKwlpZiAoIWJmZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBTb21lIEJUUyBoYXMgY29ubmVjdGVkIHRvIHVzLCBidXQgd2UgZG9uJ3Qga25vdyB5ZXQgd2hpY2ggbGluZQorCSAqIChhcyBjcmVhdGVkIGJ5IHRoZSBPTUwgbGluaykgdG8gYXNzb2NpYXRlIGl0IHdpdGguICBUaHVzLCB3ZQorCSAqIGFsbG9jYXRlIGEgdGVtcG9yYXJ5IGJmZCB1bnRpbCB3ZSBoYXZlIHJlY2VpdmVkIElEIGZyb20gQlRTICovCisKKwliZmQtPmZkID0gYWNjZXB0KGxpc3Rlbl9iZmQtPmZkLCAoc3RydWN0IHNvY2thZGRyICopICZzYSwgJnNhX2xlbik7CisJaWYgKGJmZC0+ZmQgPCAwKSB7CisJCXBlcnJvcigiYWNjZXB0Iik7CisJCXJldHVybiBiZmQtPmZkOworCX0KKwlMT0dQKERJTlAsIExPR0xfTk9USUNFLCAiYWNjZXB0KCllZCBuZXcgUlNMIGxpbmsgZnJvbSAlc1xuIiwgaW5ldF9udG9hKHNhLnNpbl9hZGRyKSk7CisJYmZkLT5wcml2X25yID0gUFJJVl9SU0w7CisJYmZkLT5jYiA9IGlwYWNjZXNzX2ZkX2NiOworCWJmZC0+d2hlbiA9IEJTQ19GRF9SRUFEOworCXJldCA9IGJzY19yZWdpc3Rlcl9mZChiZmQpOworCWlmIChyZXQgPCAwKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgImNvdWxkIG5vdCByZWdpc3RlciBGRFxuIik7CisJCWNsb3NlKGJmZC0+ZmQpOworCQl0YWxsb2NfZnJlZShiZmQpOworCQlyZXR1cm4gcmV0OworCX0KKwkvKiBSZXF1ZXN0IElELiBGSVhNRTogcmVxdWVzdCBMT0NBVElPTiwgSFcvU1cgVkVyc2lvbiwgVW5pdCBOYW1lLCBTZXJubyAqLworCXJldCA9IHdyaXRlKGJmZC0+ZmQsIGlkX3JlcSwgc2l6ZW9mKGlkX3JlcSkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEFjdGl2ZWx5IGNvbm5lY3QgdG8gYSBCVFMuICBDdXJyZW50bHkgdXNlZCBieSBpcGFjY2Vzcy1jb25maWcuYyAqLworaW50IGlwYWNjZXNzX2Nvbm5lY3Qoc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUsIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2EpCit7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHMgPSAmbGluZS0+dHNbMF07CisJc3RydWN0IGJzY19mZCAqYmZkID0gJmUxaV90cy0+ZHJpdmVyLmlwYWNjZXNzLmZkOworCWludCByZXQsIG9uID0gMTsKKworCWJmZC0+ZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKTsKKwliZmQtPmNiID0gaXBhY2Nlc3NfZmRfY2I7CisJYmZkLT53aGVuID0gQlNDX0ZEX1JFQUQgfCBCU0NfRkRfV1JJVEU7CisJYmZkLT5kYXRhID0gbGluZTsKKwliZmQtPnByaXZfbnIgPSBQUklWX09NTDsKKworCWlmIChiZmQtPmZkIDwgMCkgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJjb3VsZCBub3QgY3JlYXRlIFRDUCBzb2NrZXQuXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJc2V0c29ja29wdChiZmQtPmZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZvbiwgc2l6ZW9mKG9uKSk7CisKKwlyZXQgPSBjb25uZWN0KGJmZC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgc2EsIHNpemVvZigqc2EpKTsKKwlpZiAocmV0IDwgMCkgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJjb3VsZCBub3QgY29ubmVjdCBzb2NrZXRcbiIpOworCQljbG9zZShiZmQtPmZkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBic2NfcmVnaXN0ZXJfZmQoYmZkKTsKKwlpZiAocmV0IDwgMCkgeworCQljbG9zZShiZmQtPmZkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJCisJbGluZS0+ZHJpdmVyID0gJmlwYWNjZXNzX2RyaXZlcjsKKworICAgICAgICByZXR1cm4gcmV0OworCS8vcmV0dXJuIGUxaW5wX2xpbmVfcmVnaXN0ZXIobGluZSk7Cit9CisKK2ludCBpcGFjY2Vzc19zZXR1cChzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldCkKK3sKKwlpbnQgcmV0OworCisJLyogcmVnaXN0ZXIgdGhlIGRyaXZlciB3aXRoIHRoZSBjb3JlICovCisJLyogRklYTUU6IGRvIHRoaXMgaW4gdGhlIHBsdWdpbiBpbml0aWFsaXplciBmdW5jdGlvbiAqLworCXJldCA9IGUxaW5wX2RyaXZlcl9yZWdpc3RlcigmaXBhY2Nlc3NfZHJpdmVyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZTFoID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3QgaWFfZTFfaGFuZGxlKTsKKwlpZiAoIWUxaCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllMWgtPmdzbW5ldCA9IGdzbW5ldDsKKworCS8qIExpc3RlbiBmb3IgT01MIGNvbm5lY3Rpb25zICovCisJcmV0ID0gbWFrZV9zb2NrKCZlMWgtPmxpc3Rlbl9mZCwgSVBQUk9UT19UQ1AsIElQQV9UQ1BfUE9SVF9PTUwsCisJCQlsaXN0ZW5fZmRfY2IpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogTGlzdGVuIGZvciBSU0wgY29ubmVjdGlvbnMgKi8KKwlyZXQgPSBtYWtlX3NvY2soJmUxaC0+cnNsX2xpc3Rlbl9mZCwgSVBQUk9UT19UQ1AsCisJCQlJUEFfVENQX1BPUlRfUlNMLCByc2xfbGlzdGVuX2ZkX2NiKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9pbnB1dC9taXNkbi5jIGIvb3BlbmJzYy9zcmMvaW5wdXQvbWlzZG4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2IwMWYyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvaW5wdXQvbWlzZG4uYwpAQCAtMCwwICsxLDUzNiBAQAorLyogT3BlbkJTQyBBYmlzIGlucHV0IGRyaXZlciBmb3IgbUlTRE51c2VyICovCisKKy8qIChDKSAyMDA4LTIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+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+dHJhdS5tdXg7CisJaW50IHJldDsKKworCWhoID0gKHN0cnVjdCBtSVNETmhlYWQgKikgdHhfYnVmOworCWhoLT5wcmltID0gUEhfREFUQV9SRVE7CisKKwlzdWJjaGFuX211eF9vdXQobXgsIHR4X2J1ZitzaXplb2YoKmhoKSwgQkNIQU5fVFhfR1JBTik7CisKKwlERUJVR1AoRE1JQiwgIkJDSEFOIFRYOiAlc1xuIiwKKwkJaGV4ZHVtcCh0eF9idWYrc2l6ZW9mKCpoaCksIEJDSEFOX1RYX0dSQU4pKTsKKworCXJldCA9IHNlbmQoYmZkLT5mZCwgdHhfYnVmLCBzaXplb2YoKmhoKSArIEJDSEFOX1RYX0dSQU4sIDApOworCWlmIChyZXQgPCBzaXplb2YoKmhoKSArIEJDSEFOX1RYX0dSQU4pCisJCURFQlVHUChETUlCLCAic2VuZCByZXR1cm5zICVkIGluc3RlYWQgb2YgJXp1XG4iLCByZXQsCisJCQlzaXplb2YoKmhoKSArIEJDSEFOX1RYX0dSQU4pOworCisJcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBUU1hfQUxMT0NfU0laRSA0MDk2CisvKiBGSVhNRTogcmVhZCBmcm9tIGEgQiBjaGFubmVsIFRTICovCitzdGF0aWMgaW50IGhhbmRsZV90c1hfcmVhZChzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUgPSBiZmQtPmRhdGE7CisJdW5zaWduZWQgaW50IHRzX25yID0gYmZkLT5wcml2X25yOworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gJmxpbmUtPnRzW3RzX25yLTFdOworCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jKFRTWF9BTExPQ19TSVpFLCAibUlTRE4gVFN4Iik7CisJc3RydWN0IG1JU0ROaGVhZCAqaGg7CisJaW50IHJldDsKKworCWlmICghbXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWhoID0gKHN0cnVjdCBtSVNETmhlYWQgKikgbXNnLT5kYXRhOworCisJcmV0ID0gcmVjdihiZmQtPmZkLCBtc2ctPmRhdGEsIFRTWF9BTExPQ19TSVpFLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgInJlY3Zmcm9tIGVycm9yICAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwltc2diX3B1dChtc2csIHJldCk7CisKKwlpZiAoaGgtPnByaW0gIT0gUEhfQ09OVFJPTF9JTkQpCisJCURFQlVHUChETUlCLCAiPD0gQkNIQU4gbGVuID0gJWQsIHByaW0oMHgleCkgaWQoMHgleCk6ICVzXG4iLAorCQkJcmV0LCBoaC0+cHJpbSwgaGgtPmlkLCBnZXRfcHJpbV9uYW1lKGhoLT5wcmltKSk7CisKKwlzd2l0Y2ggKGhoLT5wcmltKSB7CisJY2FzZSBQSF9EQVRBX0lORDoKKwkJbXNnLT5sMmggPSBtc2ctPmRhdGEgKyBNSVNETl9IRUFERVJfTEVOOworCQlERUJVR1AoRE1JQiwgIkJDSEFOIFJYOiAlc1xuIiwKKwkJCWhleGR1bXAobXNnYl9sMihtc2cpLCByZXQgLSBNSVNETl9IRUFERVJfTEVOKSk7CisJCXJldCA9IGUxaW5wX3J4X3RzKGUxaV90cywgbXNnLCAwLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBQSF9BQ1RJVkFURV9JTkQ6CisJY2FzZSBQSF9EQVRBX0NORjoKKwkJLyogcGh5c2ljYWwgbGF5ZXIgaW5kaWNhdGVzIHRoYXQgZGF0YSBoYXMgYmVlbiBzZW50LAorCQkgKiB3ZSB0aHVzIGNhbiBzZW5kIHNvbWUgbW9yZSBkYXRhICovCisJCXJldCA9IGhhbmRsZV90c1hfd3JpdGUoYmZkKTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJLyogRklYTUU6IHdoeSBkbyB3ZSBmcmVlIHNpZ25hbGxpbmcgbXNncyBpbiB0aGUgY2FsbGVyLCBhbmQgdHJhdSBub3Q/ICovCisJbXNnYl9mcmVlKG1zZyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBjYWxsYmFjayBmcm9tIHNlbGVjdC5jIGluIGNhc2Ugb25lIG9mIHRoZSBmZCdzIGNhbiBiZSByZWFkL3dyaXR0ZW4gKi8KK3N0YXRpYyBpbnQgbWlzZG5fZmRfY2Ioc3RydWN0IGJzY19mZCAqYmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSA9IGJmZC0+ZGF0YTsKKwl1bnNpZ25lZCBpbnQgdHNfbnIgPSBiZmQtPnByaXZfbnI7CisJdW5zaWduZWQgaW50IGlkeCA9IHRzX25yLTE7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHMgPSAmbGluZS0+dHNbaWR4XTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChlMWlfdHMtPnR5cGUpIHsKKwljYXNlIEUxSU5QX1RTX1RZUEVfU0lHTjoKKwkJaWYgKHdoYXQgJiBCU0NfRkRfUkVBRCkKKwkJCXJjID0gaGFuZGxlX3RzMV9yZWFkKGJmZCk7CisJCWlmICh3aGF0ICYgQlNDX0ZEX1dSSVRFKQorCQkJcmMgPSBoYW5kbGVfdHMxX3dyaXRlKGJmZCk7CisJCWJyZWFrOworCWNhc2UgRTFJTlBfVFNfVFlQRV9UUkFVOgorCQlpZiAod2hhdCAmIEJTQ19GRF9SRUFEKQorCQkJcmMgPSBoYW5kbGVfdHNYX3JlYWQoYmZkKTsKKwkJLyogV2UgbmV2ZXIgaW5jbHVkZSB0aGUgbUlTRE4gQi1DaGFubmVsIEZEIGludG8gdGhlCisJCSAqIHdyaXRlc2V0LCBzaW5jZSBpdCBkb2Vzbid0IHN1cHBvcnQgcG9sbCgpIGJhc2VkCisJCSAqIHdyaXRlIGZsb3cgY29udHJvbCAqLwkJCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZwcmludGYoc3RkZXJyLCAidW5rbm93biBFMSBUUyB0eXBlICV1XG4iLCBlMWlfdHMtPnR5cGUpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgYWN0aXZhdGVfYmNoYW4oc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUsIGludCB0cywgaW50IGFjdCkKK3sKKwlzdHJ1Y3QgbUlTRE5oZWFkIGhoOworCWludCByZXQ7CisJdW5zaWduZWQgaW50IGlkeCA9IHRzLTE7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHMgPSAmbGluZS0+dHNbaWR4XTsKKwlzdHJ1Y3QgYnNjX2ZkICpiZmQgPSAmZTFpX3RzLT5kcml2ZXIubWlzZG4uZmQ7CisKKwlmcHJpbnRmKHN0ZG91dCwgImFjdGl2YXRlIGJjaGFuXG4iKTsKKwlpZiAoYWN0KQorCQloaC5wcmltID0gUEhfQUNUSVZBVEVfUkVROworCWVsc2UKKwkJaGgucHJpbSA9IFBIX0RFQUNUSVZBVEVfUkVROworCisJaGguaWQgPSBNSVNETl9JRF9BTlk7CisJcmV0ID0gc2VuZHRvKGJmZC0+ZmQsICZoaCwgc2l6ZW9mKGhoKSwgMCwgTlVMTCwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJZnByaW50ZihzdGRvdXQsICJjb3VsZCBub3Qgc2VuZCBBQ1RJVkFURV9SUSAlc1xuIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IGUxaW5wX2RyaXZlciBtaXNkbl9kcml2ZXIgPSB7CisJLm5hbWUgPSAibUlTRE51c2VyIiwKKwkud2FudF93cml0ZSA9IHRzX3dhbnRfd3JpdGUsCit9OworCitzdGF0aWMgaW50IG1pX2UxX3NldHVwKHN0cnVjdCBlMWlucF9saW5lICpsaW5lLCBpbnQgcmVsZWFzZV9sMikKK3sKKwlpbnQgdHMsIHJldDsKKworCS8qIFRTMCBpcyBDUkM0LCBkb24ndCBuZWVkIGFueSBmZCBmb3IgaXQgKi8KKwlmb3IgKHRzID0gMTsgdHMgPCBOVU1fRTFfVFM7IHRzKyspIHsKKwkJdW5zaWduZWQgaW50IGlkeCA9IHRzLTE7CisJCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gJmxpbmUtPnRzW2lkeF07CisJCXN0cnVjdCBic2NfZmQgKmJmZCA9ICZlMWlfdHMtPmRyaXZlci5taXNkbi5mZDsKKwkJc3RydWN0IHNvY2thZGRyX21JU0ROIGFkZHI7CisKKwkJYmZkLT5kYXRhID0gbGluZTsKKwkJYmZkLT5wcml2X25yID0gdHM7CisJCWJmZC0+Y2IgPSBtaXNkbl9mZF9jYjsKKworCQlzd2l0Y2ggKGUxaV90cy0+dHlwZSkgeworCQljYXNlIEUxSU5QX1RTX1RZUEVfTk9ORToKKwkJCWNvbnRpbnVlOworCQkJYnJlYWs7CisJCWNhc2UgRTFJTlBfVFNfVFlQRV9TSUdOOgorCQkJYmZkLT5mZCA9IHNvY2tldChQRl9JU0ROLCBTT0NLX0RHUkFNLCBJU0ROX1BfTEFQRF9OVCk7CisJCQliZmQtPndoZW4gPSBCU0NfRkRfUkVBRDsKKwkJCWJyZWFrOworCQljYXNlIEUxSU5QX1RTX1RZUEVfVFJBVToKKwkJCWJmZC0+ZmQgPSBzb2NrZXQoUEZfSVNETiwgU09DS19ER1JBTSwgSVNETl9QX0JfUkFXKTsKKwkJCS8qIFdlIG5ldmVyIGluY2x1ZGUgdGhlIG1JU0ROIEItQ2hhbm5lbCBGRCBpbnRvIHRoZQorCSAJCSogd3JpdGVzZXQsIHNpbmNlIGl0IGRvZXNuJ3Qgc3VwcG9ydCBwb2xsKCkgYmFzZWQKKwkgCQkqIHdyaXRlIGZsb3cgY29udHJvbCAqLwkJCisJCQliZmQtPndoZW4gPSBCU0NfRkRfUkVBRDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGJmZC0+ZmQgPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzIGNvdWxkIG5vdCBvcGVuIHNvY2tldCAlc1xuIiwKKwkJCQlfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiBiZmQtPmZkOworCQl9CisKKwkJbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOworCQlhZGRyLmZhbWlseSA9IEFGX0lTRE47CisJCWFkZHIuZGV2ID0gbGluZS0+bnVtOworCQlzd2l0Y2ggKGUxaV90cy0+dHlwZSkgeworCQljYXNlIEUxSU5QX1RTX1RZUEVfU0lHTjoKKwkJCWFkZHIuY2hhbm5lbCA9IDA7CisJCQkvKiBTQVBJIG5vdCBzdXBwb3J0ZWQgeWV0IGluIGtlcm5lbCAqLworCQkJLy9hZGRyLnNhcGkgPSBlMWlucF90cy0+c2lnbi5zYXBpOworCQkJYWRkci5zYXBpID0gMDsKKwkJCWFkZHIudGVpID0gR1JPVVBfVEVJOworCQkJYnJlYWs7CisJCWNhc2UgRTFJTlBfVFNfVFlQRV9UUkFVOgorCQkJYWRkci5jaGFubmVsID0gdHM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURFQlVHUChETUksICJ1bnN1cHBvcnRlZCBFMSBUUyB0eXBlOiAldVxuIiwKKwkJCQllMWlfdHMtPnR5cGUpOworCQkJYnJlYWs7CisJCX0KKworCQlyZXQgPSBiaW5kKGJmZC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsIHNpemVvZihhZGRyKSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBiaW5kIGwyIHNvY2tldCAlc1xuIiwKKwkJCQlzdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQlpZiAoZTFpX3RzLT50eXBlID09IEUxSU5QX1RTX1RZUEVfU0lHTikgeworCQkJcmV0ID0gaW9jdGwoYmZkLT5mZCwgSU1DTEVBUl9MMiwgJnJlbGVhc2VfbDIpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBzZW5kIElPQ1RMIElNQ0xFQU5fTDIgJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCX0KKworCQkvKiBGSVhNRTogb25seSBhY3RpdmF0ZSBCLUNoYW5uZWxzIG9uY2Ugd2Ugc3RhcnQgdG8KKwkJICogdXNlIHRoZW0gdG8gY29uc2VydmUgQ1BVIHBvd2VyICovCisJCWlmIChlMWlfdHMtPnR5cGUgPT0gRTFJTlBfVFNfVFlQRV9UUkFVKQorCQkJYWN0aXZhdGVfYmNoYW4obGluZSwgdHMsIDEpOworCisJCXJldCA9IGJzY19yZWdpc3Rlcl9mZChiZmQpOworCQlpZiAocmV0IDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgcmVnaXN0ZXIgRkQ6ICVzXG4iLAorCQkJCXN0cmVycm9yKHJldCkpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitpbnQgbWlfZTFfbGluZV91cGRhdGUoc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUpCit7CisJc3RydWN0IG1JU0ROX2RldmluZm8gZGV2aW5mbzsKKwlpbnQgc2ssIHJldCwgY250OworCisJaWYgKCFsaW5lLT5kcml2ZXIpIHsKKwkJLyogdGhpcyBtdXN0IGJlIHRoZSBmaXJzdCB1cGRhdGUgKi8KKwkJbGluZS0+ZHJpdmVyID0gJm1pc2RuX2RyaXZlcjsKKwl9IGVsc2UgeworCQkvKiB0aGlzIGlzIGEgc3Vic2VxdWVudCB1cGRhdGUgKi8KKwkJLyogRklYTUU6IGZpcnN0IGNsb3NlIGFsbCBzb2NrZXRzICovCisJCWZwcmludGYoc3RkZXJyLCAiaW5jcmVtZW50YWwgbGluZSB1cGRhdGVzIG5vdCBzdXBwb3J0ZWQgeWV0XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGxpbmUtPmRyaXZlciAhPSAmbWlzZG5fZHJpdmVyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIG9wZW4gdGhlIElTRE4gY2FyZCBkZXZpY2UgKi8KKwlzayA9IHNvY2tldChQRl9JU0ROLCBTT0NLX1JBVywgSVNETl9QX0JBU0UpOworCWlmIChzayA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICIlcyBjb3VsZCBub3Qgb3BlbiBzb2NrZXQgJXNcbiIsCisJCQlfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIHNrOworCX0KKworCXJldCA9IGlvY3RsKHNrLCBJTUdFVENPVU5ULCAmY250KTsKKwlpZiAocmV0KSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXMgZXJyb3IgZ2V0dGluZyBpbnRlcmYgY291bnQ6ICVzXG4iLAorCQkJX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisJCWNsb3NlKHNrKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCS8vREVCVUdQKERNSSwiJWQgZGV2aWNlJXMgZm91bmRcbiIsIGNudCwgKGNudD09MSk/IiI6InMiKTsKKwlwcmludGYoIiVkIGRldmljZSVzIGZvdW5kXG4iLCBjbnQsIChjbnQ9PTEpPyIiOiJzIik7CisjaWYgMQorCWRldmluZm8uaWQgPSBsaW5lLT5udW07CisJcmV0ID0gaW9jdGwoc2ssIElNR0VUREVWSU5GTywgJmRldmluZm8pOworCWlmIChyZXQgPCAwKSB7CisJCWZwcmludGYoc3Rkb3V0LCAiZXJyb3IgZ2V0dGluZyBpbmZvIGZvciBkZXZpY2UgJWQ6ICVzXG4iLAorCQkJbGluZS0+bnVtLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJZnByaW50ZihzdGRvdXQsICIgICAgICAgIGlkOiAgICAgICAgICAgICAlZFxuIiwgZGV2aW5mby5pZCk7CisJZnByaW50ZihzdGRvdXQsICIgICAgICAgIERwcm90b2NvbHM6ICAgICAlMDh4XG4iLCBkZXZpbmZvLkRwcm90b2NvbHMpOworCWZwcmludGYoc3Rkb3V0LCAiICAgICAgICBCcHJvdG9jb2xzOiAgICAgJTA4eFxuIiwgZGV2aW5mby5CcHJvdG9jb2xzKTsKKwlmcHJpbnRmKHN0ZG91dCwgIiAgICAgICAgcHJvdG9jb2w6ICAgICAgICVkXG4iLCBkZXZpbmZvLnByb3RvY29sKTsKKwlmcHJpbnRmKHN0ZG91dCwgIiAgICAgICAgbnJiY2hhbjogICAgICAgICVkXG4iLCBkZXZpbmZvLm5yYmNoYW4pOworCWZwcmludGYoc3Rkb3V0LCAiICAgICAgICBuYW1lOiAgICAgICAgICAgJXNcbiIsIGRldmluZm8ubmFtZSk7CisjZW5kaWYKKworCWlmICghKGRldmluZm8uRHByb3RvY29scyAmICgxIDw8IElTRE5fUF9OVF9FMSkpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZXJyb3I6IGNhcmQgaXMgbm90IG9mIHR5cGUgRTEgKE5ULW1vZGUpXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gbWlfZTFfc2V0dXAobGluZSwgMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKSB2b2lkIG9uX2Rzb19sb2FkX3Ntcyh2b2lkKQoreworCS8qIHJlZ2lzdGVyIHRoZSBkcml2ZXIgd2l0aCB0aGUgY29yZSAqLworCWUxaW5wX2RyaXZlcl9yZWdpc3RlcigmbWlzZG5fZHJpdmVyKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2lwYWNjZXNzL01ha2VmaWxlLmFtIGIvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMzOTMyMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2lwYWNjZXNzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTMgQEAKK0lOQ0xVREVTID0gJChhbGxfaW5jbHVkZXMpIC1JJCh0b3Bfc3JjZGlyKS9pbmNsdWRlIC1JJCh0b3BfYnVpbGRkaXIpCitBTV9DRkxBR1M9LVdhbGwgJChMSUJPU01PQ09SRV9DRkxBR1MpCitBTV9MREZMQUdTID0gJChMSUJPU01PQ09SRV9MSUJTKQorCitzYmluX1BST0dSQU1TID0gaXBhY2Nlc3MtZmluZCBpcGFjY2Vzcy1jb25maWcgaXBhY2Nlc3MtcHJveHkKKworaXBhY2Nlc3NfZmluZF9TT1VSQ0VTID0gaXBhY2Nlc3MtZmluZC5jCisKK2lwYWNjZXNzX2NvbmZpZ19TT1VSQ0VTID0gaXBhY2Nlc3MtY29uZmlnLmMgaXBhY2Nlc3MtZmlybXdhcmUuYworaXBhY2Nlc3NfY29uZmlnX0xEQUREID0gJCh0b3BfYnVpbGRkaXIpL3NyYy9saWJic2MuYSAkKHRvcF9idWlsZGRpcikvc3JjL2xpYm1zYy5hIFwKKwkJCSQodG9wX2J1aWxkZGlyKS9zcmMvbGliYnNjLmEgJCh0b3BfYnVpbGRkaXIpL3NyYy9saWJ2dHkuYSAtbGRsIC1sZGJpICQoTElCQ1JZUFQpCisKK2lwYWNjZXNzX3Byb3h5X1NPVVJDRVMgPSBpcGFjY2Vzcy1wcm94eS5jIC4uL2RlYnVnLmMKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2lwYWNjZXNzL2lwYWNjZXNzLWNvbmZpZy5jIGIvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvaXBhY2Nlc3MtY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcwZTNmMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2lwYWNjZXNzL2lwYWNjZXNzLWNvbmZpZy5jCkBAIC0wLDAgKzEsNzM1IEBACisvKiBpcC5hY2Nlc3MgbmFub0JUUyBjb25maWd1cmF0aW9uIHRvb2wgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCisgKiAoQykgMjAwOSBieSBPbiBXYXZlcworICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGVycm5vLmg+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+b21sX3RlaSA9IHN0cmVhbV9pZDsKKwkKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19OTSwgbm1fc2lnX2NiLCBOVUxMKTsKKwlwcmludGYoIlRyeWluZyB0byBjb25uZWN0IHRvIGlwLmFjY2VzcyBCVFMgLi4uXG4iKTsKKworCW1lbXNldCgmc2luLCAwLCBzaXplb2Yoc2luKSk7CisJc2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWluZXRfYXRvbihhcmd2W29wdGluZF0sICZzaW4uc2luX2FkZHIpOworCXJjID0gaWFfY29uZmlnX2Nvbm5lY3QoYnRzLCAmc2luKTsKKwlpZiAocmMgPCAwKSB7CisJCXBlcnJvcigiRXJyb3IgY29ubmVjdGluZyB0byB0aGUgQlRTIik7CisJCWV4aXQoMSk7CisJfQorCQorCXdoaWxlICgxKSB7CisJCXJjID0gYnNjX3NlbGVjdF9tYWluKDApOworCQlpZiAocmMgPCAwKQorCQkJZXhpdCgzKTsKKwl9CisKKwlleGl0KDApOworfQorCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1maW5kLmMgYi9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1maW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM0YTBiNwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2lwYWNjZXNzL2lwYWNjZXNzLWZpbmQuYwpAQCAtMCwwICsxLDIwOCBAQAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisKKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90aW1lci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvaXBhY2Nlc3MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisKK3N0YXRpYyBjb25zdCBjaGFyICppZHRhZ19uYW1lc1tdID0geworCVtJUEFDX0lEVEFHX1NFUk5SXQk9ICJTZXJpYWwgTnVtYmVyIiwKKwlbSVBBQ19JRFRBR19VTklUTkFNRV0JPSAiVW5pdCBOYW1lIiwKKwlbSVBBQ19JRFRBR19MT0NBVElPTjFdCT0gIkxvY2F0aW9uIDEiLAorCVtJUEFDX0lEVEFHX0xPQ0FUSU9OMl0JPSAiTG9jYXRpb24gMiIsCisJW0lQQUNfSURUQUdfRVFVSVBWRVJTXQk9ICJFcXVpcG1lbnQgVmVyc2lvbiIsCisJW0lQQUNfSURUQUdfU1dWRVJTSU9OXQk9ICJTb2Z0d2FyZSBWZXJzaW9uIiwKKwlbSVBBQ19JRFRBR19JUEFERFJdCT0gIklQIEFkZHJlc3MiLAorCVtJUEFDX0lEVEFHX01BQ0FERFJdCT0gIk1BQyBBZGRyZXNzIiwKKwlbSVBBQ19JRFRBR19VTklUXQk9ICJVbml0IElEIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICppcGFjX2lkdGFnX25hbWUoaW50IHRhZykKK3sKKwlpZiAodGFnID49IEFSUkFZX1NJWkUoaWR0YWdfbmFtZXMpKQorCQlyZXR1cm4gInVua25vd24iOworCisJcmV0dXJuIGlkdGFnX25hbWVzW3RhZ107Cit9CisKK3N0YXRpYyBpbnQgdWRwX3NvY2soY29uc3QgY2hhciAqaWZuYW1lKQoreworCWludCBmZCwgcmMsIGJjID0gMTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2E7CisKKwlmZCA9IHNvY2tldChQRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIGZkOworCisJaWYgKGlmbmFtZSkgeworCQlyYyA9IHNldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX0JJTkRUT0RFVklDRSwgaWZuYW1lLAorCQkJCXN0cmxlbihpZm5hbWUpKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gZXJyOworCX0KKworCXNhLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCXNhLnNpbl9wb3J0ID0gaHRvbnMoMzAwNik7CisJc2Euc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKworCXJjID0gYmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzYSwgc2l6ZW9mKHNhKSk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBlcnI7CisKKwlyYyA9IHNldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX0JST0FEQ0FTVCwgJmJjLCBzaXplb2YoYmMpKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGVycjsKKworI2lmIDAKKwkvKiB3ZSBjYW5ub3QgYmluZCwgc2luY2UgdGhlIHJlc3BvbnNlIHBhY2tldHMgZG9uJ3QgY29tZSBmcm9tCisJICogdGhlIGJyb2FkY2FzdCBhZGRyZXNzICovCisJc2Euc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJc2Euc2luX3BvcnQgPSBodG9ucygzMDA2KTsKKwlpbmV0X2F0b24oIjI1NS4yNTUuMjU1LjI1NSIsICZzYS5zaW5fYWRkcik7CisKKwlyYyA9IGNvbm5lY3QoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2EsIHNpemVvZihzYSkpOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyOworI2VuZGlmCisJcmV0dXJuIGZkOworCitlcnI6CisJY2xvc2UoZmQpOworCXJldHVybiByYzsKK30KKworY29uc3QgdW5zaWduZWQgY2hhciBmaW5kX3BrdFtdID0geyAweDAwLCAweDBiKzgsIElQQUNfUFJPVE9fSVBBQ0NFU1MsIDB4MDAsCisJCQkJSVBBQ19NU0dUX0lEX0dFVCwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19NQUNBRERSLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX0lQQUREUiwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19VTklULAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX0xPQ0FUSU9OMSwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19MT0NBVElPTjIsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfRVFVSVBWRVJTLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX1NXVkVSU0lPTiwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19VTklUTkFNRSwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19TRVJOUiwKKwkJCQl9OworCisKK3N0YXRpYyBpbnQgYmNhc3RfZmluZChpbnQgZmQpCit7CisJc3RydWN0IHNvY2thZGRyX2luIHNhOworCisJc2Euc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJc2Euc2luX3BvcnQgPSBodG9ucygzMDA2KTsKKwlpbmV0X2F0b24oIjI1NS4yNTUuMjU1LjI1NSIsICZzYS5zaW5fYWRkcik7CisKKwlyZXR1cm4gc2VuZHRvKGZkLCBmaW5kX3BrdCwgc2l6ZW9mKGZpbmRfcGt0KSwgMCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2EsIHNpemVvZihzYSkpOworfQorCitzdGF0aWMgaW50IHBhcnNlX3Jlc3BvbnNlKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwl1X2ludDhfdCB0X2xlbjsKKwl1X2ludDhfdCB0X3RhZzsKKwl1X2ludDhfdCAqY3VyID0gYnVmOworCisJd2hpbGUgKGN1ciA8IGJ1ZiArIGxlbikgeworCQl0X2xlbiA9ICpjdXIrKzsKKwkJdF90YWcgPSAqY3VyKys7CisJCQorCQlwcmludGYoIiVzPSclcycgICIsIGlwYWNfaWR0YWdfbmFtZSh0X3RhZyksIGN1cik7CisKKwkJY3VyICs9IHRfbGVuOworCX0KKwlwcmludGYoIlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9yZXNwb25zZShpbnQgZmQpCit7CisJdW5zaWduZWQgY2hhciBidWZbMjU1XTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2E7CisJaW50IGxlbjsKKwlzb2NrbGVuX3Qgc2FfbGVuID0gc2l6ZW9mKHNhKTsKKworCWxlbiA9IHJlY3Zmcm9tKGZkLCBidWYsIHNpemVvZihidWYpLCAwLCAoc3RydWN0IHNvY2thZGRyICopJnNhLCAmc2FfbGVuKTsKKwlpZiAobGVuIDwgMCkKKwkJcmV0dXJuIGxlbjsKKworCS8qIDIgYnl0ZXMgbGVuZ3RoLCAxIGJ5dGUgcHJvdG9jb2wgKDB4ZmUpICovCisJaWYgKGJ1ZlsyXSAhPSAweGZlKQorCQlyZXR1cm4gMDsKKworCWlmIChidWZbNF0gIT0gSVBBQ19NU0dUX0lEX1JFU1ApCisJCXJldHVybiAwOworCisJcmV0dXJuIHBhcnNlX3Jlc3BvbnNlKGJ1Zis2LCBsZW4tNik7Cit9CisKK3N0YXRpYyBpbnQgYmZkX2NiKHN0cnVjdCBic2NfZmQgKmJmZCwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCWlmIChmbGFncyAmIEJTQ19GRF9SRUFEKQorCQlyZXR1cm4gcmVhZF9yZXNwb25zZShiZmQtPmZkKTsKKwlpZiAoZmxhZ3MgJiBCU0NfRkRfV1JJVEUpIHsKKwkJYmZkLT53aGVuICY9IH5CU0NfRkRfV1JJVEU7CisJCXJldHVybiBiY2FzdF9maW5kKGJmZC0+ZmQpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCitzdGF0aWMgdm9pZCB0aW1lcl9jYih2b2lkICpfZGF0YSkKK3sKKwlzdHJ1Y3QgYnNjX2ZkICpiZmQgPSBfZGF0YTsKKworCWJmZC0+d2hlbiB8PSBCU0NfRkRfV1JJVEU7CisKKwlic2Nfc2NoZWR1bGVfdGltZXIoJnRpbWVyLCA1LCAwKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBic2NfZmQgYmZkOworCWNoYXIgKmlmbmFtZTsKKwlpbnQgcmM7CisKKwlwcmludGYoImlwYWNjZXNzLWZpbmQgKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlXG4iKTsKKwlwcmludGYoIlRoaXMgaXMgRlJFRSBTT0ZUV0FSRSB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFlcblxuIik7CisKKwlpZiAoYXJnYyA8IDIpIHsKKwkJZnByaW50ZihzdGRvdXQsICJ5b3UgbWlnaHQgbmVlZCB0byBzcGVjaWZ5IHRoZSBvdXRnb2luZ1xuIgorCQkJIiBuZXR3b3JrIGludGVyZmFjZSwgZS5nLiBgYCVzIGV0aDAnJ1xuIiwgYXJndlswXSk7CisJfQorCisJaWZuYW1lID0gYXJndlsxXTsKKwliZmQuY2IgPSBiZmRfY2I7CisJYmZkLndoZW4gPSBCU0NfRkRfUkVBRCB8IEJTQ19GRF9XUklURTsKKwliZmQuZmQgPSB1ZHBfc29jayhpZm5hbWUpOworCWlmIChiZmQuZmQgPCAwKSB7CisJCXBlcnJvcigiQ2Fubm90IGNyZWF0ZSBsb2NhbCBzb2NrZXQgZm9yIGJyb2FkY2FzdCB1ZHAiKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlic2NfcmVnaXN0ZXJfZmQoJmJmZCk7CisKKwl0aW1lci5jYiA9IHRpbWVyX2NiOworCXRpbWVyLmRhdGEgPSAmYmZkOworCisJYnNjX3NjaGVkdWxlX3RpbWVyKCZ0aW1lciwgNSwgMCk7CisKKwlwcmludGYoIlRyeWluZyB0byBmaW5kIGlwLmFjY2VzcyBCVFMgYnkgYnJvYWRjYXN0IFVEUC4uLlxuIik7CisKKwl3aGlsZSAoMSkgeworCQlyYyA9IGJzY19zZWxlY3RfbWFpbigwKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWV4aXQoMyk7CisJfQorCisJZXhpdCgwKTsKK30KKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvaXBhY2Nlc3MtZmlybXdhcmUuYyBiL29wZW5ic2Mvc3JjL2lwYWNjZXNzL2lwYWNjZXNzLWZpcm13YXJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM0MGMxZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2lwYWNjZXNzL2lwYWNjZXNzLWZpcm13YXJlLmMKQEAgLTAsMCArMSwxMzYgQEAKKy8qIFJvdXRpbmVzIGZvciBwYXJzaW5nIGFuIGlwYWNjZXMgU0RQIGZpcm13YXJlIGZpbGUgKi8KKworLyogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9pcGFjY2Vzcy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2RlZmluZSBQQVJUX0xFTkdUSCAxMzgKKworc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHNkcF9oZWFkZXJfZW50cnkpID09IDEzOCwgcmlnaHRfZW50cnkpOworc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHNkcF9maXJtd2FyZSkgPT0gMTU4LCBfcmlnaHRfaGVhZGVyX2xlbmd0aCk7CisKKy8qIG1vcmUgbWFnaWMsIHRoZSBzZWNvbmQgImludCIgaW4gdGhlIGhlYWRlciAqLworc3RhdGljIGNoYXIgbW9yZV9tYWdpY1tdID0geyAweDEwLCAweDAyIH07CisKK2ludCBpcGFjY2Vzc19hbmFseXplX2ZpbGUoaW50IGZkLCBjb25zdCB1bnNpZ25lZCBpbnQgc3Rfc2l6ZSwgY29uc3QgdW5zaWduZWQgaW50IGJhc2Vfb2Zmc2V0LCBzdHJ1Y3QgbGxpc3RfaGVhZCAqbGlzdCkKK3sKKwlzdHJ1Y3Qgc2RwX2Zpcm13YXJlICpmaXJtd2FyZV9oZWFkZXIgPSAwOworCXN0cnVjdCBzZHBfaGVhZGVyICpoZWFkZXI7CisJY2hhciBidWZbNDA5Nl07CisJaW50IHJjLCBpOworCXVfaW50MTZfdCB0YWJsZV9zaXplOworCXVfaW50MTZfdCB0YWJsZV9vZmZzZXQ7CisJb2ZmX3QgdGFibGVfc3RhcnQ7CisKKworCXJjID0gcmVhZChmZCwgYnVmLCBzaXplb2YoKmZpcm13YXJlX2hlYWRlcikpOworCWlmIChyYyA8IDApIHsKKwkJcGVycm9yKCJDYW4gbm90IHJlYWQgaGVhZGVyIHN0YXJ0LiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZmlybXdhcmVfaGVhZGVyID0gKHN0cnVjdCBzZHBfZmlybXdhcmUgKikgJmJ1ZlswXTsKKwlpZiAoc3RybmNtcChmaXJtd2FyZV9oZWFkZXItPm1hZ2ljLCAiIFNEUCIsIDQpICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJXcm9uZyBtYWdpYy5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKG1lbWNtcChmaXJtd2FyZV9oZWFkZXItPm1vcmVfbWFnaWMsIG1vcmVfbWFnaWMsIDIpICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJXcm9uZyBtb3JlIG1hZ2ljLiBHb3Q6IDB4JXggJXggJXggJXhcbiIsCisJCQlmaXJtd2FyZV9oZWFkZXItPm1vcmVfbWFnaWNbMF0gJiAweGZmLCBmaXJtd2FyZV9oZWFkZXItPm1vcmVfbWFnaWNbMV0gJiAweGZmLAorCQkJZmlybXdhcmVfaGVhZGVyLT5tb3JlX21hZ2ljWzJdICYgMHhmZiwgZmlybXdhcmVfaGVhZGVyLT5tb3JlX21hZ2ljWzNdICYgMHhmZik7CisJCXJldHVybiAtMTsKKwl9CisKKworCWlmIChudG9obChmaXJtd2FyZV9oZWFkZXItPmZpbGVfbGVuZ3RoKSAhPSBzdF9zaXplKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVGhlIGZpbGVzaXplIGFuZCB0aGUgaGVhZGVyIGRvIG5vdCBtYXRjaC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogYWRkIHRoZSBmaXJtd2FyZSAqLworCWhlYWRlciA9IHRhbGxvY196ZXJvKGxpc3QsIHN0cnVjdCBzZHBfaGVhZGVyKTsKKwloZWFkZXItPmZpcm13YXJlX2luZm8gPSAqZmlybXdhcmVfaGVhZGVyOworCUlOSVRfTExJU1RfSEVBRCgmaGVhZGVyLT5oZWFkZXJfbGlzdCk7CisJbGxpc3RfYWRkKCZoZWFkZXItPmVudHJ5LCBsaXN0KTsKKworCXRhYmxlX29mZnNldCA9IG50b2hzKGZpcm13YXJlX2hlYWRlci0+dGFibGVfb2Zmc2V0KTsKKwl0YWJsZV9zdGFydCA9IGxzZWVrKGZkLCB0YWJsZV9vZmZzZXQsIFNFRUtfQ1VSKTsKKwlpZiAodGFibGVfc3RhcnQgPT0gLTEpIHsKKwkJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gc2VlayB0byB0aGUgcmVsIHBvc2l0aW9uOiAweCV4XG4iLCB0YWJsZV9vZmZzZXQpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHJlYWQoZmQsICZ0YWJsZV9zaXplLCBzaXplb2YodGFibGVfc2l6ZSkpICE9IHNpemVvZih0YWJsZV9zaXplKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlRoZSB0YWJsZSBzaXplIGNvdWxkIG5vdCBiZSByZWFkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwl0YWJsZV9zaXplID0gbnRvaHModGFibGVfc2l6ZSk7CisKKwlpZiAodGFibGVfc2l6ZSAlIFBBUlRfTEVOR1RIICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJUaGUgcGFydCBsZW5ndGggc2VlbXMgdG8gYmUgd3Jvbmc6IDB4JXhcbiIsIHRhYmxlX3NpemUpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogbG9vayBpbnRvIGVhY2ggZmlybXdhcmUgbm93ICovCisJZm9yIChpID0gMDsgaSA8IHRhYmxlX3NpemUgLyBQQVJUX0xFTkdUSDsgKytpKSB7CisJCXN0cnVjdCBzZHBfaGVhZGVyX2VudHJ5IGVudHJ5OworCQlzdHJ1Y3Qgc2RwX2hlYWRlcl9pdGVtICpoZWFkZXJfZW50cnk7CisJCXVuc2lnbmVkIGludCBvZmZzZXQgPSB0YWJsZV9zdGFydCArIDI7CisJCW9mZnNldCArPSBpICogMTM4OworCisJCWlmIChsc2VlayhmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gb2Zmc2V0KSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNhbiBub3Qgc2VlayB0byB0aGUgb2Zmc2V0OiAldS5cbiIsIG9mZnNldCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlyYyA9IHJlYWQoZmQsICZlbnRyeSwgc2l6ZW9mKGVudHJ5KSk7CisJCWlmIChyYyAhPSBzaXplb2YoZW50cnkpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNhbiBub3QgcmVhZCB0aGUgaGVhZGVyIGVudHJ5LlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQloZWFkZXJfZW50cnkgPSB0YWxsb2NfemVybyhoZWFkZXIsICBzdHJ1Y3Qgc2RwX2hlYWRlcl9pdGVtKTsKKwkJaGVhZGVyX2VudHJ5LT5oZWFkZXJfZW50cnkgPSBlbnRyeTsKKwkJaGVhZGVyX2VudHJ5LT5hYnNvbHV0ZV9vZmZzZXQgPSBiYXNlX29mZnNldDsKKwkJbGxpc3RfYWRkKCZoZWFkZXJfZW50cnktPmVudHJ5LCAmaGVhZGVyLT5oZWFkZXJfbGlzdCk7CisKKwkJLyogbm93IHdlIG5lZWQgdG8gZmluZCB0aGUgU0RQIGZpbGUuLi4gKi8KKwkJb2Zmc2V0ID0gbnRvaGwoZW50cnkuc3RhcnQpICsgNCArIGJhc2Vfb2Zmc2V0OworCQlpZiAobHNlZWsoZmQsIG9mZnNldCwgU0VFS19TRVQpICE9IG9mZnNldCkgeworCQkJcGVycm9yKCJjYW4ndCBzZWVrIHRvIHNkcCIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKworCQlpcGFjY2Vzc19hbmFseXplX2ZpbGUoZmQsIG50b2hsKGVudHJ5Lmxlbmd0aCksIG9mZnNldCwgbGlzdCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2lwYWNjZXNzL2lwYWNjZXNzLXByb3h5LmMgYi9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1wcm94eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NjA4MTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1wcm94eS5jCkBAIC0wLDAgKzEsMTEyOCBAQAorLyogT3BlbkJTQyBBYmlzL0lQIHByb3h5IGlwLmFjY2VzcyBuYW5vQlRTICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+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/IVxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCS8qIGxvb2t1cCBCVFMsIGNyZWF0ZSBzaWduX2xpbmssIC4uLiAqLworCQlzaXRlX2lkID0gYnRzX2lkID0gdHJ4X2lkID0gMDsKKwkJcGFyc2VfdW5pdGlkKChjaGFyICopVExWUF9WQUwoJnRsdnAsIElQQUNfSURUQUdfVU5JVCksCisJCQkgICAgICZzaXRlX2lkLCAmYnRzX2lkLCAmdHJ4X2lkKTsKKwkJaXBiYyA9IGZpbmRfYnRzX2J5X3VuaXRpZChpcHAsIHNpdGVfaWQsIGJ0c19pZCk7CisJCWlmICghaXBiYykgeworCQkJLyogV2UgaGF2ZSBub3QgZm91bmQgYW4gaXBiYyAocGVyLWJ0cyBwcm94eSBpbnN0YW5jZSkKKwkJCSAqIGZvciB0aGlzIEJUUyB5ZXQuICBUaGUgZmlyc3QgY29ubmVjdGlvbiBvZiBhIG5ldyBCVFMgbXVzdAorCQkJICogYmUgYSBPTUwgY29ubmVjdGlvbi4gIFdlIGFsbG9jYXRlIHRoZSBhc3NvY2lhdGVkIGRhdGEgc3RydWN0dXJlcywKKwkJCSAqIGFuZCB0cnkgdG8gY29ubmVjdCB0byB0aGUgcmVtb3RlIGVuZCAqLworCisJCQlyZXR1cm4gaXBiY19hbGxvY19jb25uZWN0KGlwYywgYmZkLCBzaXRlX2lkLCBidHNfaWQsCisJCQkJCQkgIHRyeF9pZCwgJnRsdnAsIG1zZyk7CisJCQkvKiBpZiB0aGlzIGZhaWxzLCB0aGUgY2FsbGVyIHdpbGwgY2xlYW4gdXAgYmZkICovCisJCX0gZWxzZSB7CisJCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOworCQkJbWVtc2V0KCZzaW4sIDAsIHNpemVvZihzaW4pKTsKKwkJCXNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJCWluZXRfYXRvbihic2NfaXBhZGRyLCAmc2luLnNpbl9hZGRyKTsKKworCQkJREVCVUdQKERJTlAsICJJZGVudGlmaWVkIEJUUyAldS8ldS8ldVxuIiwKKwkJCQlzaXRlX2lkLCBidHNfaWQsIHRyeF9pZCk7CisKKwkJCWlmICgoYmZkLT5wcml2X25yICYgMHhmZikgIT0gUlNMX0ZST01fQlRTKSB7CisJCQkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiU2Vjb25kIE9NTCBjb25uZWN0aW9uIGZyb20gIgorCQkJCSAgICAgInNhbWUgQlRTID8hP1xuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCWlmICh0cnhfaWQgPiBNQVhfVFJYKSB7CisJCQkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiV2UgZG9uJ3Qgc3VwcG9ydCBtb3JlICIKKwkJCQkgICAgICJ0aGFuICV1IFRSWFxuIiwgTUFYX1RSWCk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCWlwYy0+YnRzX2Nvbm4gPSBpcGJjOworCQkJLyogc3RvcmUgVFJYIG51bWJlciBpbiBoaWdoZXIgOCBiaXQgb2YgdGhlIGJmZCBwcml2YXRlIG51bWJlciAqLworCQkJYmZkLT5wcml2X25yIHw9IHRyeF9pZCA8PCA4OworCQkJaXBiYy0+cnNsX2Nvbm5bdHJ4X2lkXSA9IGlwYzsKKworCQkJLyogQ3JlYXRlIFJTTCBUQ1AgY29ubmVjdGlvbiB0b3dhcmRzIEJTQyAqLworCQkJc2luLnNpbl9wb3J0ID0gaHRvbnMoSVBBX1RDUF9QT1JUX1JTTCk7CisJCQlpcGJjLT5ic2NfcnNsX2Nvbm5bdHJ4X2lkXSA9CisJCQkJY29ubmVjdF9ic2MoJnNpbiwgUlNMX1RPX0JTQyB8ICh0cnhfaWQgPDwgOCksIGlwYmMpOworCQkJaWYgKCFpcGJjLT5ic2Nfb21sX2Nvbm4pCisJCQkJcmV0dXJuIC1FSU87CisJCQlERUJVR1AoRElOUCwgIigldS8ldS8ldSkgQ29ubmVjdGVkIFJTTCB0byBCU0NcbiIsCisJCQkJc2l0ZV9pZCwgYnRzX2lkLCB0cnhfaWQpOworCQl9CisJCWJyZWFrOworCWNhc2UgSVBBQ19NU0dUX0lEX0dFVDoKKwkJREVCVUdQKERNSSwgIklEX0dFVFxuIik7CisJCWlmICgoYmZkLT5wcml2X25yICYgMHhmZikgIT0gT01MX1RPX0JTQyAmJgorCQkgICAgKGJmZC0+cHJpdl9uciAmIDB4ZmYpICE9IFJTTF9UT19CU0MpIHsKKwkJCURFQlVHUChESU5QLCAiSURlbnRpdHkgUkVRdWVzdCBmcm9tIEJUUyA/IT9cbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJaXBiYyA9IGlwYy0+YnRzX2Nvbm47CisJCWlmICghaXBiYykgeworCQkJREVCVUdQKERJTlAsICJJRF9HRVQgZnJvbSBCU0MgYmVmb3JlIHdlIGhhdmUgSURfUkVTUCBmcm9tIEJUU1xuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlyZXQgPSB3cml0ZShiZmQtPmZkLCBpcGJjLT5pZF9yZXNwLCBpcGJjLT5pZF9yZXNwX2xlbik7CisJCWJyZWFrOworCWNhc2UgSVBBQ19NU0dUX0lEX0FDSzoKKwkJREVCVUdQKERNSSwgIklEX0FDSz8gLT4gQUNLIVxuIik7CisJCXJldCA9IHdyaXRlKGJmZC0+ZmQsIGlkX2Fjaywgc2l6ZW9mKGlkX2FjaykpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBtc2diICppcGFjY2Vzc19yZWFkX21zZyhzdHJ1Y3QgYnNjX2ZkICpiZmQsIGludCAqZXJyb3IpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2MoUFJPWFlfQUxMT0NfU0laRSwgIkFiaXMvSVAiKTsKKwlzdHJ1Y3QgaXBhY2Nlc3NfaGVhZCAqaGg7CisJaW50IGxlbiwgcmV0ID0gMDsKKworCWlmICghbXNnKSB7CisJCSplcnJvciA9IC1FTk9NRU07CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIGZpcnN0IHJlYWQgb3VyIDMtYnl0ZSBoZWFkZXIgKi8KKwloaCA9IChzdHJ1Y3QgaXBhY2Nlc3NfaGVhZCAqKSBtc2ctPmRhdGE7CisJcmV0ID0gcmVjdihiZmQtPmZkLCBtc2ctPmRhdGEsIDMsIDApOworCWlmIChyZXQgPCAwKSB7CisJCWlmIChlcnJubyAhPSBFQUdBSU4pCisJCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJyZWN2IGVycm9yOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCSplcnJvciA9IHJldDsKKwkJcmV0dXJuIE5VTEw7CisJfSBlbHNlIGlmIChyZXQgPT0gMCkgeworCQltc2diX2ZyZWUobXNnKTsKKwkJKmVycm9yID0gcmV0OworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltc2diX3B1dChtc2csIHJldCk7CisKKwkvKiB0aGVuIHJlYWQgdGUgbGVuZ3RoIGFzIHNwZWNpZmllZCBpbiBoZWFkZXIgKi8KKwltc2ctPmwyaCA9IG1zZy0+ZGF0YSArIHNpemVvZigqaGgpOworCWxlbiA9IG50b2hzKGhoLT5sZW4pOworCXJldCA9IHJlY3YoYmZkLT5mZCwgbXNnLT5sMmgsIGxlbiwgMCk7CisJaWYgKHJldCA8IGxlbikgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJzaG9ydCByZWFkIVxuIik7CisJCW1zZ2JfZnJlZShtc2cpOworCQkqZXJyb3IgPSAtRUlPOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbXNnYl9wdXQobXNnLCByZXQpOworCisJcmV0dXJuIG1zZzsKK30KKworc3RhdGljIHN0cnVjdCBpcGFfcHJveHlfY29ubiAqaXBjX2J5X3ByaXZfbnIoc3RydWN0IGlwYV9idHNfY29ubiAqaXBiYywKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgcHJpdl9ucikKK3sKKwlzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmJzY19jb25uOworCXVuc2lnbmVkIGludCB0cnhfaWQgPSBwcml2X25yID4+IDg7CisKKwlzd2l0Y2ggKHByaXZfbnIgJiAweGZmKSB7CisJY2FzZSBPTUxfRlJPTV9CVFM6IC8qIGluY29taW5nIE9NTCBkYXRhIGZyb20gQlRTLCBmb3J3YXJkIHRvIEJTQyBPTUwgKi8KKwkJYnNjX2Nvbm4gPSBpcGJjLT5ic2Nfb21sX2Nvbm47CisJCWJyZWFrOworCWNhc2UgUlNMX0ZST01fQlRTOiAvKiBpbmNvbWluZyBSU0wgZGF0YSBmcm9tIEJUUywgZm9yd2FyZCB0byBCU0MgUlNMICovCisJCWJzY19jb25uID0gaXBiYy0+YnNjX3JzbF9jb25uW3RyeF9pZF07CisJCWJyZWFrOworCWNhc2UgT01MX1RPX0JTQzogLyogaW5jb21pbmcgT01MIGRhdGEgZnJvbSBCU0MsIGZvcndhcmQgdG8gQlRTIE9NTCAqLworCQlic2NfY29ubiA9IGlwYmMtPm9tbF9jb25uOworCQlicmVhazsKKwljYXNlIFJTTF9UT19CU0M6IC8qIGluY29taW5nIFJTTCBkYXRhIGZyb20gQlNDLCBmb3J3YXJkIHRvIEJUUyBSU0wgKi8KKwkJYnNjX2Nvbm4gPSBpcGJjLT5yc2xfY29ublt0cnhfaWRdOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlic2NfY29ubiA9IE5VTEw7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gYnNjX2Nvbm47Cit9CisKK3N0YXRpYyB2b2lkIHJlY29ubl90bXJfY2Iodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXBhX3Byb3h5ICppcHAgPSBkYXRhOworCXN0cnVjdCBpcGFfYnRzX2Nvbm4gKmlwYmM7CisJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKKwlpbnQgaTsKKworCURFQlVHUChESU5QLCAiUnVubmluZyByZWNvbm5lY3QgdGltZXJcbiIpOworCisJbWVtc2V0KCZzaW4sIDAsIHNpemVvZihzaW4pKTsKKwlzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJaW5ldF9hdG9uKGJzY19pcGFkZHIsICZzaW4uc2luX2FkZHIpOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoaXBiYywgJmlwcC0+YnRzX2xpc3QsIGxpc3QpIHsKKwkJLyogaWYgT01MIHRvIEJTQyBpcyBkZWFkLCB0cnkgdG8gcmVzdG9yZSBpdCAqLworCQlpZiAoaXBiYy0+b21sX2Nvbm4gJiYgIWlwYmMtPmJzY19vbWxfY29ubikgeworCQkJc2luLnNpbl9wb3J0ID0gaHRvbnMoSVBBX1RDUF9QT1JUX09NTCk7CisJCQlsb2dwX2lwYmNfdWlkKERJTlAsIExPR0xfTk9USUNFLCBpcGJjLCAwKTsKKwkJCUxPR1BDKERJTlAsIExPR0xfTk9USUNFLCAiT01MIFRyeWluZyB0byByZWNvbm5lY3RcbiIpOworCQkJaXBiYy0+YnNjX29tbF9jb25uID0gY29ubmVjdF9ic2MoJnNpbiwgT01MX1RPX0JTQywgaXBiYyk7CisJCQlpZiAoIWlwYmMtPmJzY19vbWxfY29ubikKKwkJCQlnb3RvIHJlc2NoZWR1bGU7CisJCQlsb2dwX2lwYmNfdWlkKERJTlAsIExPR0xfTk9USUNFLCBpcGJjLCAwKTsKKwkJCUxPR1BDKERJTlAsIExPR0xfTk9USUNFLCAiT01MIFJlY29ubmVjdGVkXG4iKTsKKwkJfQorCQkvKiBpZiB3ZSAoc3RpbGwpIGRvbid0IGhhdmUgYSBPTUwgY29ubmVjdGlvbiwgc2tpcCBSU0wgKi8KKwkJaWYgKCFpcGJjLT5vbWxfY29ubiB8fCAhaXBiYy0+YnNjX29tbF9jb25uKQorCQkJY29udGludWU7CisKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaXBiYy0+cnNsX2Nvbm4pOyBpKyspIHsKKwkJCXVuc2lnbmVkIGludCBwcml2X25yOworCQkJLyogZG9uJ3QgZXN0YWJsaXNoIFJTTCBsaW5rcyB3aGljaCB3ZSBkb24ndCBoYXZlICovCisJCQlpZiAoIWlwYmMtPnJzbF9jb25uW2ldKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGlwYmMtPmJzY19yc2xfY29ubltpXSkKKwkJCQljb250aW51ZTsKKwkJCXByaXZfbnIgPSBpcGJjLT5yc2xfY29ubltpXS0+ZmQucHJpdl9ucjsKKwkJCXByaXZfbnIgJj0gfjB4ZmY7CisJCQlwcml2X25yIHw9IFJTTF9UT19CU0M7CisJCQlzaW4uc2luX3BvcnQgPSBodG9ucyhJUEFfVENQX1BPUlRfUlNMKTsKKwkJCWxvZ3BfaXBiY191aWQoRElOUCwgTE9HTF9OT1RJQ0UsIGlwYmMsIHByaXZfbnIgPj4gOCk7CisJCQlMT0dQQyhESU5QLCBMT0dMX05PVElDRSwgIlJTTCBUcnlpbmcgdG8gcmVjb25uZWN0XG4iKTsKKwkJCWlwYmMtPmJzY19yc2xfY29ubltpXSA9IGNvbm5lY3RfYnNjKCZzaW4sIHByaXZfbnIsIGlwYmMpOworCQkJaWYgKCFpcGJjLT5ic2NfcnNsX2Nvbm4pCisJCQkJZ290byByZXNjaGVkdWxlOworCQkJbG9ncF9pcGJjX3VpZChESU5QLCBMT0dMX05PVElDRSwgaXBiYywgcHJpdl9uciA+PiA4KTsKKwkJCUxPR1BDKERJTlAsIExPR0xfTk9USUNFLCAiUlNMIFJlY29ubmVjdGVkXG4iKTsKKwkJfQorCX0KKwlyZXR1cm47CisKK3Jlc2NoZWR1bGU6CisJYnNjX3NjaGVkdWxlX3RpbWVyKCZpcHAtPnJlY29ubl90aW1lciwgNSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9kZWFkX3NvY2tldChzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IGlwYV9wcm94eV9jb25uICppcGMgPSBiZmQtPmRhdGE7CQkvKiBsb2NhbCBjb25uICovCisJc3RydWN0IGlwYV9wcm94eV9jb25uICpic2NfY29ubjsJCS8qIHJlbW90ZSBjb25uICovCisJc3RydWN0IGlwYV9idHNfY29ubiAqaXBiYyA9IGlwYy0+YnRzX2Nvbm47CisJdW5zaWduZWQgaW50IHRyeF9pZCA9IGJmZC0+cHJpdl9uciA+PiA4OworCXN0cnVjdCBtc2diICptc2csICptc2cyOworCisJYnNjX3VucmVnaXN0ZXJfZmQoYmZkKTsKKwljbG9zZShiZmQtPmZkKTsKKwliZmQtPmZkID0gLTE7CisKKwkvKiBGSVhNRTogY2xlYXIgdHhfcXVldWUsIHJlbW92ZSBhbGwgcmVmZXJlbmNlcywgZXRjLiAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobXNnLCBtc2cyLCAmaXBjLT50eF9xdWV1ZSwgbGlzdCkKKwkJbXNnYl9mcmVlKG1zZyk7CisKKwlzd2l0Y2ggKGJmZC0+cHJpdl9uciAmIDB4ZmYpIHsKKwljYXNlIE9NTF9GUk9NX0JUUzogLyogaW5jb21pbmcgT01MIGRhdGEgZnJvbSBCVFMsIGZvcndhcmQgdG8gQlNDIE9NTCAqLworCQlpcGJjLT5vbWxfY29ubiA9IE5VTEw7CisJCWJzY19jb25uID0gaXBiYy0+YnNjX29tbF9jb25uOworCQkvKiBjbG9zZSB0aGUgY29ubmVjdGlvbiB0byB0aGUgQlNDICovCisJCWJzY191bnJlZ2lzdGVyX2ZkKCZic2NfY29ubi0+ZmQpOworCQljbG9zZShic2NfY29ubi0+ZmQuZmQpOworCQlsbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1zZywgbXNnMiwgJmJzY19jb25uLT50eF9xdWV1ZSwgbGlzdCkKKwkJCW1zZ2JfZnJlZShtc2cpOworCQl0YWxsb2NfZnJlZShic2NfY29ubik7CisJCWlwYmMtPmJzY19vbWxfY29ubiA9IE5VTEw7CisJCS8qIEZJWE1FOiBkbyB3ZSBuZWVkIHRvIGRlbGV0ZSB0aGUgZW50aXJlIGlwYmMgPyAqLworCQlicmVhazsKKwljYXNlIFJTTF9GUk9NX0JUUzogLyogaW5jb21pbmcgUlNMIGRhdGEgZnJvbSBCVFMsIGZvcndhcmQgdG8gQlNDIFJTTCAqLworCQlpcGJjLT5yc2xfY29ublt0cnhfaWRdID0gTlVMTDsKKwkJYnNjX2Nvbm4gPSBpcGJjLT5ic2NfcnNsX2Nvbm5bdHJ4X2lkXTsKKwkJLyogY2xvc2UgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIEJTQyAqLworCQlic2NfdW5yZWdpc3Rlcl9mZCgmYnNjX2Nvbm4tPmZkKTsKKwkJY2xvc2UoYnNjX2Nvbm4tPmZkLmZkKTsKKwkJbGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtc2csIG1zZzIsICZic2NfY29ubi0+dHhfcXVldWUsIGxpc3QpCisJCQltc2diX2ZyZWUobXNnKTsKKwkJdGFsbG9jX2ZyZWUoYnNjX2Nvbm4pOworCQlpcGJjLT5ic2NfcnNsX2Nvbm5bdHJ4X2lkXSA9IE5VTEw7CisJCWJyZWFrOworCWNhc2UgT01MX1RPX0JTQzogLyogaW5jb21pbmcgT01MIGRhdGEgZnJvbSBCU0MsIGZvcndhcmQgdG8gQlRTIE9NTCAqLworCQlpcGJjLT5ic2Nfb21sX2Nvbm4gPSBOVUxMOworCQlic2NfY29ubiA9IGlwYmMtPm9tbF9jb25uOworCQkvKiBzdGFydCByZWNvbm5lY3QgdGltZXIgKi8KKwkJYnNjX3NjaGVkdWxlX3RpbWVyKCZpcHAtPnJlY29ubl90aW1lciwgNSwgMCk7CisJCWJyZWFrOworCWNhc2UgUlNMX1RPX0JTQzogLyogaW5jb21pbmcgUlNMIGRhdGEgZnJvbSBCU0MsIGZvcndhcmQgdG8gQlRTIFJTTCAqLworCQlpcGJjLT5ic2NfcnNsX2Nvbm5bdHJ4X2lkXSA9IE5VTEw7CisJCWJzY19jb25uID0gaXBiYy0+cnNsX2Nvbm5bdHJ4X2lkXTsKKwkJLyogc3RhcnQgcmVjb25uZWN0IHRpbWVyICovCisJCWJzY19zY2hlZHVsZV90aW1lcigmaXBwLT5yZWNvbm5fdGltZXIsIDUsIDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlic2NfY29ubiA9IE5VTEw7CisJCWJyZWFrOworCX0KKworCXRhbGxvY19mcmVlKGlwYyk7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX3RjcF9yZWFkKHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmlwYyA9IGJmZC0+ZGF0YTsKKwlzdHJ1Y3QgaXBhX2J0c19jb25uICppcGJjID0gaXBjLT5idHNfY29ubjsKKwlzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmJzY19jb25uOworCXN0cnVjdCBtc2diICptc2c7CisJc3RydWN0IGlwYWNjZXNzX2hlYWQgKmhoOworCWludCByZXQgPSAwOworCWNoYXIgKmJ0c2JzYzsKKworCWlmICgoYmZkLT5wcml2X25yICYgMHhmZikgPD0gMikKKwkJYnRzYnNjID0gIkJUUyI7CisJZWxzZQorCQlidHNic2MgPSAiQlNDIjsKKworCW1zZyA9IGlwYWNjZXNzX3JlYWRfbXNnKGJmZCwgJnJldCk7CisJaWYgKCFtc2cpIHsKKwkJaWYgKHJldCA9PSAwKSB7CisJCQlsb2dwX2lwYmNfdWlkKERJTlAsIExPR0xfTk9USUNFLCBpcGJjLCBiZmQtPnByaXZfbnIgPj4gOCk7CisJCQlMT0dQQyhESU5QLCBMT0dMX05PVElDRSwgIiVzIGRpc2FwcGVhcmVkLCAiCisJCQkgICAgICJkZWFkIHNvY2tldFxuIiwgYnRzYnNjKTsKKwkJCWhhbmRsZV9kZWFkX3NvY2tldChiZmQpOworCQl9CisJCXJldHVybiByZXQ7CisJfQorCisJbXNnYl9wdXQobXNnLCByZXQpOworCWxvZ3BfaXBiY191aWQoRE1JLCBMT0dMX0RFQlVHLCBpcGJjLCBiZmQtPnByaXZfbnIgPj4gOCk7CisJREVCVUdQQyhETUksICJSWDwtJXM6ICVzXG4iLCBidHNic2MsIGhleGR1bXAobXNnLT5kYXRhLCBtc2ctPmxlbikpOworCisJaGggPSAoc3RydWN0IGlwYWNjZXNzX2hlYWQgKikgbXNnLT5kYXRhOworCWlmIChoaC0+cHJvdG8gPT0gSVBBQ19QUk9UT19JUEFDQ0VTUykgeworCQlyZXQgPSBpcGFjY2Vzc19yY3Ztc2coaXBjLCBtc2csIGJmZCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlic2NfdW5yZWdpc3Rlcl9mZChiZmQpOworCQkJY2xvc2UoYmZkLT5mZCk7CisJCQliZmQtPmZkID0gLTE7CisJCQl0YWxsb2NfZnJlZShiZmQpOworCQl9CisJCS8qIHdlIGRvIG5vdCBmb3J3YXJkIHRoZSBDQ00gcHJvdG9jb2wgdGhyb3VnaCB0aGUKKwkJICogcHJveHkgYnV0IHJhdGhlciB0ZXJtaW5hdGUgaXQgb3Vyc2VsdmVzICovCisJCW1zZ2JfZnJlZShtc2cpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmICghaXBiYykgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsCisJCSAgICAgInJlY2VpdmVkICVzIHBhY2tldCBidXQgbm8gaXBjLT5idHNfY29ubj8hP1xuIiwgYnRzYnNjKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCXJldHVybiAtRUlPOworCX0KKworCWJzY19jb25uID0gaXBjX2J5X3ByaXZfbnIoaXBiYywgYmZkLT5wcml2X25yKTsKKwlpZiAoYnNjX2Nvbm4pIHsKKwkJLyogZW5xdWV1ZSBwYWNrZXQgdG93YXJkcyBCU0MgKi8KKwkJbXNnYl9lbnF1ZXVlKCZic2NfY29ubi0+dHhfcXVldWUsIG1zZyk7CisJCS8qIG1hcmsgcmVzcGVjdGl2ZSBmaWxlZGVzY3JpcHRvciBhcyAnd2Ugd2FudCB0byB3cml0ZScgKi8KKwkJYnNjX2Nvbm4tPmZkLndoZW4gfD0gQlNDX0ZEX1dSSVRFOworCX0gZWxzZSB7CisJCWxvZ3BfaXBiY191aWQoRElOUCwgTE9HTF9JTkZPLCBpcGJjLCBiZmQtPnByaXZfbnIgPj4gOCk7CisJCUxPR1BDKERJTlAsIExPR0xfSU5GTywgIkRyb3BwaW5nIHBhY2tldCBmcm9tICVzLCAiCisJCSAgICAgInNpbmNlIHJlbW90ZSBjb25uZWN0aW9uIGlzIGRlYWRcbiIsIGJ0c2JzYyk7CisJCW1zZ2JfZnJlZShtc2cpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIGEgVENQIHNvY2tldCBpcyByZWFkeSB0byBiZSB3cml0dGVuIHRvICovCitzdGF0aWMgaW50IGhhbmRsZV90Y3Bfd3JpdGUoc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCBpcGFfcHJveHlfY29ubiAqaXBjID0gYmZkLT5kYXRhOworCXN0cnVjdCBpcGFfYnRzX2Nvbm4gKmlwYmMgPSBpcGMtPmJ0c19jb25uOworCXN0cnVjdCBsbGlzdF9oZWFkICpsaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCWNoYXIgKmJ0c2JzYzsKKwlpbnQgcmV0OworCisJaWYgKChiZmQtPnByaXZfbnIgJiAweGZmKSA8PSAyKQorCQlidHNic2MgPSAiQlRTIjsKKwllbHNlCisJCWJ0c2JzYyA9ICJCU0MiOworCisKKwkvKiBnZXQgdGhlIG5leHQgbXNnIGZvciB0aGlzIHRpbWVzbG90ICovCisJaWYgKGxsaXN0X2VtcHR5KCZpcGMtPnR4X3F1ZXVlKSkgeworCQliZmQtPndoZW4gJj0gfkJTQ19GRF9XUklURTsKKwkJcmV0dXJuIDA7CisJfQorCWxoID0gaXBjLT50eF9xdWV1ZS5uZXh0OworCWxsaXN0X2RlbChsaCk7CisJbXNnID0gbGxpc3RfZW50cnkobGgsIHN0cnVjdCBtc2diLCBsaXN0KTsKKworCWxvZ3BfaXBiY191aWQoRE1JLCBMT0dMX0RFQlVHLCBpcGJjLCBiZmQtPnByaXZfbnIgPj4gOCk7CisJREVCVUdQQyhETUksICJUWCAlMDR4OiAlc1xuIiwgYmZkLT5wcml2X25yLAorCQloZXhkdW1wKG1zZy0+ZGF0YSwgbXNnLT5sZW4pKTsKKworCXJldCA9IHNlbmQoYmZkLT5mZCwgbXNnLT5kYXRhLCBtc2ctPmxlbiwgMCk7CisJbXNnYl9mcmVlKG1zZyk7CisKKwlpZiAocmV0ID09IDApIHsKKwkJbG9ncF9pcGJjX3VpZChESU5QLCBMT0dMX05PVElDRSwgaXBiYywgYmZkLT5wcml2X25yID4+IDgpOworCQlMT0dQKERJTlAsIExPR0xfTk9USUNFLCAiJXMgZGlzYXBwZWFyZWQsIGRlYWQgc29ja2V0XG4iLCBidHNic2MpOworCQloYW5kbGVfZGVhZF9zb2NrZXQoYmZkKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBjYWxsYmFjayBmcm9tIHNlbGVjdC5jIGluIGNhc2Ugb25lIG9mIHRoZSBmZCdzIGNhbiBiZSByZWFkL3dyaXR0ZW4gKi8KK3N0YXRpYyBpbnQgaXBhY2Nlc3NfZmRfY2Ioc3RydWN0IGJzY19mZCAqYmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKHdoYXQgJiBCU0NfRkRfUkVBRCkgeworCQlyYyA9IGhhbmRsZV90Y3BfcmVhZChiZmQpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCX0KKwlpZiAod2hhdCAmIEJTQ19GRF9XUklURSkKKwkJcmMgPSBoYW5kbGVfdGNwX3dyaXRlKGJmZCk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIGNhbGxiYWNrIG9mIHRoZSBsaXN0ZW5pbmcgZmlsZWRlc2NyaXB0b3IgKi8KK3N0YXRpYyBpbnQgbGlzdGVuX2ZkX2NiKHN0cnVjdCBic2NfZmQgKmxpc3Rlbl9iZmQsIHVuc2lnbmVkIGludCB3aGF0KQoreworCWludCByZXQ7CisJc3RydWN0IGlwYV9wcm94eV9jb25uICppcGM7CisJc3RydWN0IGJzY19mZCAqYmZkOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzYTsKKwlzb2NrbGVuX3Qgc2FfbGVuID0gc2l6ZW9mKHNhKTsKKworCWlmICghKHdoYXQgJiBCU0NfRkRfUkVBRCkpCisJCXJldHVybiAwOworCisJcmV0ID0gYWNjZXB0KGxpc3Rlbl9iZmQtPmZkLCAoc3RydWN0IHNvY2thZGRyICopICZzYSwgJnNhX2xlbik7CisJaWYgKHJldCA8IDApIHsKKwkJcGVycm9yKCJhY2NlcHQiKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJREVCVUdQKERJTlAsICJhY2NlcHQoKWVkIG5ldyAlcyBsaW5rIGZyb20gJXNcbiIsCisJCShsaXN0ZW5fYmZkLT5wcml2X25yICYgMHhmZikgPT0gT01MX0ZST01fQlRTID8gIk9NTCIgOiAiUlNMIiwKKwkJaW5ldF9udG9hKHNhLnNpbl9hZGRyKSk7CisKKwlpcGMgPSBhbGxvY19jb25uKCk7CisJaWYgKCFpcGMpIHsKKwkJY2xvc2UocmV0KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYmZkID0gJmlwYy0+ZmQ7CisJYmZkLT5mZCA9IHJldDsKKwliZmQtPmRhdGEgPSBpcGM7CisJYmZkLT5wcml2X25yID0gbGlzdGVuX2JmZC0+cHJpdl9ucjsKKwliZmQtPmNiID0gaXBhY2Nlc3NfZmRfY2I7CisJYmZkLT53aGVuID0gQlNDX0ZEX1JFQUQ7CisJcmV0ID0gYnNjX3JlZ2lzdGVyX2ZkKGJmZCk7CisJaWYgKHJldCA8IDApIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiY291bGQgbm90IHJlZ2lzdGVyIEZEXG4iKTsKKwkJY2xvc2UoYmZkLT5mZCk7CisJCXRhbGxvY19mcmVlKGlwYyk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogUmVxdWVzdCBJRC4gRklYTUU6IHJlcXVlc3QgTE9DQVRJT04sIEhXL1NXIFZFcnNpb24sIFVuaXQgTmFtZSwgU2Vybm8gKi8KKwlyZXQgPSB3cml0ZShiZmQtPmZkLCBpZF9yZXEsIHNpemVvZihpZF9yZXEpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1ha2VfbGlzdGVuX3NvY2soc3RydWN0IGJzY19mZCAqYmZkLCB1X2ludDE2X3QgcG9ydCwgaW50IHByaXZfbnIsCisJCSAgICAgaW50ICgqY2IpKHN0cnVjdCBic2NfZmQgKmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkpCit7CisJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisJaW50IHJldCwgb24gPSAxOworCisJYmZkLT5mZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApOworCWJmZC0+Y2IgPSBjYjsKKwliZmQtPndoZW4gPSBCU0NfRkRfUkVBRDsKKwliZmQtPnByaXZfbnIgPSBwcml2X25yOworCisJbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOworCWFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworCWlmICghbGlzdGVuX2lwYWRkcikKKwkJYWRkci5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOworCWVsc2UKKwkJaW5ldF9hdG9uKGxpc3Rlbl9pcGFkZHIsICZhZGRyLnNpbl9hZGRyKTsKKworCXNldHNvY2tvcHQoYmZkLT5mZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmb24sIHNpemVvZihvbikpOworCisJcmV0ID0gYmluZChiZmQtPmZkLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpOworCWlmIChyZXQgPCAwKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgImNvdWxkIG5vdCBiaW5kIGxpc3RlbiBzb2NrZXQgJXNcbiIsCisJCQlzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXQgPSBsaXN0ZW4oYmZkLT5mZCwgMSk7CisJaWYgKHJldCA8IDApIHsKKwkJcGVycm9yKCJsaXN0ZW4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBic2NfcmVnaXN0ZXJfZmQoYmZkKTsKKwlpZiAocmV0IDwgMCkgeworCQlwZXJyb3IoInJlZ2lzdGVyX2xpc3Rlbl9mZCIpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKK30KKworLyogQWN0aXZlbHkgY29ubmVjdCB0byBhIEJTQy4gICovCitzdGF0aWMgc3RydWN0IGlwYV9wcm94eV9jb25uICpjb25uZWN0X2JzYyhzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNhLCBpbnQgcHJpdl9uciwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmlwYzsKKwlzdHJ1Y3QgYnNjX2ZkICpiZmQ7CisJaW50IHJldCwgb24gPSAxOworCisJaXBjID0gYWxsb2NfY29ubigpOworCWlmICghaXBjKQorCQlyZXR1cm4gTlVMTDsKKworCWlwYy0+YnRzX2Nvbm4gPSBkYXRhOworCisJYmZkID0gJmlwYy0+ZmQ7CisJYmZkLT5mZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApOworCWJmZC0+Y2IgPSBpcGFjY2Vzc19mZF9jYjsKKwliZmQtPndoZW4gPSBCU0NfRkRfUkVBRCB8IEJTQ19GRF9XUklURTsKKwliZmQtPmRhdGEgPSBpcGM7CisJYmZkLT5wcml2X25yID0gcHJpdl9ucjsKKworCXNldHNvY2tvcHQoYmZkLT5mZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmb24sIHNpemVvZihvbikpOworCisJcmV0ID0gY29ubmVjdChiZmQtPmZkLCAoc3RydWN0IHNvY2thZGRyICopIHNhLCBzaXplb2YoKnNhKSk7CisJaWYgKHJldCA8IDApIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiY291bGQgbm90IGNvbm5lY3Qgc29ja2V0XG4iKTsKKwkJY2xvc2UoYmZkLT5mZCk7CisJCXRhbGxvY19mcmVlKGlwYyk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIHByZS1maWxsIHR4X3F1ZXVlIHdpdGggaWRlbnRpdHkgcmVxdWVzdCAqLworCXJldCA9IGJzY19yZWdpc3Rlcl9mZChiZmQpOworCWlmIChyZXQgPCAwKSB7CisJCWNsb3NlKGJmZC0+ZmQpOworCQl0YWxsb2NfZnJlZShpcGMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gaXBjOworfQorCitzdGF0aWMgaW50IGlwYWNjZXNzX3Byb3h5X3NldHVwKHZvaWQpCit7CisJaW50IHJldDsKKworCWlwcCA9IHRhbGxvY196ZXJvKHRhbGxfYnNjX2N0eCwgc3RydWN0IGlwYV9wcm94eSk7CisJaWYgKCFpcHApCisJCXJldHVybiAtRU5PTUVNOworCUlOSVRfTExJU1RfSEVBRCgmaXBwLT5idHNfbGlzdCk7CisJaXBwLT5yZWNvbm5fdGltZXIuY2IgPSByZWNvbm5fdG1yX2NiOworCWlwcC0+cmVjb25uX3RpbWVyLmRhdGEgPSBpcHA7CisKKwkvKiBMaXN0ZW4gZm9yIE9NTCBjb25uZWN0aW9ucyAqLworCXJldCA9IG1ha2VfbGlzdGVuX3NvY2soJmlwcC0+b21sX2xpc3Rlbl9mZCwgSVBBX1RDUF9QT1JUX09NTCwKKwkJCQlPTUxfRlJPTV9CVFMsIGxpc3Rlbl9mZF9jYik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBMaXN0ZW4gZm9yIFJTTCBjb25uZWN0aW9ucyAqLworCXJldCA9IG1ha2VfbGlzdGVuX3NvY2soJmlwcC0+cnNsX2xpc3Rlbl9mZCwgSVBBX1RDUF9QT1JUX1JTTCwKKwkJCQlSU0xfRlJPTV9CVFMsIGxpc3Rlbl9mZF9jYik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzaWduYWxfaGFuZGxlcihpbnQgc2lnbmFsKQoreworCWZwcmludGYoc3Rkb3V0LCAic2lnbmFsICV1IHJlY2VpdmVkXG4iLCBzaWduYWwpOworCisJc3dpdGNoIChzaWduYWwpIHsKKwljYXNlIFNJR0FCUlQ6CisJCS8qIGluIGNhc2Ugb2YgYWJvcnQsIHdlIHdhbnQgdG8gb2J0YWluIGEgdGFsbG9jIHJlcG9ydAorCQkgKiBhbmQgdGhlbiByZXR1cm4gdG8gdGhlIGNhbGxlciwgd2hvIHdpbGwgYWJvcnQgdGhlIHByb2Nlc3MgKi8KKwljYXNlIFNJR1VTUjE6CisJCXRhbGxvY19yZXBvcnRfZnVsbCh0YWxsX2JzY19jdHgsIHN0ZGVycik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCByYzsKKworCWxpc3Rlbl9pcGFkZHIgPSAiMTkyLjE2OC4xMDAuMTEiOworCWJzY19pcGFkZHIgPSAiMTkyLjE2OC4xMDAuMjM5IjsKKworCXRhbGxfYnNjX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdChOVUxMLCAxLCAiaXBhY2Nlc3MtcHJveHkiKTsKKworCWxvZ19pbml0KCZsb2dfaW5mbyk7CisJc3RkZXJyX3RhcmdldCA9IGxvZ190YXJnZXRfY3JlYXRlX3N0ZGVycigpOworCWxvZ19hZGRfdGFyZ2V0KHN0ZGVycl90YXJnZXQpOworCWxvZ19zZXRfYWxsX2ZpbHRlcihzdGRlcnJfdGFyZ2V0LCAxKTsKKwlsb2dfcGFyc2VfY2F0ZWdvcnlfbWFzayhzdGRlcnJfdGFyZ2V0LCAiRElOUDpETUkiKTsKKworCXJjID0gaXBhY2Nlc3NfcHJveHlfc2V0dXAoKTsKKwlpZiAocmMgPCAwKQorCQlleGl0KDEpOworCisJc2lnbmFsKFNJR1VTUjEsICZzaWduYWxfaGFuZGxlcik7CisJc2lnbmFsKFNJR0FCUlQsICZzaWduYWxfaGFuZGxlcik7CisKKwl3aGlsZSAoMSkgeworCQlic2Nfc2VsZWN0X21haW4oMCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvaXNkbnN5bmMuYyBiL29wZW5ic2Mvc3JjL2lzZG5zeW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg4MTlhYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2lzZG5zeW5jLmMKQEAgLTAsMCArMSwxOTIgQEAKKy8qIGlzZG5zeW5jLmMKKyAqCisgKiBBdXRob3IgICAgICAgQW5kcmVhcyBFdmVyc2JlcmcgPGpvbGx5QGV2ZXJzYmVyZy5ldT4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlICJtSVNETmlmLmgiCisjZGVmaW5lIE1JU0ROX09MRF9BRl9DT01QQVRJQklMSVRZCisjZGVmaW5lIEFGX0NPTVBBVElCSUxJVFlfRlVOQworI2luY2x1ZGUgImNvbXBhdF9hZl9pc2RuLmgiCisKK2ludCBjYXJkID0gMDsKK2ludCBzb2NrID0gLTE7CisKK2ludCBtSVNETl9vcGVuKHZvaWQpCit7CisJaW50CQkJZmQsIHJldDsKKwlzdHJ1Y3QgbUlTRE5fZGV2aW5mbwlkZXZpbmZvOworCXN0cnVjdCBzb2NrYWRkcl9tSVNETglsMmFkZHI7CisKKwlmZCA9IHNvY2tldChQRl9JU0ROLCBTT0NLX1JBVywgSVNETl9QX0JBU0UpOworCWlmIChmZCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3Qgb3BlbiBzb2NrZXQgKCVzKVxuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIGZkOworCX0KKwlkZXZpbmZvLmlkID0gY2FyZDsKKwlyZXQgPSBpb2N0bChmZCwgSU1HRVRERVZJTkZPLCAmZGV2aW5mbyk7CisJaWYgKHJldCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsImNvdWxkIG5vdCBzZW5kIElPQ1RMIElNR0VUQ09VTlQgKCVzKVxuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gcmV0OworCX0KKwljbG9zZShmZCk7CisJaWYgKCEoZGV2aW5mby5EcHJvdG9jb2xzICYgKDEgPDwgSVNETl9QX1RFX1MwKSkKKwkgJiYgIShkZXZpbmZvLkRwcm90b2NvbHMgJiAoMSA8PCBJU0ROX1BfVEVfRTEpKSkgeworCQlmcHJpbnRmKHN0ZGVyciwiSW50ZXJmYWNlIGRvZXMgbm90IHN1cHBvcnQgVEUgbW9kZSAoJXMpXG4iLCBzdHJlcnJvcihlcnJubykpOworCQljbG9zZShmZCk7CisJCXJldHVybiByZXQ7CisJfQorCWZkID0gc29ja2V0KFBGX0lTRE4sIFNPQ0tfREdSQU0sIElTRE5fUF9MQVBEX1RFKTsKKwlpZiAoZmQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCJjb3VsZCBub3Qgb3BlbiBJU0ROX1BfTEFQRF9URSBzb2NrZXQgKCVzKVxuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIGZkOworCX0KKwlsMmFkZHIuZmFtaWx5ID0gQUZfSVNETjsKKwlsMmFkZHIuZGV2ID0gY2FyZDsKKwlsMmFkZHIuY2hhbm5lbCA9IDA7CisJbDJhZGRyLnNhcGkgPSAwOworCWwyYWRkci50ZWkgPSAwOworCXJldCA9IGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmbDJhZGRyLCBzaXplb2YobDJhZGRyKSk7CisJaWYgKHJldCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsImNvdWxkIG5vdCBiaW5kIHNvY2tldCBmb3IgY2FyZCAlZCAoJXMpXG4iLCBjYXJkLCBzdHJlcnJvcihlcnJubykpOworCQljbG9zZShmZCk7CisJCXJldHVybiByZXQ7CisJfQorCXNvY2sgPSBmZDsKKworCXJldHVybiBzb2NrOworfQorCisKK3ZvaWQgbUlTRE5faGFuZGxlKHZvaWQpCit7CisJaW50IHJldDsKKwlmZF9zZXQgcmZkOworCXN0cnVjdCB0aW1ldmFsIHR2OworCXN0cnVjdCBzb2NrYWRkcl9tSVNETiBhZGRyOworCXNvY2tsZW5fdCBhbGVuOworCXVuc2lnbmVkIGNoYXIgYnVmZmVyWzIwNDhdOworCXN0cnVjdCBtSVNETmhlYWQgKmhoID0gKHN0cnVjdCBtSVNETmhlYWQgKilidWZmZXI7CisJaW50IGwxID0gMCwgbDIgPSAwLCB0ZWkgPSAwOworCisJd2hpbGUoMSkgeworYWdhaW46CisJCUZEX1pFUk8oJnJmZCk7CisJCUZEX1NFVChzb2NrLCAmcmZkKTsKKwkJdHYudHZfc2VjID0gMjsKKwkJdHYudHZfdXNlYyA9IDA7CisJCXJldCA9IHNlbGVjdChzb2NrKzEsICZyZmQsIE5VTEwsIE5VTEwsICZ0dik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gRUlOVFIpCisJCQkJY29udGludWU7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzIGFib3J0ZWQ6ICVzXG4iLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoRkRfSVNTRVQoc29jaywgJnJmZCkpIHsKKwkJCWFsZW4gPSBzaXplb2YoYWRkcik7CisJCQlyZXQgPSByZWN2ZnJvbShzb2NrLCBidWZmZXIsIHNpemVvZihidWZmZXIpLCAwLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCAmYWxlbik7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiJXMgcmVhZCBzb2NrZXQgZXJyb3IgJXNcbiIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKKwkJCX0gZWxzZSBpZiAocmV0IDwgTUlTRE5fSEVBREVSX0xFTikgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzIHJlYWQgc29ja2V0IHNob3IgZnJhbWVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQl9IGVsc2UgeworCQkJCXN3aXRjaChoaC0+cHJpbSkgeworCQkJCQljYXNlIE1QSF9BQ1RJVkFURV9JTkQ6CisJCQkJCWNhc2UgUEhfQUNUSVZBVEVfSU5EOgorCQkJCQkJaWYgKCFsMSkgeworCQkJCQkJCXByaW50ZigiUEhfQUNUSVZBVEVcbiIpOworCQkJCQkJCXByaW50ZigiKioqIFN5bmMgYXZhaWxhYmxlIGZyb20gaW50ZXJmYWNlIDotKVxuIik7CisJCQkJCQkJbDEgPSAxOworCQkJCQkJfQorCQkJCQkJZ290byBhZ2FpbjsKKwkJCQkJYnJlYWs7CisJCQkJCWNhc2UgTVBIX0RFQUNUSVZBVEVfSU5EOgorCQkJCQljYXNlIFBIX0RFQUNUSVZBVEVfSU5EOgorCQkJCQkJaWYgKGwxKSB7CisJCQkJCQkJcHJpbnRmKCJQSF9ERUFDVElWQVRFXG4iKTsKKwkJCQkJCQlwcmludGYoIioqKiBMb3N0IHN5bmMgb24gaW50ZXJmYWNlICAgICAgICA6LShcbiIpOworCQkJCQkJCWwxID0gMDsKKwkJCQkJCX0KKwkJCQkJCWdvdG8gYWdhaW47CisJCQkJCWJyZWFrOworCQkJCQljYXNlIERMX0VTVEFCTElTSF9JTkQ6CisJCQkJCWNhc2UgRExfRVNUQUJMSVNIX0NORjoKKwkJCQkJCXByaW50ZigiRExfRVNUQUJMSVNIXG4iKTsKKwkJCQkJCWwyID0gMTsKKwkJCQkJCWdvdG8gYWdhaW47CisJCQkJCWJyZWFrOworCQkJCQljYXNlIERMX1JFTEVBU0VfSU5EOgorCQkJCQljYXNlIERMX1JFTEVBU0VfQ05GOgorCQkJCQkJcHJpbnRmKCJETF9SRUxFQVNFXG4iKTsKKwkJCQkJCWwyID0gMDsKKwkJCQkJCWdvdG8gYWdhaW47CisJCQkJCWJyZWFrOworCQkJCQljYXNlIERMX0lORk9STUFUSU9OX0lORDoKKwkJCQkJCXByaW50ZigiRExfSU5GT1JNQVRJT04gKHRlaSAlZCBzYXBpICVkKVxuIiwgYWRkci50ZWksIGFkZHIuc2FwaSk7CisJCQkJCQl0ZWkgPSAxOworCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKy8vCQkJCQkJcHJpbnRmKCJwcmltICV4XG4iLCBoaC0+cHJpbSk7CisJCQkJCQlnb3RvIGFnYWluOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAodGVpICYmICFsMikgeworCQkJaGgtPnByaW0gPSBETF9FU1RBQkxJU0hfUkVROworCQkJcHJpbnRmKCItPiBhY3RpdmF0aW5nIGxheWVyIDJcbiIpOworCQkJc2VuZHRvKHNvY2ssIGJ1ZmZlciwgTUlTRE5fSEVBREVSX0xFTiwgMCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgYWxlbik7CisJCX0KKwl9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IHJldDsKKworCWlmIChhcmdjIDw9IDEpCisJeworCQlwcmludGYoIlVzYWdlOiAlcyA8Y2FyZD5cblxuIiwgYXJndlswXSk7CisJCXByaW50ZigiT3BlbnMgZ2l2ZW4gY2FyZCBudW1iZXIgaW4gVEUtbW9kZSBQVFAgYW5kIHRyaWVzIHRvIGtlZXAgbGF5ZXIgMiBlc3RhYmxpc2hlZC5cbiIpOworCQlwcmludGYoIlRoaXMga2VlcHMgbGF5ZXIgMSBhY3RpdmF0ZWQgdG8gcmV0cmlldmUgYSBzdGVhZHkgc3luYyBzaWduYWwgZnJvbSBuZXR3b3JrLlxuIik7CisJCXJldHVybigwKTsKKwl9CisKKwljYXJkID0gYXRvaShhcmd2WzFdKTsKKworCWluaXRfYWZfaXNkbigpOworCisJaWYgKChyZXQgPSBtSVNETl9vcGVuKCkgPCAwKSkKKwkJcmV0dXJuKHJldCk7CisKKwltSVNETl9oYW5kbGUoKTsKKworCWNsb3NlKHNvY2spOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9tZWFzX3JlcC5jIGIvb3BlbmJzYy9zcmMvbWVhc19yZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjljYzFhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvbWVhc19yZXAuYwpAQCAtMCwwICsxLDExNCBAQAorLyogTWVhc3VyZW1lbnQgUmVwb3J0IFByb2Nlc3NpbmcgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWVhc19yZXAuaD4KKworc3RhdGljIGludCBnZXRfZmllbGQoY29uc3Qgc3RydWN0IGdzbV9tZWFzX3JlcCAqcmVwLAorCQkgICAgIGVudW0gbWVhc19yZXBfZmllbGQgZmllbGQpCit7CisJc3dpdGNoIChmaWVsZCkgeworCWNhc2UgTUVBU19SRVBfRExfUlhMRVZfRlVMTDoKKwkJcmV0dXJuIHJlcC0+ZGwuZnVsbC5yeF9sZXY7CisJY2FzZSBNRUFTX1JFUF9ETF9SWExFVl9TVUI6CisJCXJldHVybiByZXAtPmRsLnN1Yi5yeF9sZXY7CisJY2FzZSBNRUFTX1JFUF9ETF9SWFFVQUxfRlVMTDoKKwkJcmV0dXJuIHJlcC0+ZGwuZnVsbC5yeF9xdWFsOworCWNhc2UgTUVBU19SRVBfRExfUlhRVUFMX1NVQjoKKwkJcmV0dXJuIHJlcC0+ZGwuc3ViLnJ4X3F1YWw7CisJY2FzZSBNRUFTX1JFUF9VTF9SWExFVl9GVUxMOgorCQlyZXR1cm4gcmVwLT51bC5mdWxsLnJ4X2xldjsKKwljYXNlIE1FQVNfUkVQX1VMX1JYTEVWX1NVQjoKKwkJcmV0dXJuIHJlcC0+dWwuc3ViLnJ4X2xldjsKKwljYXNlIE1FQVNfUkVQX1VMX1JYUVVBTF9GVUxMOgorCQlyZXR1cm4gcmVwLT51bC5mdWxsLnJ4X3F1YWw7CisJY2FzZSBNRUFTX1JFUF9VTF9SWFFVQUxfU1VCOgorCQlyZXR1cm4gcmVwLT51bC5zdWIucnhfcXVhbDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCit1bnNpZ25lZCBpbnQgY2FsY19pbml0aWFsX2lkeCh1bnNpZ25lZCBpbnQgYXJyYXlfc2l6ZSwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBtZWFzX3JlcF9pZHgsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgbnVtX3ZhbHVlcykKK3sKKwlpbnQgb2ZmcywgaWR4OworCisJLyogZnJvbSB3aGljaCBlbGVtZW50IGRvIHdlIG5lZWQgdG8gc3RhcnQgaWYgd2UncmUgaW50ZXJlc3RlZAorCSAqIGluIGFuIGF2ZXJhZ2Ugb2YgJ251bScgZWxlbWVudHMgKi8KKwlvZmZzID0gbWVhc19yZXBfaWR4IC0gbnVtX3ZhbHVlczsKKworCWlmIChvZmZzIDwgMCkKKwkJaWR4ID0gYXJyYXlfc2l6ZSArIG9mZnM7CisJZWxzZQorCQlpZHggPSBvZmZzOworCisJcmV0dXJuIGlkeDsKK30KKworLyogb2J0YWluIGFuIGF2ZXJhZ2Ugb3ZlciB0aGUgbGFzdCAnbnVtJyBmaWVsZHMgaW4gdGhlIG1lYXMgcmVwcyAqLworaW50IGdldF9tZWFzX3JlcF9hdmcoY29uc3Qgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sCisJCSAgICAgZW51bSBtZWFzX3JlcF9maWVsZCBmaWVsZCwgdW5zaWduZWQgaW50IG51bSkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgaWR4OworCWludCBhdmcgPSAwOworCisJaWR4ID0gY2FsY19pbml0aWFsX2lkeChBUlJBWV9TSVpFKGxjaGFuLT5tZWFzX3JlcCksCisJCQkJbGNoYW4tPm1lYXNfcmVwX2lkeCwgbnVtKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQlpbnQgaiA9IChpZHgraSkgJSBBUlJBWV9TSVpFKGxjaGFuLT5tZWFzX3JlcCk7CisKKwkJYXZnICs9IGdldF9maWVsZCgmbGNoYW4tPm1lYXNfcmVwW2pdLCBmaWVsZCk7CisJfQorCisJcmV0dXJuIGF2ZyAvIG51bTsKK30KKworLyogQ2hlY2sgaWYgTiBvdXQgb2YgTSBsYXN0IHZhbHVlcyBmb3IgRklFTEQgYXJlID49IGJkICovCitpbnQgbWVhc19yZXBfbl9vdXRfb2ZfbV9iZShjb25zdCBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwKKwkJCWVudW0gbWVhc19yZXBfZmllbGQgZmllbGQsCisJCQl1bnNpZ25lZCBpbnQgbiwgdW5zaWduZWQgaW50IG0sIGludCBiZSkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgaWR4OworCWludCBjb3VudCA9IDA7CisKKwlpZHggPSBjYWxjX2luaXRpYWxfaWR4KEFSUkFZX1NJWkUobGNoYW4tPm1lYXNfcmVwKSwKKwkJCQlsY2hhbi0+bWVhc19yZXBfaWR4LCBtKTsKKworCWZvciAoaSA9IDA7IGkgPCBtOyBpKyspIHsKKwkJaW50IGogPSAoaWR4ICsgaSkgJSBBUlJBWV9TSVpFKGxjaGFuLT5tZWFzX3JlcCk7CisJCWludCB2YWwgPSBnZXRfZmllbGQoJmxjaGFuLT5tZWFzX3JlcFtqXSwgZmllbGQpOworCisJCWlmICh2YWwgPj0gYmUpCisJCQljb3VudCsrOworCisJCWlmIChjb3VudCA+PSBuKQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9tZ2NwLmNmZyBiL29wZW5ic2Mvc3JjL21nY3AuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3OGY1NDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9tZ2NwLmNmZwpAQCAtMCwwICsxLDE5IEBACishCishIE1HQ1AgY29uZmlndXJhdGlvbiBoYW5kIGVkaXRlZAorISAgICEKK3Bhc3N3b3JkIGZvbworIQorbGluZSB2dHkKKyBubyBsb2dpbgorIQorbWdjcAorISAgbG9jYWwgaXAgMjEzLjE2Ny4xMzQuMTQKKyAgYnRzIGlwIDE3Mi4xNi4yNTIuNDMKKyAgYmluZCBpcCAyMTMuMTY3LjEzNC4xNDEKKyAgYmluZCBwb3J0IDI0MjcKKyAgYmluZCBlYXJseSAxCisgIHJ0cCBiYXNlIDQwMDAKKyAgc2RwIGF1ZGlvIHBheWxvYWQgbnVtYmVyIDk4CisgIHNkcCBhdWRpbyBwYXlsb2FkIG5hbWUgQU1SLzgwMDAKKyAgbnVtYmVyIGVuZHBvaW50cyAzMQorICBsb29wIDEKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL21nY3AvbWdjcF9tYWluLmMgYi9vcGVuYnNjL3NyYy9tZ2NwL21nY3BfbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZjFmODAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9tZ2NwL21nY3BfbWFpbi5jCkBAIC0wLDAgKzEsMjczIEBACisvKiBBIE1lZGlhIEdhdGV3YXkgQ29udHJvbCBQcm90b2NvbCBNZWRpYSBHYXRld2F5OiBSRkMgMzQzNSAqLworLyogVGhlIG1haW4gbWV0aG9kIHRvIGRyaXZlIGl0IGFzIGEgc3RhbmRhbG9uZSBwcm9jZXNzICAgICAgKi8KKworLyoKKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIChDKSAyMDA5IGJ5IE9uLVdhdmVzCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21nY3AuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21nY3BfaW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RlbG5ldF9pbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3Z0eS5oPgorCisjaW5jbHVkZSA8dnR5L2NvbW1hbmQuaD4KKworI2luY2x1ZGUgIi4uLy4uL2JzY2NvbmZpZy5oIgorCisvKiB0aGlzIGlzIGhlcmUgZm9yIHRoZSB2dHkuLi4gaXQgd2lsbCBuZXZlciBiZSBjYWxsZWQgKi8KK3ZvaWQgc3Vic2NyX3B1dCgpIHsgYWJvcnQoKTsgfQorCisjZGVmaW5lIF9HTlVfU09VUkNFCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKKyN3YXJuaW5nICJNYWtlIHVzZSBvZiB0aGUgcnRwIHByb3h5IGNvZGUiCisKK3N0YXRpYyBzdHJ1Y3QgYnNjX2ZkIGJmZDsKK3N0YXRpYyBzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZzsKK3N0YXRpYyBpbnQgcmVzZXRfZW5kcG9pbnRzID0gMDsKKworY29uc3QgY2hhciAqb3BlbmJzY192ZXJzaW9uID0gIk9wZW5CU0MgTUdDUCAiIFBBQ0tBR0VfVkVSU0lPTjsKK2NvbnN0IGNoYXIgKm9wZW5ic2NfY29weXJpZ2h0ID0KKwkiQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgSG9sZ2VyIEZyZXl0aGVyIGFuZCBPbi1XYXZlc1xuIgorCSJDb250cmlidXRpb25zIGJ5IERhbmllbCBXaWxsbWFubiwgSmFuIEzDvGJiZSxTdGVmYW4gU2NobWlkdFxuIgorCSJEaWV0ZXIgU3BhYXIsIEFuZHJlYXMgRXZlcnNiZXJnLCBIYXJhbGQgV2VsdGVcblxuIgorCSJMaWNlbnNlIEdQTHYyKzogR05VIEdQTCB2ZXJzaW9uIDIgb3IgbGF0ZXIgPGh0dHA6Ly9nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sPlxuIgorCSJUaGlzIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBhcmUgZnJlZSB0byBjaGFuZ2UgYW5kIHJlZGlzdHJpYnV0ZSBpdC5cbiIKKwkiVGhlcmUgaXMgTk8gV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdy5cbiI7CisKK3N0YXRpYyBjaGFyICpjb25maWdfZmlsZSA9ICJtZ2NwLmNmZyI7CisKKy8qIHVzZWQgYnkgbXNnYiBhbmQgbWdjcCAqLwordm9pZCAqdGFsbF9ic2NfY3R4ID0gTlVMTDsKKworc3RhdGljIHZvaWQgcHJpbnRfaGVscCgpCit7CisJcHJpbnRmKCJTb21lIHVzZWZ1bCBoZWxwLi4uXG4iKTsKKwlwcmludGYoIiAtaCAtLWhlbHAgaXMgcHJpbnRpbmcgdGhpcyB0ZXh0LlxuIik7CisJcHJpbnRmKCIgLWMgLS1jb25maWctZmlsZSBmaWxlbmFtZSBUaGUgY29uZmlnIGZpbGUgdG8gdXNlLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X21nY3BfdmVyc2lvbigpCit7CisJcHJpbnRmKCIlc1xuXG4iLCBvcGVuYnNjX3ZlcnNpb24pOworCXByaW50ZigiJXMiLCBvcGVuYnNjX2NvcHlyaWdodCk7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9vcHRpb25zKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKwl3aGlsZSAoMSkgeworCQlpbnQgb3B0aW9uX2luZGV4ID0gMCwgYzsKKwkJc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7CisJCQl7ImhlbHAiLCAwLCAwLCAnaCd9LAorCQkJeyJjb25maWctZmlsZSIsIDEsIDAsICdjJ30sCisJCQl7InZlcnNpb24iLCAwLCAwLCAnVid9LAorCQkJezAsIDAsIDAsIDB9LAorCQl9OworCisJCWMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiaGM6ViIsIGxvbmdfb3B0aW9ucywgJm9wdGlvbl9pbmRleCk7CisKKwkJaWYgKGMgPT0gLTEpCisJCQlicmVhazsKKworCQlzd2l0Y2goYykgeworCQljYXNlICdoJzoKKwkJCXByaW50X2hlbHAoKTsKKwkJCWV4aXQoMCk7CisJCQlicmVhazsKKwkJY2FzZSAnYyc6CisJCQljb25maWdfZmlsZSA9IHRhbGxvY19zdHJkdXAodGFsbF9ic2NfY3R4LCBvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ1YnOgorCQkJcHJpbnRfbWdjcF92ZXJzaW9uKCk7CisJCQlleGl0KDApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBpZ25vcmUgKi8KKwkJCWJyZWFrOworCQl9OworCX0KK30KKworLyogc2ltcGx5IHJlbWVtYmVyIHRoaXMgKi8KK3N0YXRpYyBpbnQgbWdjcF9yc2lwX2NiKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnKQoreworCXJlc2V0X2VuZHBvaW50cyA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZ2NwX2NoYW5nZV9jYihzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgaW50IGVuZHBvaW50LCBpbnQgc3RhdGUsIGludCBsb2NhbF9ydHApCit7CisJaWYgKHN0YXRlICE9IE1HQ1BfRU5EUF9NRENYKQorCQlyZXR1cm4gMDsKKworCW1nY3Bfc2VuZF9kdW1teSgmY2ZnLT5lbmRwb2ludHNbZW5kcG9pbnRdKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkX2NhbGxfYWdlbnQoc3RydWN0IGJzY19mZCAqZmQsIHVuc2lnbmVkIGludCB3aGF0KQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworCXNvY2tsZW5fdCBzbGVuID0gc2l6ZW9mKGFkZHIpOworCXN0cnVjdCBtc2diICptc2c7CisJc3RydWN0IG1zZ2IgKnJlc3A7CisJaW50IGk7CisKKwltc2cgPSAoc3RydWN0IG1zZ2IgKikgZmQtPmRhdGE7CisKKwkvKiByZWFkIG9uZSBsZXNzIHNvIHdlIGNhbiB1c2UgaXQgYXMgYSBcMCAqLworCWludCByYyA9IHJlY3Zmcm9tKGJmZC5mZCwgbXNnLT5kYXRhLCBtc2ctPmRhdGFfbGVuIC0gMSwgMCwKKwkJKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgJnNsZW4pOworCWlmIChyYyA8IDApIHsKKwkJcGVycm9yKCJHYXRld2F5IGZhaWxlZCB0byByZWFkIik7CisJCXJldHVybiAtMTsKKwl9IGVsc2UgaWYgKHNsZW4gPiBzaXplb2YoYWRkcikpIHsKKwkJZnByaW50ZihzdGRlcnIsICJHYXRld2F5IHJlY2VpdmVkIG1lc3NhZ2UgZnJvbSBvdXRlcnNwYWNlOiAlZCAlZFxuIiwKKwkJCXNsZW4sIHNpemVvZihhZGRyKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBoYW5kbGUgbWVzc2FnZSBub3cgKi8KKwltc2ctPmwyaCA9IG1zZ2JfcHV0KG1zZywgcmMpOworCXJlc3AgPSBtZ2NwX2hhbmRsZV9tZXNzYWdlKGNmZywgbXNnKTsKKwltc2diX3Jlc2V0KG1zZyk7CisKKwlpZiAocmVzcCkgeworCQlzZW5kdG8oYmZkLmZkLCByZXNwLT5sMmgsIG1zZ2JfbDJsZW4ocmVzcCksIDAsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsIHNpemVvZihhZGRyKSk7CisJCW1zZ2JfZnJlZShyZXNwKTsKKwl9CisKKwlpZiAocmVzZXRfZW5kcG9pbnRzKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiQXNrZWQgdG8gcmVzZXQgZW5kcG9pbnRzLlxuIik7CisJCXJlc2V0X2VuZHBvaW50cyA9IDA7CisKKwkJLyogaXMgY2hlY2tpbmcgaW5fYWRkci5zX2FkZHIgPT0gSU5BRERSX0xPT1BCQUNLIG1ha2luZyBpdCBtb3JlIHNlY3VyZT8gKi8KKwkJZm9yIChpID0gMTsgaSA8IGNmZy0+bnVtYmVyX2VuZHBvaW50czsgKytpKQorCQkJbWdjcF9mcmVlX2VuZHAoJmNmZy0+ZW5kcG9pbnRzW2ldKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrIGR1bW15X25ldHdvcms7CisJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisJaW50IG9uID0gMSwgcmM7CisJc3RydWN0IGxvZ190YXJnZXQgKnN0ZGVycl90YXJnZXQ7CisKKwl0YWxsX2JzY19jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QoTlVMTCwgMSwgIm1nY3AtY2FsbGFnZW50Iik7CisKKwlsb2dfaW5pdCgmbG9nX2luZm8pOworCXN0ZGVycl90YXJnZXQgPSBsb2dfdGFyZ2V0X2NyZWF0ZV9zdGRlcnIoKTsKKwlsb2dfYWRkX3RhcmdldChzdGRlcnJfdGFyZ2V0KTsKKwlsb2dfc2V0X2FsbF9maWx0ZXIoc3RkZXJyX3RhcmdldCwgMSk7CisKKwljZmcgPSBtZ2NwX2NvbmZpZ19hbGxvYygpOworCWlmICghY2ZnKQorCQlyZXR1cm4gLTE7CisKKwloYW5kbGVfb3B0aW9ucyhhcmdjLCBhcmd2KTsKKworCXRlbG5ldF9pbml0KCZkdW1teV9uZXR3b3JrLCA0MjQzKTsKKyAgICAgICAgcmMgPSBtZ2NwX3BhcnNlX2NvbmZpZyhjb25maWdfZmlsZSwgY2ZnKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwkvKiBzZXQgc29tZSBjYWxsYmFja3MgKi8KKwljZmctPnJlc2V0X2NiID0gbWdjcF9yc2lwX2NiOworCWNmZy0+Y2hhbmdlX2NiID0gbWdjcF9jaGFuZ2VfY2I7CisKKyAgICAgICAgLyogd2UgbmVlZCB0byBiaW5kIGEgc29ja2V0ICovCisgICAgICAgIGlmIChyYyA9PSAwKSB7CisJCWJmZC53aGVuID0gQlNDX0ZEX1JFQUQ7CisJCWJmZC5jYiA9IHJlYWRfY2FsbF9hZ2VudDsKKwkJYmZkLmZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCQlpZiAoYmZkLmZkIDwgMCkgeworCQkJcGVycm9yKCJHYXRld2F5IGZhaWxlZCB0byBsaXN0ZW4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCXNldHNvY2tvcHQoYmZkLmZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZvbiwgc2l6ZW9mKG9uKSk7CisKKwkJbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOworCQlhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQlhZGRyLnNpbl9wb3J0ID0gaHRvbnMoY2ZnLT5zb3VyY2VfcG9ydCk7CisJCWluZXRfYXRvbihjZmctPnNvdXJjZV9hZGRyLCAmYWRkci5zaW5fYWRkcik7CisKKwkJaWYgKGJpbmQoYmZkLmZkLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpIDwgMCkgeworCQkJcGVycm9yKCJHYXRld2F5IGZhaWxlZCB0byBiaW5kIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQliZmQuZGF0YSA9IG1zZ2JfYWxsb2MoNDA5NiwgIm1nY3AtbXNnIik7CisJCWlmICghYmZkLmRhdGEpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiR2F0ZXdheSBtZW1vcnkgZXJyb3IuXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisKKwkJaWYgKGJzY19yZWdpc3Rlcl9mZCgmYmZkKSAhPSAwKSB7CisJCQlMT0dQKERNR0NQLCBMT0dMX0ZBVEFMLCAiRmFpbGVkIHRvIHJlZ2lzdGVyIHRoZSBmZFxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIkNvbmZpZ3VyZWQgZm9yIE1HQ1AuXG4iKTsKKwl9CisKKwkvKiBpbml0aWFsaXNhdGlvbiAqLworCXNyYW5kKHRpbWUoTlVMTCkpOworCisJLyogbWFpbiBsb29wICovCisJd2hpbGUgKDEpIHsKKwkJYnNjX3NlbGVjdF9tYWluKDApOworCX0KKworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBnc21fbmV0d29yazsKK2ludCBic2NfdnR5X2luaXQoc3RydWN0IGdzbV9uZXR3b3JrICpkdW1teSkKK3sKKwljbWRfaW5pdCgxKTsKKwl2dHlfaW5pdCgpOworCisJb3BlbmJzY192dHlfYWRkX2NtZHMoKTsKKyAgICAgICAgbWdjcF92dHlfaW5pdCgpOworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9tZ2NwL21nY3BfbmV0d29yay5jIGIvb3BlbmJzYy9zcmMvbWdjcC9tZ2NwX25ldHdvcmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDc0NWE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvbWdjcC9tZ2NwX25ldHdvcmsuYwpAQCAtMCwwICsxLDI4NCBAQAorLyogQSBNZWRpYSBHYXRld2F5IENvbnRyb2wgUHJvdG9jb2wgTWVkaWEgR2F0ZXdheTogUkZDIDM0MzUgKi8KKy8qIFRoZSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiAqLworCisvKgorICogKEMpIDIwMDktMjAxMCBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiAoQykgMjAwOS0yMDEwIGJ5IE9uLVdhdmVzCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVuZGlhbi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tZ2NwLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tZ2NwX2ludGVybmFsLmg+CisKKyN3YXJuaW5nICJNYWtlIHVzZSBvZiB0aGUgcnRwIHByb3h5IGNvZGUiCisKKy8qIGFjY29yZGluZyB0byBydHBfcHJveHkuYyBSRkMgMzU1MCAqLworc3RydWN0IHJ0cF9oZHIgeworI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKwl1X2ludDhfdCAgY3NyY19jb3VudDo0LAorCQkgIGV4dGVuc2lvbjoxLAorCQkgIHBhZGRpbmc6MSwKKwkJICB2ZXJzaW9uOjI7CisJdV9pbnQ4X3QgIHBheWxvYWRfdHlwZTo3LAorCQkgIG1hcmtlcjoxOworI2VsaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorCXVfaW50OF90ICB2ZXJzaW9uOjIsCisJCSAgcGFkZGluZzoxLAorCQkgIGV4dGVuc2lvbjoxLAorCQkgIGNzcmNfY291bnQ6NDsKKwl1X2ludDhfdCAgbWFya2VyOjEsCisJCSAgcGF5bG9hZF90eXBlOjc7CisjZW5kaWYKKwl1X2ludDE2X3Qgc2VxdWVuY2U7CisJdV9pbnQzMl90IHRpbWVzdGFtcDsKKwl1X2ludDMyX3Qgc3NyYzsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworZW51bSB7CisJREVTVF9ORVRXT1JLID0gMCwKKwlERVNUX0JUUyA9IDEsCit9OworCitlbnVtIHsKKwlQUk9UT19SVFAsCisJUFJPVE9fUlRDUCwKK307CisKKyNkZWZpbmUgRFVNTVlfTE9BRCAweDIzCisKKworc3RhdGljIGludCB1ZHBfc2VuZChpbnQgZmQsIHN0cnVjdCBpbl9hZGRyICphZGRyLCBpbnQgcG9ydCwgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBvdXQ7CisJb3V0LnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCW91dC5zaW5fcG9ydCA9IHBvcnQ7CisJbWVtY3B5KCZvdXQuc2luX2FkZHIsIGFkZHIsIHNpemVvZigqYWRkcikpOworCisJcmV0dXJuIHNlbmR0byhmZCwgYnVmLCBsZW4sIDAsIChzdHJ1Y3Qgc29ja2FkZHIgKikmb3V0LCBzaXplb2Yob3V0KSk7Cit9CisKK2ludCBtZ2NwX3NlbmRfZHVtbXkoc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHApCit7CisJc3RhdGljIGNoYXIgYnVmW10gPSB7IERVTU1ZX0xPQUQgfTsKKworCXJldHVybiB1ZHBfc2VuZChlbmRwLT5sb2NhbF9ydHAuZmQsICZlbmRwLT5yZW1vdGUsCisJCQllbmRwLT5uZXRfcnRwLCBidWYsIDEpOworfQorCitzdGF0aWMgdm9pZCBwYXRjaF9wYXlsb2FkKGludCBwYXlsb2FkLCBjaGFyICpkYXRhLCBpbnQgbGVuKQoreworCXN0cnVjdCBydHBfaGRyICpydHBfaGRyOworCisJaWYgKGxlbiA8IHNpemVvZigqcnRwX2hkcikpCisJCXJldHVybjsKKworCWlmIChwYXlsb2FkIDwgMCkKKwkJcmV0dXJuOworCisJcnRwX2hkciA9IChzdHJ1Y3QgcnRwX2hkciAqKSBkYXRhOworCXJ0cF9oZHItPnBheWxvYWRfdHlwZSA9IHBheWxvYWQ7Cit9CisKKy8qCisgKiBUaGVyZSBpcyBkYXRhIGNvbWluZy4gV2Ugd2lsbCBoYXZlIHRvIGZpZ3VyZSBvdXQgaWYgaXQKKyAqIGNhbWUgZnJvbSB0aGUgQlRTIG9yIHRoZSBNZWRpYUdhdGV3YXkgb2YgdGhlIE1TQy4gT24gdG9wCisgKiBvZiB0aGF0IHdlIG5lZWQgdG8gZmlndXJlIG91dCBpZiBpdCB3YXMgUlRQIG9yIFJUQ1AuCisgKgorICogQ3VycmVudGx5IHdlIGRvIG5vdCBjb21tdW5pY2F0ZSB3aXRoIHRoZSBCU0Mgc28gd2UgaGF2ZQorICogbm8gaWRlYSB3aGVyZSB0aGUgQlRTIGlzIGxpc3RlbmluZyBmb3IgUlRQIGFuZCBuZWVkIHRvCisgKiBkbyB0aGUgY2xhc3NpYyByb3V0aW5nIHRyaWNrLiBXYWl0IGZvciB0aGUgZmlyc3QgcGFja2V0CisgKiBmcm9tIHRoZSBCVFMgYW5kIHRoZW4gZ28gYWhlYWQuCisgKi8KK3N0YXRpYyBpbnQgcnRwX2RhdGFfY2Ioc3RydWN0IGJzY19mZCAqZmQsIHVuc2lnbmVkIGludCB3aGF0KQoreworCWNoYXIgYnVmWzQwOTZdOworCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworCXNvY2tsZW5fdCBzbGVuID0gc2l6ZW9mKGFkZHIpOworCXN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwOworCXN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnOworCWludCByYywgZGVzdCwgcHJvdG87CisKKwllbmRwID0gKHN0cnVjdCBtZ2NwX2VuZHBvaW50ICopIGZkLT5kYXRhOworCWNmZyA9IGVuZHAtPmNmZzsKKworCXJjID0gcmVjdmZyb20oZmQtPmZkLCAmYnVmLCBzaXplb2YoYnVmKSwgMCwKKwkJCSAgICAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCAmc2xlbik7CisJaWYgKHJjIDwgMCkgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIHJlY2VpdmUgbWVzc2FnZSBvbjogMHgleCBlcnJubzogJWQvJXNcbiIsCisJCQlFTkRQT0lOVF9OVU1CRVIoZW5kcCksIGVycm5vLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogZG8gbm90IGZvcndhcmQgYXludGhpbmcuLi4gbWF5YmUgdGhlcmUgaXMgYSBwYWNrZXQgZnJvbSB0aGUgYnRzICovCisJaWYgKGVuZHAtPmNpID09IENJX1VOVVNFRCkKKwkJcmV0dXJuIC0xOworCisJLyoKKwkgKiBGaWd1cmUgb3V0IHdoZXJlIHRvIGZvcndhcmQgaXQgdG8uIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgd2UKKwkgKiBoYXZlIHJlY2VpdmVkIHRoZSBDb25uZWN0aW9uIE1vZGlmeSBhbmQga25vdyB3aG8gaXMgYSBsZWdpdGltYXRlCisJICogcGFydG5lci4gQWNjb3JkaW5nIHRvIHRoZSBzcGVjIHdlIGNvdWxkIGF0dGVtcHQgdG8gZm9yd2FyZCBldmVuCisJICogYWZ0ZXIgdGhlIENyZWF0ZSBDb25uZWN0aW9uIGJ1dCB3ZSB3aWxsIG5vdCBhcyB3ZSBhcmUgbm90IHJlYWxseQorCSAqIGFibGUgdG8gdGVsbCBpZiB0aGlzIGlzIGxlZ2l0aW1hdGUuCisJICovCisJI3dhcm5pbmcgIlNsaWdodCBzcGVjIHZpb2xhdGlvbi4gV2l0aCBjb25uZWN0aW9uIG1vZGUgcmVjdm9ubHkgd2Ugc2hvdWxkIGF0dGVtcHQgdG8gZm9yd2FyZC4iCisJZGVzdCA9IG1lbWNtcCgmYWRkci5zaW5fYWRkciwgJmVuZHAtPnJlbW90ZSwgc2l6ZW9mKGFkZHIuc2luX2FkZHIpKSA9PSAwICYmCisJCSAgICAoZW5kcC0+bmV0X3J0cCA9PSBhZGRyLnNpbl9wb3J0IHx8IGVuZHAtPm5ldF9ydGNwID09IGFkZHIuc2luX3BvcnQpCisJCQk/IERFU1RfQlRTIDogREVTVF9ORVRXT1JLOworCXByb3RvID0gZmQgPT0gJmVuZHAtPmxvY2FsX3J0cCA/IFBST1RPX1JUUCA6IFBST1RPX1JUQ1A7CisKKwkvKiBXZSBoYXZlIG5vIGlkZWEgd2hvIGNhbGxlZCB1cywgbWF5YmUgaXQgaXMgdGhlIEJUUy4gKi8KKwlpZiAoZGVzdCA9PSBERVNUX05FVFdPUksgJiYgKGVuZHAtPmJ0c19ydHAgPT0gMCB8fCBjZmctPmZvcndhcmRfaXApKSB7CisJCS8qIGl0IHdhcyB0aGUgQlRTLi4uICovCisJCWlmICghY2ZnLT5idHNfaXAKKwkJICAgIHx8IG1lbWNtcCgmYWRkci5zaW5fYWRkciwgJmNmZy0+YnRzX2luLCBzaXplb2YoY2ZnLT5idHNfaW4pKSA9PSAwCisJCSAgICB8fCBtZW1jbXAoJmFkZHIuc2luX2FkZHIsICZlbmRwLT5idHMsIHNpemVvZihlbmRwLT5idHMpKSA9PSAwKSB7CisJCQlpZiAoZmQgPT0gJmVuZHAtPmxvY2FsX3J0cCkgeworCQkJCWVuZHAtPmJ0c19ydHAgPSBhZGRyLnNpbl9wb3J0OworCQkJfSBlbHNlIHsKKwkJCQllbmRwLT5idHNfcnRjcCA9IGFkZHIuc2luX3BvcnQ7CisJCQl9CisKKwkJCWVuZHAtPmJ0cyA9IGFkZHIuc2luX2FkZHI7CisJCQlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIkZvdW5kIEJUUyBmb3IgZW5kcG9pbnQ6IDB4JXggb24gcG9ydDogJWQvJWQgb2YgJXNcbiIsCisJCQkJRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBudG9ocyhlbmRwLT5idHNfcnRwKSwgbnRvaHMoZW5kcC0+YnRzX3J0Y3ApLAorCQkJCWluZXRfbnRvYShhZGRyLnNpbl9hZGRyKSk7CisKKwkJfQorCX0KKworCS8qIHRocm93IGF3YXkgZHVtbXkgbWVzc2FnZSAqLworCWlmIChyYyA9PSAxICYmIGJ1ZlswXSA9PSBEVU1NWV9MT0FEKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiRmlsdGVyZWQgZHVtbXkgb24gMHgleFxuIiwKKwkJCUVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCXJldHVybiAwOworCX0KKworCS8qIGRvIHRoaXMgYmVmb3JlIHRoZSBsb29wIGhhbmRsaW5nICovCisJaWYgKGRlc3QgPT0gREVTVF9ORVRXT1JLKQorCQkrK2VuZHAtPmluX2J0czsKKwllbHNlCisJCSsrZW5kcC0+aW5fcmVtb3RlOworCisJLyogZGlzcGF0Y2ggKi8KKwlpZiAoY2ZnLT5hdWRpb19sb29wKQorCQlkZXN0ID0gIWRlc3Q7CisKKwlpZiAoZGVzdCA9PSBERVNUX05FVFdPUkspIHsKKwkJcGF0Y2hfcGF5bG9hZChlbmRwLT5uZXRfcGF5bG9hZF90eXBlLCBidWYsIHJjKTsKKwkJcmV0dXJuIHVkcF9zZW5kKGZkLT5mZCwgJmVuZHAtPnJlbW90ZSwKKwkJCSAgICAgcHJvdG8gPT0gUFJPVE9fUlRQID8gZW5kcC0+bmV0X3J0cCA6IGVuZHAtPm5ldF9ydGNwLAorCQkJICAgICBidWYsIHJjKTsKKwl9IGVsc2UgeworCQlwYXRjaF9wYXlsb2FkKGVuZHAtPmJ0c19wYXlsb2FkX3R5cGUsIGJ1ZiwgcmMpOworCQlyZXR1cm4gdWRwX3NlbmQoZmQtPmZkLCAmZW5kcC0+YnRzLAorCQkJICAgICBwcm90byA9PSBQUk9UT19SVFAgPyBlbmRwLT5idHNfcnRwIDogZW5kcC0+YnRzX3J0Y3AsCisJCQkgICAgIGJ1ZiwgcmMpOworCX0KK30KKworc3RhdGljIGludCBjcmVhdGVfYmluZChjb25zdCBjaGFyICpzb3VyY2VfYWRkciwgc3RydWN0IGJzY19mZCAqZmQsIGludCBwb3J0KQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworCWludCBvbiA9IDE7CisKKwlmZC0+ZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisJaWYgKGZkLT5mZCA8IDApIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgVURQIHBvcnQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXNldHNvY2tvcHQoZmQtPmZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZvbiwgc2l6ZW9mKG9uKSk7CisJbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOworCWFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworCWluZXRfYXRvbihzb3VyY2VfYWRkciwgJmFkZHIuc2luX2FkZHIpOworCisJaWYgKGJpbmQoZmQtPmZkLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpIDwgMCkgeworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmluZF9ydHAoc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHApCit7CisJc3RydWN0IG1nY3BfY29uZmlnICpjZmcgPSBlbmRwLT5jZmc7CisKKwlpZiAoY3JlYXRlX2JpbmQoY2ZnLT5zb3VyY2VfYWRkciwgJmVuZHAtPmxvY2FsX3J0cCwgZW5kcC0+cnRwX3BvcnQpICE9IDApIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgUlRQIHBvcnQ6ICVzOiVkIG9uIDB4JXhcbiIsCisJCSAgICAgICBjZmctPnNvdXJjZV9hZGRyLCBlbmRwLT5ydHBfcG9ydCwgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJZ290byBjbGVhbnVwMDsKKwl9CisKKwlpZiAoY3JlYXRlX2JpbmQoY2ZnLT5zb3VyY2VfYWRkciwgJmVuZHAtPmxvY2FsX3J0Y3AsIGVuZHAtPnJ0cF9wb3J0ICsgMSkgIT0gMCkgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBSVENQIHBvcnQ6ICVzOiVkIG9uIDB4JXhcbiIsCisJCSAgICAgICBjZmctPnNvdXJjZV9hZGRyLCBlbmRwLT5ydHBfcG9ydCArIDEsIEVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCWdvdG8gY2xlYW51cDE7CisJfQorCisJZW5kcC0+bG9jYWxfcnRwLmNiID0gcnRwX2RhdGFfY2I7CisJZW5kcC0+bG9jYWxfcnRwLmRhdGEgPSBlbmRwOworCWVuZHAtPmxvY2FsX3J0cC53aGVuID0gQlNDX0ZEX1JFQUQ7CisJaWYgKGJzY19yZWdpc3Rlcl9mZCgmZW5kcC0+bG9jYWxfcnRwKSAhPSAwKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gcmVnaXN0ZXIgUlRQIHBvcnQgJWQgb24gMHgleFxuIiwKKwkJCWVuZHAtPnJ0cF9wb3J0LCBFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQlnb3RvIGNsZWFudXAyOworCX0KKworCWVuZHAtPmxvY2FsX3J0Y3AuY2IgPSBydHBfZGF0YV9jYjsKKwllbmRwLT5sb2NhbF9ydGNwLmRhdGEgPSBlbmRwOworCWVuZHAtPmxvY2FsX3J0Y3Aud2hlbiA9IEJTQ19GRF9SRUFEOworCWlmIChic2NfcmVnaXN0ZXJfZmQoJmVuZHAtPmxvY2FsX3J0Y3ApICE9IDApIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byByZWdpc3RlciBSVENQIHBvcnQgJWQgb24gMHgleFxuIiwKKwkJCWVuZHAtPnJ0cF9wb3J0ICsgMSwgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJZ290byBjbGVhbnVwMzsKKwl9CisKKwlyZXR1cm4gMDsKKworY2xlYW51cDM6CisJYnNjX3VucmVnaXN0ZXJfZmQoJmVuZHAtPmxvY2FsX3J0cCk7CitjbGVhbnVwMjoKKwljbG9zZShlbmRwLT5sb2NhbF9ydGNwLmZkKTsKKwllbmRwLT5sb2NhbF9ydGNwLmZkID0gLTE7CitjbGVhbnVwMToKKwljbG9zZShlbmRwLT5sb2NhbF9ydHAuZmQpOworCWVuZHAtPmxvY2FsX3J0cC5mZCA9IC0xOworY2xlYW51cDA6CisJcmV0dXJuIC0xOworfQorCitpbnQgbWdjcF9iaW5kX3J0cF9wb3J0KHN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwLCBpbnQgcnRwX3BvcnQpCit7CisJZW5kcC0+cnRwX3BvcnQgPSBydHBfcG9ydDsKKwlyZXR1cm4gYmluZF9ydHAoZW5kcCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9tZ2NwL21nY3BfcHJvdG9jb2wuYyBiL29wZW5ic2Mvc3JjL21nY3AvbWdjcF9wcm90b2NvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MmJkNjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9tZ2NwL21nY3BfcHJvdG9jb2wuYwpAQCAtMCwwICsxLDc2NyBAQAorLyogQSBNZWRpYSBHYXRld2F5IENvbnRyb2wgUHJvdG9jb2wgTWVkaWEgR2F0ZXdheTogUkZDIDM0MzUgKi8KKy8qIFRoZSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiAqLworCisvKgorICogKEMpIDIwMDktMjAxMCBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiAoQykgMjAwOS0yMDEwIGJ5IE9uLVdhdmVzCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21nY3AuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21nY3BfaW50ZXJuYWwuaD4KKworZW51bSBtZ2NwX2Nvbm5lY3Rpb25fbW9kZSB7CisJTUdDUF9DT05OX05PTkUgPSAwLAorCU1HQ1BfQ09OTl9SRUNWX09OTFkgPSAxLAorCU1HQ1BfQ09OTl9TRU5EX09OTFkgPSAyLAorCU1HQ1BfQ09OTl9SRUNWX1NFTkQgPSBNR0NQX0NPTk5fUkVDVl9PTkxZIHwgTUdDUF9DT05OX1NFTkRfT05MWSwKK307CisKKy8qKgorICogTWFjcm8gZm9yIHRva2VuaXppbmcgTUdDUCBtZXNzYWdlcyBhbmQgU0RQIGluIG9uZSBnby4KKyAqCisgKi8KKyNkZWZpbmUgTVNHX1RPS0VOSVpFX1NUQVJUIFwKKwlsaW5lX3N0YXJ0ID0gMDsJCQkJCQlcCisJZm9yIChpID0gMDsgaSA8IG1zZ2JfbDNsZW4obXNnKTsgKytpKSB7CQkJXAorCQkvKiB3ZSBoYXZlIGEgbGluZSBlbmQgKi8JCQlcCisJCWlmIChtc2ctPmwzaFtpXSA9PSAnXG4nKSB7CQkJXAorCQkJLyogc2tpcCB0aGUgZmlyc3QgbGluZSAqLwkJXAorCQkJaWYgKGxpbmVfc3RhcnQgPT0gMCkgewkJCVwKKwkJCQlsaW5lX3N0YXJ0ID0gaSArIDE7CQlcCisJCQkJY29udGludWU7CQkJXAorCQkJfQkJCQkJXAorCQkJCQkJCQlcCisJCQkvKiBjaGVjayBpZiB3ZSBoYXZlIGEgcHJvcGVyIHBhcmFtICovCVwKKwkJCWlmIChpIC0gbGluZV9zdGFydCA9PSAxICYmIG1zZy0+bDNoW2xpbmVfc3RhcnRdID09ICdccicpIHsgXAorCQkJfSBlbHNlIGlmIChpIC0gbGluZV9zdGFydCA+IDIJCVwKKwkJCSAgICAmJiBpc2xvd2VyKG1zZy0+bDNoW2xpbmVfc3RhcnRdKQlcCisJCQkgICAgJiYgbXNnLT5sM2hbbGluZV9zdGFydCArIDFdID09ICc9JykgeyBcCisJCQl9IGVsc2UgaWYgKGkgLSBsaW5lX3N0YXJ0IDwgMwkJXAorCQkJICAgIHx8IG1zZy0+bDNoW2xpbmVfc3RhcnQgKyAxXSAhPSAnOicJXAorCQkJICAgIHx8IG1zZy0+bDNoW2xpbmVfc3RhcnQgKyAyXSAhPSAnICcpCVwKKwkJCQlnb3RvIGVycm9yOwkJCVwKKwkJCQkJCQkJXAorCQkJbXNnLT5sM2hbaV0gPSAnXDAnOwkJCVwKKwkJCWlmIChtc2ctPmwzaFtpLTFdID09ICdccicpCQlcCisJCQkJbXNnLT5sM2hbaS0xXSA9ICdcMCc7CisKKyNkZWZpbmUgTVNHX1RPS0VOSVpFX0VORCBcCisJCQlsaW5lX3N0YXJ0ID0gaSArIDE7IFwKKwkJfQkJCSAgICBcCisJfQorCisKK3N0cnVjdCBtZ2NwX3JlcXVlc3QgeworCWNoYXIgKm5hbWU7CisJc3RydWN0IG1zZ2IgKigqaGFuZGxlX3JlcXVlc3QpIChzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZyk7CisJY2hhciAqZGVidWdfbmFtZTsKK307CisKKyNkZWZpbmUgTUdDUF9SRVFVRVNUKE5BTUUsIFJFUSwgREVCVUdfTkFNRSkgXAorCXsgLm5hbWUgPSBOQU1FLCAuaGFuZGxlX3JlcXVlc3QgPSBSRVEsIC5kZWJ1Z19uYW1lID0gREVCVUdfTkFNRSB9LAorCitzdGF0aWMgc3RydWN0IG1zZ2IgKmhhbmRsZV9hdWRpdF9lbmRwb2ludChzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZyk7CitzdGF0aWMgc3RydWN0IG1zZ2IgKmhhbmRsZV9jcmVhdGVfY29uKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnKTsKK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqaGFuZGxlX2RlbGV0ZV9jb24oc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIHN0cnVjdCBtc2diICptc2cpOworc3RhdGljIHN0cnVjdCBtc2diICpoYW5kbGVfbW9kaWZ5X2NvbihzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZyk7CitzdGF0aWMgc3RydWN0IG1zZ2IgKmhhbmRsZV9yc2lwKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnKTsKKworc3RhdGljIGludCBnZW5lcmF0ZV9jYWxsX2lkKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnKQoreworCWludCBpOworCisJLyogdXNlIHRoZSBjYWxsIGlkICovCisJKytjZmctPmxhc3RfY2FsbF9pZDsKKworCS8qIGhhbmRsZSB3cmFwIGFyb3VuZCAqLworCWlmIChjZmctPmxhc3RfY2FsbF9pZCA9PSBDSV9VTlVTRUQpCisJCSsrY2ZnLT5sYXN0X2NhbGxfaWQ7CisKKwkvKiBjYWxsc3RhY2sgY2FuIG9ubHkgYmUgb2Ygc2l6ZSBudW1iZXJfb2ZfZW5kcG9pbnRzICovCisJLyogdmVyaWZ5IHRoYXQgdGhlIGNhbGwgaWQgaXMgZnJlZSwgZS5nLiBpbiBjYXNlIG9mIG92ZXJydW4gKi8KKwlmb3IgKGkgPSAxOyBpIDwgY2ZnLT5udW1iZXJfZW5kcG9pbnRzOyArK2kpCisJCWlmIChjZmctPmVuZHBvaW50c1tpXS5jaSA9PSBjZmctPmxhc3RfY2FsbF9pZCkKKwkJCXJldHVybiBnZW5lcmF0ZV9jYWxsX2lkKGNmZyk7CisKKwlyZXR1cm4gY2ZnLT5sYXN0X2NhbGxfaWQ7Cit9CisKKy8qCisgKiBhcnJheSBvZiBmdW5jdGlvbiBwb2ludGVycyBmb3IgaGFuZGxpbmcgdmFyaW91cworICogbWVzc2FnZXMuIEluIHRoZSBmdXR1cmUgdGhpcyBtaWdodCBiZSBiaW5hcnkgc29ydGVkCisgKiBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBtZ2NwX3JlcXVlc3QgbWdjcF9yZXF1ZXN0cyBbXSA9IHsKKwlNR0NQX1JFUVVFU1QoIkFVRVAiLCBoYW5kbGVfYXVkaXRfZW5kcG9pbnQsICJBdWRpdEVuZHBvaW50IikKKwlNR0NQX1JFUVVFU1QoIkNSQ1giLCBoYW5kbGVfY3JlYXRlX2NvbiwgIkNyZWF0ZUNvbm5lY3Rpb24iKQorCU1HQ1BfUkVRVUVTVCgiRExDWCIsIGhhbmRsZV9kZWxldGVfY29uLCAiRGVsZXRlQ29ubmVjdGlvbiIpCisJTUdDUF9SRVFVRVNUKCJNRENYIiwgaGFuZGxlX21vZGlmeV9jb24sICJNb2RpZml5Q29ubmVjdGlvbiIpCisKKwkvKiBTUEVDIGV4dGVuc2lvbiAqLworCU1HQ1BfUkVRVUVTVCgiUlNJUCIsIGhhbmRsZV9yc2lwLCAiUmVTZXRJblByb2dyZXNzIikKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqbWdjcF9tc2diX2FsbG9jKHZvaWQpCit7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwltc2cgPSBtc2diX2FsbG9jX2hlYWRyb29tKDQwOTYsIDEyOCwgIk1HQ1AgbXNnIik7CisJaWYgKCFtc2cpCisJICAgIExPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gbXNnYiBmb3IgTUdDUCBkYXRhLlxuIik7CisKKwlyZXR1cm4gbXNnOworfQorCitzdHJ1Y3QgbXNnYiAqbWdjcF9jcmVhdGVfcmVzcG9uc2Vfd2l0aF9kYXRhKGludCBjb2RlLCBjb25zdCBjaGFyICptc2csIGNvbnN0IGNoYXIgKnRyYW5zLAorCQkJCSAgICBjb25zdCBjaGFyICpkYXRhKQoreworCWludCBsZW47CisJc3RydWN0IG1zZ2IgKnJlczsKKworCXJlcyA9IG1nY3BfbXNnYl9hbGxvYygpOworCWlmICghcmVzKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChkYXRhKSB7CisJCWxlbiA9IHNucHJpbnRmKChjaGFyICopIHJlcy0+ZGF0YSwgMjA0OCwgIiVkICVzXG4lcyIsIGNvZGUsIHRyYW5zLCBkYXRhKTsKKwl9IGVsc2UgeworCQlsZW4gPSBzbnByaW50ZigoY2hhciAqKSByZXMtPmRhdGEsIDIwNDgsICIlZCAlc1xuIiwgY29kZSwgdHJhbnMpOworCX0KKworCXJlcy0+bDJoID0gbXNnYl9wdXQocmVzLCBsZW4pOworCUxPR1AoRE1HQ1AsIExPR0xfREVCVUcsICJTZW5kaW5nIHJlc3BvbnNlOiBjb2RlOiAlZCBmb3IgJyVzJ1xuIiwgY29kZSwgcmVzLT5sMmgpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqY3JlYXRlX3Jlc3BvbnNlKGludCBjb2RlLCBjb25zdCBjaGFyICptc2csIGNvbnN0IGNoYXIgKnRyYW5zKQoreworCXJldHVybiBtZ2NwX2NyZWF0ZV9yZXNwb25zZV93aXRoX2RhdGEoY29kZSwgbXNnLCB0cmFucywgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqY3JlYXRlX3Jlc3BvbnNlX3dpdGhfc2RwKHN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwLAorCQkJCQkgICAgIGNvbnN0IGNoYXIgKm1zZywgY29uc3QgY2hhciAqdHJhbnNfaWQpCit7CisJY29uc3QgY2hhciAqYWRkciA9IGVuZHAtPmNmZy0+bG9jYWxfaXA7CisJY2hhciBzZHBfcmVjb3JkWzQwOTZdOworCisJaWYgKCFhZGRyKQorCQlhZGRyID0gZW5kcC0+Y2ZnLT5zb3VyY2VfYWRkcjsKKworCXNucHJpbnRmKHNkcF9yZWNvcmQsIHNpemVvZihzZHBfcmVjb3JkKSAtIDEsCisJCQkiSTogJWRcblxuIgorCQkJInY9MFxyXG4iCisJCQkiYz1JTiBJUDQgJXNcclxuIgorCQkJIm09YXVkaW8gJWQgUlRQL0FWUCAlZFxyXG4iCisJCQkiYT1ydHBtYXA6JWQgJXNcclxuIiwKKwkJCWVuZHAtPmNpLCBhZGRyLCBlbmRwLT5ydHBfcG9ydCwKKwkJCWVuZHAtPmJ0c19wYXlsb2FkX3R5cGUsIGVuZHAtPmJ0c19wYXlsb2FkX3R5cGUsCisJCSAgICAgICAgZW5kcC0+Y2ZnLT5hdWRpb19uYW1lKTsKKwlyZXR1cm4gbWdjcF9jcmVhdGVfcmVzcG9uc2Vfd2l0aF9kYXRhKDIwMCwgbXNnLCB0cmFuc19pZCwgc2RwX3JlY29yZCk7Cit9CisKKy8qCisgKiBoYW5kbGUgaW5jb21pbmcgbWVzc2FnZXM6CisgKiAgIC0gdGhpcyBjYW4gYmUgYSBjb21tYW5kIChmb3VyIGxldHRlcnMsIHNwYWNlLCB0cmFuc2FjdGlvbiBpZCkKKyAqICAgLSBvciBhIHJlc3BvbnNlICh0aHJlZSBudW1iZXJzLCBzcGFjZSwgdHJhbnNhY3Rpb24gaWQpCisgKi8KK3N0cnVjdCBtc2diICptZ2NwX2hhbmRsZV9tZXNzYWdlKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworICAgICAgICBpbnQgY29kZTsKKwlzdHJ1Y3QgbXNnYiAqcmVzcCA9IE5VTEw7CisKKwlpZiAobXNnYl9sMmxlbihtc2cpIDwgNCkgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAibWdzIHRvbyBzaG9ydDogJWRcbiIsIG1zZy0+bGVuKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisgICAgICAgIC8qIGF0dGVtcHQgdG8gdHJlYXQgaXQgYXMgYSByZXNwb25zZSAqLworICAgICAgICBpZiAoc3NjYW5mKChjb25zdCBjaGFyICopJm1zZy0+bDJoWzBdLCAiJTNkICUqcyIsICZjb2RlKSA9PSAxKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfREVCVUcsICJSZXNwb25zZTogQ29kZTogJWRcbiIsIGNvZGUpOworCX0gZWxzZSB7CisJCWludCBpLCBoYW5kbGVkID0gMDsKKwkJbXNnLT5sM2ggPSAmbXNnLT5sMmhbNF07CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1nY3BfcmVxdWVzdHMpOyArK2kpCisJCQlpZiAoc3RybmNtcChtZ2NwX3JlcXVlc3RzW2ldLm5hbWUsIChjb25zdCBjaGFyICopICZtc2ctPmwyaFswXSwgNCkgPT0gMCkgeworCQkJCWhhbmRsZWQgPSAxOworCQkJCXJlc3AgPSBtZ2NwX3JlcXVlc3RzW2ldLmhhbmRsZV9yZXF1ZXN0KGNmZywgbXNnKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJaWYgKCFoYW5kbGVkKSB7CisJCQlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIk1TRyB3aXRoIHR5cGU6ICclLjRzJyBub3QgaGFuZGxlZFxuIiwgJm1zZy0+bDJoWzBdKTsKKwkJfQorCX0KKworCXJldHVybiByZXNwOworfQorCisvKiBzdHJpbmcgdG9rZW5pemVyIGZvciB0aGUgcG9vciAqLworc3RhdGljIGludCBmaW5kX21zZ19wb2ludGVycyhzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgbWdjcF9tc2dfcHRyICpwdHJzLCBpbnQgcHRyc19sZW5ndGgpCit7CisJaW50IGksIGZvdW5kID0gMDsKKworCWludCB3aGl0ZXNwYWNlID0gMTsKKwlmb3IgKGkgPSAwOyBpIDwgbXNnYl9sM2xlbihtc2cpICYmIHB0cnNfbGVuZ3RoID4gMDsgKytpKSB7CisJCS8qIGlmIHdlIGhhdmUgYSBzcGFjZSB3ZSBmb3VuZCBhbiBlbmQgKi8KKwkJaWYgKG1zZy0+bDNoW2ldCT09ICcgJyB8fCBtc2ctPmwzaFtpXSA9PSAnXHInIHx8IG1zZy0+bDNoW2ldID09ICdcbicpIHsKKwkJCWlmICghd2hpdGVzcGFjZSkgeworCQkJCSsrZm91bmQ7CisJCQkJd2hpdGVzcGFjZSA9IDE7CisJCQkJcHRycy0+bGVuZ3RoID0gaSAtIHB0cnMtPnN0YXJ0IC0gMTsKKwkJCQkrK3B0cnM7CisJCQkJLS1wdHJzX2xlbmd0aDsKKwkJCX0gZWxzZSB7CisJCQkgICAgLyogc2tpcCBhbnkgbnVtYmVyIG9mIHdoaXRlc3BhY2UgKi8KKwkJCX0KKworCQkJLyogbGluZSBlbmQuLi4gc3RvcCAqLworCQkJaWYgKG1zZy0+bDNoW2ldID09ICdccicgfHwgbXNnLT5sM2hbaV0gPT0gJ1xuJykKKwkJCQlicmVhazsKKwkJfSBlbHNlIGlmIChtc2ctPmwzaFtpXSA9PSAnXHInIHx8IG1zZy0+bDNoW2ldID09ICdcbicpIHsKKwkJCS8qIGxpbmUgZW5kLCBiZSBkb25lICovCisJCQlicmVhazsKKwkJfSBlbHNlIGlmICh3aGl0ZXNwYWNlKSB7CisJCQl3aGl0ZXNwYWNlID0gMDsKKwkJCXB0cnMtPnN0YXJ0ID0gaTsKKwkJfQorCX0KKworCWlmIChwdHJzX2xlbmd0aCA9PSAwKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIGZvdW5kOworfQorCitzdGF0aWMgc3RydWN0IG1nY3BfZW5kcG9pbnQgKmZpbmRfZW5kcG9pbnQoc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIGNvbnN0IGNoYXIgKm1nY3ApCit7CisJY2hhciAqZW5kcHRyID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgZ3cgPSBJTlRfTUFYOworCisJZ3cgPSBzdHJ0b3VsKG1nY3AsICZlbmRwdHIsIDE2KTsKKwlpZiAoZ3cgPT0gMCB8fCBndyA+PSBjZmctPm51bWJlcl9lbmRwb2ludHMgfHwgc3RyY21wKGVuZHB0ciwgIkBtZ3ciKSAhPSAwKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJOb3QgYWJsZSB0byBmaW5kIGVuZHBvaW50OiAnJXMnXG4iLCBtZ2NwKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuICZjZmctPmVuZHBvaW50c1tnd107Cit9CisKK2ludCBtZ2NwX2FuYWx5emVfaGVhZGVyKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnLAorCQkJc3RydWN0IG1nY3BfbXNnX3B0ciAqcHRyLCBpbnQgc2l6ZSwKKwkJCWNvbnN0IGNoYXIgKip0cmFuc2FjdGlvbl9pZCwgc3RydWN0IG1nY3BfZW5kcG9pbnQgKiplbmRwKQoreworCWludCBmb3VuZDsKKworCSp0cmFuc2FjdGlvbl9pZCA9ICIwMDAwMDAiOworCisJaWYgKHNpemUgPCAzKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJOb3QgZW5vdWdoIHNwYWNlIGluIHB0clxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlmb3VuZCA9IGZpbmRfbXNnX3BvaW50ZXJzKG1zZywgcHRyLCBzaXplKTsKKworCWlmIChmb3VuZCA8PSAzKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJHYXRld2F5OiBOb3QgZW5vdWdoIHBhcmFtcy4gRm91bmQ6ICVkXG4iLCBmb3VuZCk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIHJlcGxhY2UgdGhlIHNwYWNlIHdpdGggXDAuIHRoZSBtYWluIG1ldGhvZCBndXJhbnRlc3MgdGhhdAorCSAqIHdlIHN0aWxsIGhhdmUgKyAxIGZvciBudWxsIHRlcm1pbmF0aW9uCisJICovCisJbXNnLT5sM2hbcHRyWzNdLnN0YXJ0ICsgcHRyWzNdLmxlbmd0aCArIDFdID0gJ1wwJzsKKwltc2ctPmwzaFtwdHJbMl0uc3RhcnQgKyBwdHJbMl0ubGVuZ3RoICsgMV0gPSAnXDAnOworCW1zZy0+bDNoW3B0clsxXS5zdGFydCArIHB0clsxXS5sZW5ndGggKyAxXSA9ICdcMCc7CisJbXNnLT5sM2hbcHRyWzBdLnN0YXJ0ICsgcHRyWzBdLmxlbmd0aCArIDFdID0gJ1wwJzsKKworCWlmIChzdHJuY21wKCIxLjAiLCAoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtwdHJbM10uc3RhcnRdLCAzKSAhPSAwCisJICAgIHx8IHN0cm5jbXAoIk1HQ1AiLCAoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtwdHJbMl0uc3RhcnRdLCA0KSAhPSAwKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJXcm9uZyBNR0NQIHZlcnNpb24uIE5vdCBoYW5kbGluZzogJyVzJyAnJXMnXG4iLAorCQkJKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbcHRyWzNdLnN0YXJ0XSwKKwkJCShjb25zdCBjaGFyICopJm1zZy0+bDNoW3B0clsyXS5zdGFydF0pOworCQlyZXR1cm4gLTE7CisJfQorCisJKnRyYW5zYWN0aW9uX2lkID0gKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbcHRyWzBdLnN0YXJ0XTsKKwlpZiAoZW5kcCkgeworCQkqZW5kcCA9IGZpbmRfZW5kcG9pbnQoY2ZnLCAoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtwdHJbMV0uc3RhcnRdKTsKKwkJcmV0dXJuICplbmRwID09IE5VTEw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZlcmlmeV9jYWxsX2lkKGNvbnN0IHN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwLAorCQkJICBjb25zdCBjaGFyICpjYWxsaWQpCit7CisJaWYgKHN0cmNtcChlbmRwLT5jYWxsaWQsIGNhbGxpZCkgIT0gMCkgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiQ2FsbElEcyBkb2VzIG5vdCBtYXRjaCBvbiAweCV4LiAnJXMnICE9ICclcydcbiIsCisJCQlFTkRQT0lOVF9OVU1CRVIoZW5kcCksIGVuZHAtPmNhbGxpZCwgY2FsbGlkKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZlcmlmeV9jaShjb25zdCBzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcCwKKwkJICAgICBjb25zdCBjaGFyICpjaSkKK3sKKwlpZiAoYXRvaShjaSkgIT0gZW5kcC0+Y2kpIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIkNvbm5lY3Rpb25JZGVudGlmaWVycyBkbyBub3QgbWF0Y2ggb24gMHgleC4gJWQgIT0gJXNcbiIsCisJCQlFTkRQT0lOVF9OVU1CRVIoZW5kcCksIGVuZHAtPmNpLCBjaSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBtc2diICpoYW5kbGVfYXVkaXRfZW5kcG9pbnQoc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IG1nY3BfbXNnX3B0ciBkYXRhX3B0cnNbNl07CisJaW50IGZvdW5kLCByZXNwb25zZTsKKwljb25zdCBjaGFyICp0cmFuc19pZDsKKwlzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcDsKKworCWZvdW5kID0gbWdjcF9hbmFseXplX2hlYWRlcihjZmcsIG1zZywgZGF0YV9wdHJzLCBBUlJBWV9TSVpFKGRhdGFfcHRycyksICZ0cmFuc19pZCwgJmVuZHApOworCWlmIChmb3VuZCAhPSAwKQorCSAgICByZXNwb25zZSA9IDUwMDsKKwllbHNlCisJICAgIHJlc3BvbnNlID0gMjAwOworCisJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZShyZXNwb25zZSwgIkFVRVAiLCB0cmFuc19pZCk7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfY29ubl9tb2RlKGNvbnN0IGNoYXIqIG1zZywgaW50ICpjb25uX21vZGUpCit7CisJaW50IHJldCA9IDA7CisJaWYgKHN0cmNtcChtc2csICJyZWN2b25seSIpID09IDApCisJCSpjb25uX21vZGUgPSBNR0NQX0NPTk5fUkVDVl9PTkxZOworCWVsc2UgaWYgKHN0cmNtcChtc2csICJzZW5kcmVjdiIpID09IDApCisJCSpjb25uX21vZGUgPSBNR0NQX0NPTk5fUkVDVl9TRU5EOworCWVsc2UgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiVW5rbm93biBjb25uZWN0aW9uIG1vZGU6ICclcydcbiIsIG1zZyk7CisJCXJldCA9IC0xOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqaGFuZGxlX2NyZWF0ZV9jb24oc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IG1nY3BfbXNnX3B0ciBkYXRhX3B0cnNbNl07CisJaW50IGZvdW5kLCBpLCBsaW5lX3N0YXJ0OworCWNvbnN0IGNoYXIgKnRyYW5zX2lkOworCXN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwOworCWludCBlcnJvcl9jb2RlID0gNTAwOworCWludCBwb3J0OworCisJZm91bmQgPSBtZ2NwX2FuYWx5emVfaGVhZGVyKGNmZywgbXNnLCBkYXRhX3B0cnMsIEFSUkFZX1NJWkUoZGF0YV9wdHJzKSwgJnRyYW5zX2lkLCAmZW5kcCk7CisJaWYgKGZvdW5kICE9IDApCisJCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoNTAwLCAiQ1JDWCIsIHRyYW5zX2lkKTsKKworCWlmIChlbmRwLT5jaSAhPSBDSV9VTlVTRUQpIHsKKwkJaWYgKGNmZy0+Zm9yY2VfcmVhbGxvYykgeworCQkJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJFbmRwb2ludCAweCV4IGFscmVhZHkgYWxsb2NhdGVkLiBGb3JjaW5nIHJlYWxsb2MuXG4iLAorCQkJICAgIEVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCQltZ2NwX2ZyZWVfZW5kcChlbmRwKTsKKwkJfSBlbHNlIHsKKwkJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJFbmRwb2ludCBpcyBhbHJlYWR5IHVzZWQuIDB4JXhcbiIsCisJCQkgICAgIEVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCQlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKDUwMCwgIkNSQ1giLCB0cmFuc19pZCk7CisJCX0KKwl9CisKKwkvKiBwYXJzZSBDYWxsSUQgQzogYW5kIExvY2FsUGFyYW1ldGVycyBMOiAqLworCU1TR19UT0tFTklaRV9TVEFSVAorCXN3aXRjaCAobXNnLT5sM2hbbGluZV9zdGFydF0pIHsKKwljYXNlICdMJzoKKwkJZW5kcC0+bG9jYWxfb3B0aW9ucyA9IHRhbGxvY19zdHJkdXAoY2ZnLT5lbmRwb2ludHMsCisJCQkoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtsaW5lX3N0YXJ0ICsgM10pOworCQlicmVhazsKKwljYXNlICdDJzoKKwkJZW5kcC0+Y2FsbGlkID0gdGFsbG9jX3N0cmR1cChjZmctPmVuZHBvaW50cywKKwkJCShjb25zdCBjaGFyICopJm1zZy0+bDNoW2xpbmVfc3RhcnQgKyAzXSk7CisJCWJyZWFrOworCWNhc2UgJ00nOgorCQlpZiAocGFyc2VfY29ubl9tb2RlKChjb25zdCBjaGFyICopJm1zZy0+bDNoW2xpbmVfc3RhcnQgKyAzXSwKKwkJCSAgICAmZW5kcC0+Y29ubl9tb2RlKSAhPSAwKSB7CisJCSAgICBlcnJvcl9jb2RlID0gNTE3OworCQkgICAgZ290byBlcnJvcjI7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJVbmhhbmRsZWQgb3B0aW9uOiAnJWMnLyVkIG9uIDB4JXhcbiIsCisJCQltc2ctPmwzaFtsaW5lX3N0YXJ0XSwgbXNnLT5sM2hbbGluZV9zdGFydF0sCisJCQlFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQlicmVhazsKKwl9CisJTVNHX1RPS0VOSVpFX0VORAorCisJLyogaW5pdGlhbGl6ZSAqLworCWVuZHAtPm5ldF9ydHAgPSBlbmRwLT5uZXRfcnRjcCA9IGVuZHAtPmJ0c19ydHAgPSBlbmRwLT5idHNfcnRjcCA9IDA7CisKKwkvKiBzZXQgdG8gemVybyB1bnRpbCB3ZSBnZXQgdGhlIGluZm8gKi8KKwltZW1zZXQoJmVuZHAtPnJlbW90ZSwgMCwgc2l6ZW9mKGVuZHAtPnJlbW90ZSkpOworCisJLyogYmluZCB0byB0aGUgcG9ydCBub3cgKi8KKwlwb3J0ID0gcnRwX2NhbGN1bGF0ZV9wb3J0KEVORFBPSU5UX05VTUJFUihlbmRwKSwgY2ZnLT5ydHBfYmFzZV9wb3J0KTsKKwlpZiAoY2ZnLT5lYXJseV9iaW5kKQorCQllbmRwLT5ydHBfcG9ydCA9IHBvcnQ7CisJZWxzZSBpZiAobWdjcF9iaW5kX3J0cF9wb3J0KGVuZHAsIHBvcnQpICE9IDApCisJCWdvdG8gZXJyb3IyOworCisJLyogYXNzaWduIGEgbG9jYWwgY2FsbCBpZGVudGlmaWVyIG9yIGZhaWwgKi8KKwllbmRwLT5jaSA9IGdlbmVyYXRlX2NhbGxfaWQoY2ZnKTsKKwlpZiAoZW5kcC0+Y2kgPT0gQ0lfVU5VU0VEKQorCQlnb3RvIGVycm9yMjsKKworCWVuZHAtPmJ0c19wYXlsb2FkX3R5cGUgPSBjZmctPmF1ZGlvX3BheWxvYWQ7CisKKwkvKiBwb2xpY3kgQ0IgKi8KKwlpZiAoY2ZnLT5wb2xpY3lfY2IpIHsKKwkJc3dpdGNoIChjZmctPnBvbGljeV9jYihjZmcsIEVORFBPSU5UX05VTUJFUihlbmRwKSwgTUdDUF9FTkRQX0NSQ1gsIHRyYW5zX2lkKSkgeworCQljYXNlIE1HQ1BfUE9MSUNZX1JFSkVDVDoKKwkJCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiQ1JDWCByZWplY3RlZCBieSBwb2xpY3kgb24gMHgleFxuIiwKKwkJCSAgICAgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJCW1nY3BfZnJlZV9lbmRwKGVuZHApOworCQkJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZSg1MDAsICJDUkNYIiwgdHJhbnNfaWQpOworCQkJYnJlYWs7CisJCWNhc2UgTUdDUF9QT0xJQ1lfREVGRVI6CisJCQkvKiBzdG9wIHByb2Nlc3NpbmcgKi8KKwkJCXJldHVybiBOVUxMOworCQkJYnJlYWs7CisJCWNhc2UgTUdDUF9QT0xJQ1lfQ09OVDoKKwkJCS8qIGp1c3QgY29udGludWUgKi8KKwkJCWJyZWFrOworCQl9CisJfQorCisJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJDcmVhdGluZyBlbmRwb2ludCBvbjogMHgleCBDSTogJXUgcG9ydDogJXVcbiIsCisJCUVORFBPSU5UX05VTUJFUihlbmRwKSwgZW5kcC0+Y2ksIGVuZHAtPnJ0cF9wb3J0KTsKKwlpZiAoY2ZnLT5jaGFuZ2VfY2IpCisJCWNmZy0+Y2hhbmdlX2NiKGNmZywgRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBNR0NQX0VORFBfQ1JDWCwgZW5kcC0+cnRwX3BvcnQpOworCisJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZV93aXRoX3NkcChlbmRwLCAiQ1JDWCIsIHRyYW5zX2lkKTsKK2Vycm9yOgorCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJNYWxmb3JtZWQgbGluZTogJXMgb24gMHgleCB3aXRoOiBsaW5lX3N0YXJ0OiAlZCAlZFxuIiwKKwkJICAgIGhleGR1bXAobXNnLT5sM2gsIG1zZ2JfbDNsZW4obXNnKSksCisJCSAgICBFTkRQT0lOVF9OVU1CRVIoZW5kcCksIGxpbmVfc3RhcnQsIGkpOworCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoZXJyb3JfY29kZSwgIkNSQ1giLCB0cmFuc19pZCk7CisKK2Vycm9yMjoKKwlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIlJlc291cmNlIGVycm9yIG9uIDB4JXhcbiIsIEVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZShlcnJvcl9jb2RlLCAiQ1JDWCIsIHRyYW5zX2lkKTsKK30KKworc3RhdGljIHN0cnVjdCBtc2diICpoYW5kbGVfbW9kaWZ5X2NvbihzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgbWdjcF9tc2dfcHRyIGRhdGFfcHRyc1s2XTsKKwlpbnQgZm91bmQsIGksIGxpbmVfc3RhcnQ7CisJY29uc3QgY2hhciAqdHJhbnNfaWQ7CisJc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHA7CisJaW50IGVycm9yX2NvZGUgPSA1MDA7CisJaW50IHNpbGVudCA9IDA7CisKKwlmb3VuZCA9IG1nY3BfYW5hbHl6ZV9oZWFkZXIoY2ZnLCBtc2csIGRhdGFfcHRycywgQVJSQVlfU0laRShkYXRhX3B0cnMpLCAmdHJhbnNfaWQsICZlbmRwKTsKKwlpZiAoZm91bmQgIT0gMCkKKwkJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZShlcnJvcl9jb2RlLCAiTURDWCIsIHRyYW5zX2lkKTsKKworCWlmIChlbmRwLT5jaSA9PSBDSV9VTlVTRUQpIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIkVuZHBvaW50IGlzIG5vdCBob2xkaW5nIGEgY29ubmVjdGlvbi4gMHgleFxuIiwgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZShlcnJvcl9jb2RlLCAiTURDWCIsIHRyYW5zX2lkKTsKKwl9CisKKwlNU0dfVE9LRU5JWkVfU1RBUlQKKwlzd2l0Y2ggKG1zZy0+bDNoW2xpbmVfc3RhcnRdKSB7CisJY2FzZSAnQyc6IHsKKwkJaWYgKHZlcmlmeV9jYWxsX2lkKGVuZHAsIChjb25zdCBjaGFyICopJm1zZy0+bDNoW2xpbmVfc3RhcnQgKyAzXSkgIT0gMCkKKwkJCWdvdG8gZXJyb3IzOworCQlicmVhazsKKwl9CisJY2FzZSAnSSc6IHsKKwkJaWYgKHZlcmlmeV9jaShlbmRwLCAoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtsaW5lX3N0YXJ0ICsgM10pICE9IDApCisJCQlnb3RvIGVycm9yMzsKKwkJYnJlYWs7CisJfQorCWNhc2UgJ0wnOgorCQkvKiBza2lwICovCisJCWJyZWFrOworCWNhc2UgJ00nOgorCQlpZiAocGFyc2VfY29ubl9tb2RlKChjb25zdCBjaGFyICopJm1zZy0+bDNoW2xpbmVfc3RhcnQgKyAzXSwKKwkJCSAgICAmZW5kcC0+Y29ubl9tb2RlKSAhPSAwKSB7CisJCSAgICBlcnJvcl9jb2RlID0gNTE3OworCQkgICAgZ290byBlcnJvcjM7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAnWic6CisJCXNpbGVudCA9IHN0cmNtcCgibm9hbnN3ZXIiLCAoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtsaW5lX3N0YXJ0ICsgM10pID09IDA7CisJCWJyZWFrOworCWNhc2UgJ1wwJzoKKwkJLyogU0RQIGZpbGUgYmVnaW5zICovCisJCWJyZWFrOworCWNhc2UgJ2EnOgorCWNhc2UgJ28nOgorCWNhc2UgJ3MnOgorCWNhc2UgJ3QnOgorCWNhc2UgJ3YnOgorCQkvKiBza2lwIHRoZXNlIFNEUCBhdHRyaWJ1dGVzICovCisJCWJyZWFrOworCWNhc2UgJ20nOiB7CisJCWludCBwb3J0OworCQlpbnQgcGF5bG9hZDsKKwkJY29uc3QgY2hhciAqcGFyYW0gPSAoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtsaW5lX3N0YXJ0XTsKKworCQlpZiAoc3NjYW5mKHBhcmFtLCAibT1hdWRpbyAlZCBSVFAvQVZQICVkIiwgJnBvcnQsICZwYXlsb2FkKSA9PSAyKSB7CisJCQllbmRwLT5uZXRfcnRwID0gaHRvbnMocG9ydCk7CisJCQllbmRwLT5uZXRfcnRjcCA9IGh0b25zKHBvcnQgKyAxKTsKKwkJCWVuZHAtPm5ldF9wYXlsb2FkX3R5cGUgPSBwYXlsb2FkOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlICdjJzogeworCQljaGFyIGlwdjRbMTZdOworCQljb25zdCBjaGFyICpwYXJhbSA9IChjb25zdCBjaGFyICopJm1zZy0+bDNoW2xpbmVfc3RhcnRdOworCisJCWlmIChzc2NhbmYocGFyYW0sICJjPUlOIElQNCAlMTVzIiwgaXB2NCkgPT0gMSkgeworCQkJaW5ldF9hdG9uKGlwdjQsICZlbmRwLT5yZW1vdGUpOworCQl9CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIlVuaGFuZGxlZCBvcHRpb246ICclYycvJWQgb24gMHgleFxuIiwKKwkJCW1zZy0+bDNoW2xpbmVfc3RhcnRdLCBtc2ctPmwzaFtsaW5lX3N0YXJ0XSwKKwkJCUVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCWJyZWFrOworCX0KKwlNU0dfVE9LRU5JWkVfRU5ECisKKwkvKiBwb2xpY3kgQ0IgKi8KKwlpZiAoY2ZnLT5wb2xpY3lfY2IpIHsKKwkJc3dpdGNoIChjZmctPnBvbGljeV9jYihjZmcsIEVORFBPSU5UX05VTUJFUihlbmRwKSwgTUdDUF9FTkRQX01EQ1gsIHRyYW5zX2lkKSkgeworCQljYXNlIE1HQ1BfUE9MSUNZX1JFSkVDVDoKKwkJCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiTURDWCByZWplY3RlZCBieSBwb2xpY3kgb24gMHgleFxuIiwKKwkJCSAgICAgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJCWlmIChzaWxlbnQpCisJCQkJZ290byBvdXRfc2lsZW50OworCQkJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZSg1MDAsICJNRENYIiwgdHJhbnNfaWQpOworCQkJYnJlYWs7CisJCWNhc2UgTUdDUF9QT0xJQ1lfREVGRVI6CisJCQkvKiBzdG9wIHByb2Nlc3NpbmcgKi8KKwkJCXJldHVybiBOVUxMOworCQkJYnJlYWs7CisJCWNhc2UgTUdDUF9QT0xJQ1lfQ09OVDoKKwkJCS8qIGp1c3QgY29udGludWUgKi8KKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogbW9kaWZ5ICovCisJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJNb2RpZmllZCBlbmRwb2ludCBvbjogMHgleCBTZXJ2ZXI6ICVzOiV1XG4iLAorCQlFTkRQT0lOVF9OVU1CRVIoZW5kcCksIGluZXRfbnRvYShlbmRwLT5yZW1vdGUpLCBudG9ocyhlbmRwLT5uZXRfcnRwKSk7CisJaWYgKGNmZy0+Y2hhbmdlX2NiKQorCQljZmctPmNoYW5nZV9jYihjZmcsIEVORFBPSU5UX05VTUJFUihlbmRwKSwgTUdDUF9FTkRQX01EQ1gsIGVuZHAtPnJ0cF9wb3J0KTsKKwlpZiAoc2lsZW50KQorCQlnb3RvIG91dF9zaWxlbnQ7CisKKwlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlX3dpdGhfc2RwKGVuZHAsICJNRENYIiwgdHJhbnNfaWQpOworCitlcnJvcjoKKwlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiTWFsZm9ybWVkIGxpbmU6ICVzIG9uIDB4JXggd2l0aDogbGluZV9zdGFydDogJWQgJWQgJWRcbiIsCisJCSAgICBoZXhkdW1wKG1zZy0+bDNoLCBtc2diX2wzbGVuKG1zZykpLAorCQkgICAgRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBsaW5lX3N0YXJ0LCBpLCBtc2ctPmwzaFtsaW5lX3N0YXJ0XSk7CisJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZShlcnJvcl9jb2RlLCAiTURDWCIsIHRyYW5zX2lkKTsKKworZXJyb3IzOgorCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoZXJyb3JfY29kZSwgIk1EQ1giLCB0cmFuc19pZCk7CisKKworb3V0X3NpbGVudDoKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBtc2diICpoYW5kbGVfZGVsZXRlX2NvbihzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgbWdjcF9tc2dfcHRyIGRhdGFfcHRyc1s2XTsKKwlpbnQgZm91bmQsIGksIGxpbmVfc3RhcnQ7CisJY29uc3QgY2hhciAqdHJhbnNfaWQ7CisJc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHA7CisJaW50IGVycm9yX2NvZGUgPSA1MDA7CisJaW50IHNpbGVudCA9IDA7CisKKwlmb3VuZCA9IG1nY3BfYW5hbHl6ZV9oZWFkZXIoY2ZnLCBtc2csIGRhdGFfcHRycywgQVJSQVlfU0laRShkYXRhX3B0cnMpLCAmdHJhbnNfaWQsICZlbmRwKTsKKwlpZiAoZm91bmQgIT0gMCkKKwkJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZShlcnJvcl9jb2RlLCAiRExDWCIsIHRyYW5zX2lkKTsKKworCWlmIChlbmRwLT5jaSA9PSBDSV9VTlVTRUQpIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIkVuZHBvaW50IGlzIG5vdCB1c2VkLiAweCV4XG4iLCBFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKGVycm9yX2NvZGUsICJETENYIiwgdHJhbnNfaWQpOworCX0KKworCU1TR19UT0tFTklaRV9TVEFSVAorCXN3aXRjaCAobXNnLT5sM2hbbGluZV9zdGFydF0pIHsKKwljYXNlICdDJzogeworCQlpZiAodmVyaWZ5X2NhbGxfaWQoZW5kcCwgKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbbGluZV9zdGFydCArIDNdKSAhPSAwKQorCQkJZ290byBlcnJvcjM7CisJCWJyZWFrOworCX0KKwljYXNlICdJJzogeworCQlpZiAodmVyaWZ5X2NpKGVuZHAsIChjb25zdCBjaGFyICopJm1zZy0+bDNoW2xpbmVfc3RhcnQgKyAzXSkgIT0gMCkKKwkJCWdvdG8gZXJyb3IzOworCQlicmVhazsKKwljYXNlICdaJzoKKwkJc2lsZW50ID0gc3RyY21wKCJub2Fuc3dlciIsIChjb25zdCBjaGFyICopJm1zZy0+bDNoW2xpbmVfc3RhcnQgKyAzXSkgPT0gMDsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiVW5oYW5kbGVkIG9wdGlvbjogJyVjJy8lZCBvbiAweCV4XG4iLAorCQkJbXNnLT5sM2hbbGluZV9zdGFydF0sIG1zZy0+bDNoW2xpbmVfc3RhcnRdLAorCQkJRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJYnJlYWs7CisJfQorCU1TR19UT0tFTklaRV9FTkQKKworCS8qIHBvbGljeSBDQiAqLworCWlmIChjZmctPnBvbGljeV9jYikgeworCQlzd2l0Y2ggKGNmZy0+cG9saWN5X2NiKGNmZywgRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBNR0NQX0VORFBfRExDWCwgdHJhbnNfaWQpKSB7CisJCWNhc2UgTUdDUF9QT0xJQ1lfUkVKRUNUOgorCQkJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJETENYIHJlamVjdGVkIGJ5IHBvbGljeSBvbiAweCV4XG4iLAorCQkJICAgICBFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQkJaWYgKHNpbGVudCkKKwkJCQlnb3RvIG91dF9zaWxlbnQ7CisJCQlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKDUwMCwgIkRMQ1giLCB0cmFuc19pZCk7CisJCQlicmVhazsKKwkJY2FzZSBNR0NQX1BPTElDWV9ERUZFUjoKKwkJCS8qIHN0b3AgcHJvY2Vzc2luZyAqLworCQkJcmV0dXJuIE5VTEw7CisJCQlicmVhazsKKwkJY2FzZSBNR0NQX1BPTElDWV9DT05UOgorCQkJLyoganVzdCBjb250aW51ZSAqLworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBmcmVlIHRoZSBjb25uZWN0aW9uICovCisJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJEZWxldGVkIGVuZHBvaW50IG9uOiAweCV4IFNlcnZlcjogJXM6JXVcbiIsCisJCUVORFBPSU5UX05VTUJFUihlbmRwKSwgaW5ldF9udG9hKGVuZHAtPnJlbW90ZSksIG50b2hzKGVuZHAtPm5ldF9ydHApKTsKKwltZ2NwX2ZyZWVfZW5kcChlbmRwKTsKKwlpZiAoY2ZnLT5jaGFuZ2VfY2IpCisJCWNmZy0+Y2hhbmdlX2NiKGNmZywgRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBNR0NQX0VORFBfRExDWCwgZW5kcC0+cnRwX3BvcnQpOworCisJaWYgKHNpbGVudCkKKwkJZ290byBvdXRfc2lsZW50OworCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoMjUwLCAiRExDWCIsIHRyYW5zX2lkKTsKKworZXJyb3I6CisJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIk1hbGZvcm1lZCBsaW5lOiAlcyBvbiAweCV4IHdpdGg6IGxpbmVfc3RhcnQ6ICVkICVkXG4iLAorCQkgICAgaGV4ZHVtcChtc2ctPmwzaCwgbXNnYl9sM2xlbihtc2cpKSwKKwkJICAgIEVORFBPSU5UX05VTUJFUihlbmRwKSwgbGluZV9zdGFydCwgaSk7CisJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZShlcnJvcl9jb2RlLCAiRExDWCIsIHRyYW5zX2lkKTsKKworZXJyb3IzOgorCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoZXJyb3JfY29kZSwgIkRMQ1giLCB0cmFuc19pZCk7CisKK291dF9zaWxlbnQ6CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqaGFuZGxlX3JzaXAoc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIHN0cnVjdCBtc2diICptc2cpCit7CisJaWYgKGNmZy0+cmVzZXRfY2IpCisJCWNmZy0+cmVzZXRfY2IoY2ZnKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IG1nY3BfY29uZmlnICptZ2NwX2NvbmZpZ19hbGxvYyh2b2lkKQoreworCXN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnOworCisJY2ZnID0gdGFsbG9jX3plcm8oTlVMTCwgc3RydWN0IG1nY3BfY29uZmlnKTsKKwlpZiAoIWNmZykgeworCQlMT0dQKERNR0NQLCBMT0dMX0ZBVEFMLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGNvbmZpZy5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwljZmctPnNvdXJjZV9wb3J0ID0gMjQyNzsKKwljZmctPnNvdXJjZV9hZGRyID0gdGFsbG9jX3N0cmR1cChjZmcsICIwLjAuMC4wIik7CisJY2ZnLT5hdWRpb19uYW1lID0gdGFsbG9jX3N0cmR1cChjZmcsICJHU00tRUZSLzgwMDAiKTsKKwljZmctPmF1ZGlvX3BheWxvYWQgPSA5NzsKKwljZmctPnJ0cF9iYXNlX3BvcnQgPSBSVFBfUE9SVF9ERUZBVUxUOworCisJcmV0dXJuIGNmZzsKK30KKworaW50IG1nY3BfZW5kcG9pbnRzX2FsbG9jYXRlKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnKQoreworCWludCBpOworCisJLyogSW5pdGlhbGl6ZSBhbGwgZW5kcG9pbnRzICovCisJY2ZnLT5lbmRwb2ludHMgPSBfdGFsbG9jX3plcm9fYXJyYXkoY2ZnLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IG1nY3BfZW5kcG9pbnQpLAorCQkJCSAgICAgICBjZmctPm51bWJlcl9lbmRwb2ludHMsICJlbmRwb2ludHMiKTsKKwlpZiAoIWNmZy0+ZW5kcG9pbnRzKQorCQlyZXR1cm4gLTE7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2ZnLT5udW1iZXJfZW5kcG9pbnRzOyArK2kpIHsKKwkJY2ZnLT5lbmRwb2ludHNbaV0ubG9jYWxfcnRwLmZkID0gLTE7CisJCWNmZy0+ZW5kcG9pbnRzW2ldLmxvY2FsX3J0Y3AuZmQgPSAtMTsKKwkJY2ZnLT5lbmRwb2ludHNbaV0uY2kgPSBDSV9VTlVTRUQ7CisJCWNmZy0+ZW5kcG9pbnRzW2ldLmNmZyA9IGNmZzsKKwkJY2ZnLT5lbmRwb2ludHNbaV0ubmV0X3BheWxvYWRfdHlwZSA9IC0xOworCQljZmctPmVuZHBvaW50c1tpXS5idHNfcGF5bG9hZF90eXBlID0gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbWdjcF9mcmVlX2VuZHAoc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHApCit7CisJTE9HUChETUdDUCwgTE9HTF9ERUJVRywgIkRlbGV0aW5nIGVuZHBvaW50IG9uOiAweCV4XG4iLCBFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCWVuZHAtPmNpPSBDSV9VTlVTRUQ7CisKKwlpZiAoZW5kcC0+Y2FsbGlkKSB7CisJCXRhbGxvY19mcmVlKGVuZHAtPmNhbGxpZCk7CisJCWVuZHAtPmNhbGxpZCA9IE5VTEw7CisJfQorCisJaWYgKGVuZHAtPmxvY2FsX29wdGlvbnMpIHsKKwkJdGFsbG9jX2ZyZWUoZW5kcC0+bG9jYWxfb3B0aW9ucyk7CisJCWVuZHAtPmxvY2FsX29wdGlvbnMgPSBOVUxMOworCX0KKworCWlmICghZW5kcC0+Y2ZnLT5lYXJseV9iaW5kKSB7CisJCWJzY191bnJlZ2lzdGVyX2ZkKCZlbmRwLT5sb2NhbF9ydHApOworCQlic2NfdW5yZWdpc3Rlcl9mZCgmZW5kcC0+bG9jYWxfcnRjcCk7CisJfQorCisJZW5kcC0+bmV0X3J0cCA9IGVuZHAtPm5ldF9ydGNwID0gZW5kcC0+YnRzX3J0cCA9IGVuZHAtPmJ0c19ydGNwID0gMDsKKwllbmRwLT5uZXRfcGF5bG9hZF90eXBlID0gZW5kcC0+YnRzX3BheWxvYWRfdHlwZSA9IC0xOworCWVuZHAtPmluX2J0cyA9IGVuZHAtPmluX3JlbW90ZSA9IDA7CisJbWVtc2V0KCZlbmRwLT5yZW1vdGUsIDAsIHNpemVvZihlbmRwLT5yZW1vdGUpKTsKKwltZW1zZXQoJmVuZHAtPmJ0cywgMCwgc2l6ZW9mKGVuZHAtPmJ0cykpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvbWdjcC9tZ2NwX3Z0eS5jIGIvb3BlbmJzYy9zcmMvbWdjcC9tZ2NwX3Z0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViOTBkNTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9tZ2NwL21nY3BfdnR5LmMKQEAgLTAsMCArMSwzNTQgQEAKKy8qIEEgTWVkaWEgR2F0ZXdheSBDb250cm9sIFByb3RvY29sIE1lZGlhIEdhdGV3YXk6IFJGQyAzNDM1ICovCisvKiBUaGUgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gKi8KKworLyoKKyAqIChDKSAyMDA5LTIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMDktMjAxMCBieSBPbi1XYXZlcworICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWdjcC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWdjcF9pbnRlcm5hbC5oPgorCisjaW5jbHVkZSA8dnR5L2NvbW1hbmQuaD4KKyNpbmNsdWRlIDx2dHkvdnR5Lmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworc3RhdGljIHN0cnVjdCBtZ2NwX2NvbmZpZyAqZ19jZmcgPSBOVUxMOworCisvKgorICogdnR5IGNvZGUgZm9yIG1nY3AgYmVsb3cKKyAqLworc3RydWN0IGNtZF9ub2RlIG1nY3Bfbm9kZSA9IHsKKwlNR0NQX05PREUsCisJIiVzKG1nY3ApIyIsCisJMSwKK307CisKK3N0YXRpYyBpbnQgY29uZmlnX3dyaXRlX21nY3Aoc3RydWN0IHZ0eSAqdnR5KQoreworCXZ0eV9vdXQodnR5LCAibWdjcCVzIiwgVlRZX05FV0xJTkUpOworCWlmIChnX2NmZy0+bG9jYWxfaXApCisJCXZ0eV9vdXQodnR5LCAiICBsb2NhbCBpcCAlcyVzIiwgZ19jZmctPmxvY2FsX2lwLCBWVFlfTkVXTElORSk7CisJaWYgKGdfY2ZnLT5idHNfaXAgJiYgc3RybGVuKGdfY2ZnLT5idHNfaXApICE9IDApCisJCXZ0eV9vdXQodnR5LCAiICBidHMgaXAgJXMlcyIsIGdfY2ZnLT5idHNfaXAsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgYmluZCBpcCAlcyVzIiwgZ19jZmctPnNvdXJjZV9hZGRyLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIGJpbmQgcG9ydCAldSVzIiwgZ19jZmctPnNvdXJjZV9wb3J0LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIGJpbmQgZWFybHkgJXUlcyIsICEhZ19jZmctPmVhcmx5X2JpbmQsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgcnRwIGJhc2UgJXUlcyIsIGdfY2ZnLT5ydHBfYmFzZV9wb3J0LCBWVFlfTkVXTElORSk7CisJaWYgKGdfY2ZnLT5hdWRpb19wYXlsb2FkICE9IC0xKQorCQl2dHlfb3V0KHZ0eSwgIiAgc2RwIGF1ZGlvIHBheWxvYWQgbnVtYmVyICVkJXMiLCBnX2NmZy0+YXVkaW9fcGF5bG9hZCwgVlRZX05FV0xJTkUpOworCWlmIChnX2NmZy0+YXVkaW9fbmFtZSkKKwkJdnR5X291dCh2dHksICIgIHNkcCBhdWRpbyBwYXlsb2FkIG5hbWUgJXMlcyIsIGdfY2ZnLT5hdWRpb19uYW1lLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIGxvb3AgJXUlcyIsICEhZ19jZmctPmF1ZGlvX2xvb3AsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgbnVtYmVyIGVuZHBvaW50cyAldSVzIiwgZ19jZmctPm51bWJlcl9lbmRwb2ludHMgLSAxLCBWVFlfTkVXTElORSk7CisJaWYgKGdfY2ZnLT5mb3J3YXJkX2lwKQorCQl2dHlfb3V0KHZ0eSwgIiAgZm9yd2FyZCBhdWRpbyBpcCAlcyVzIiwgZ19jZmctPmZvcndhcmRfaXAsIFZUWV9ORVdMSU5FKTsKKwlpZiAoZ19jZmctPmZvcndhcmRfcG9ydCAhPSAwKQorCQl2dHlfb3V0KHZ0eSwgIiAgZm9yd2FyZCBhdWRpbyBwb3J0ICVkJXMiLCBnX2NmZy0+Zm9yd2FyZF9wb3J0LCBWVFlfTkVXTElORSk7CisJaWYgKGdfY2ZnLT5jYWxsX2FnZW50X2FkZHIpCisJCXZ0eV9vdXQodnR5LCAiICBjYWxsIGFnZW50IGlwICVzJXMiLCBnX2NmZy0+Y2FsbF9hZ2VudF9hZGRyLCBWVFlfTkVXTElORSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKHNob3dfbWNncCwgc2hvd19tZ2NwX2NtZCwgInNob3cgbWdjcCIsCisgICAgICBTSE9XX1NUUiAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgTUdDUCBNZWRpYSBHYXRld2F5IikKK3sKKwlpbnQgaTsKKworCXZ0eV9vdXQodnR5LCAiTUdDUCBpcyB1cCBhbmQgcnVubmluZyB3aXRoICV1IGVuZHBvaW50czolcyIsIGdfY2ZnLT5udW1iZXJfZW5kcG9pbnRzIC0gMSwgVlRZX05FV0xJTkUpOworCWZvciAoaSA9IDE7IGkgPCBnX2NmZy0+bnVtYmVyX2VuZHBvaW50czsgKytpKSB7CisJCXN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwID0gJmdfY2ZnLT5lbmRwb2ludHNbaV07CisJCXZ0eV9vdXQodnR5LCAiIEVuZHBvaW50IDB4JS4yeDogQ0k6ICVkIG5ldDogJXUvJXUgYnRzOiAldS8ldSBvbiAlcyB0cmFmZmljIHJlY2VpdmVkIGJ0czogJXUgIHJlbW90ZTogJXUlcyIsCisJCQlpLCBlbmRwLT5jaSwKKwkJCW50b2hzKGVuZHAtPm5ldF9ydHApLCBudG9ocyhlbmRwLT5uZXRfcnRjcCksCisJCQludG9ocyhlbmRwLT5idHNfcnRwKSwgbnRvaHMoZW5kcC0+YnRzX3J0Y3ApLAorCQkJaW5ldF9udG9hKGVuZHAtPmJ0cyksIGVuZHAtPmluX2J0cywgZW5kcC0+aW5fcmVtb3RlLAorCQkJVlRZX05FV0xJTkUpOworCX0KKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX21nY3AsCisgICAgICBjZmdfbWdjcF9jbWQsCisgICAgICAibWdjcCIsCisgICAgICAiQ29uZmlndXJlIHRoZSBNR0NQIikKK3sKKwl2dHktPm5vZGUgPSBNR0NQX05PREU7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbWdjcF9sb2NhbF9pcCwKKyAgICAgIGNmZ19tZ2NwX2xvY2FsX2lwX2NtZCwKKyAgICAgICJsb2NhbCBpcCBJUCIsCisgICAgICAiU2V0IHRoZSBJUCB0byBiZSB1c2VkIGluIFNEUCByZWNvcmRzIikKK3sKKwlpZiAoZ19jZmctPmxvY2FsX2lwKQorCQl0YWxsb2NfZnJlZShnX2NmZy0+bG9jYWxfaXApOworCWdfY2ZnLT5sb2NhbF9pcCA9IHRhbGxvY19zdHJkdXAoZ19jZmcsIGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX21nY3BfYnRzX2lwLAorICAgICAgY2ZnX21nY3BfYnRzX2lwX2NtZCwKKyAgICAgICJidHMgaXAgSVAiLAorICAgICAgIlNldCB0aGUgSVAgb2YgdGhlIEJUUyBmb3IgUlRQIGZvcndhcmRpbmciKQoreworCWlmIChnX2NmZy0+YnRzX2lwKQorCQl0YWxsb2NfZnJlZShnX2NmZy0+YnRzX2lwKTsKKwlnX2NmZy0+YnRzX2lwID0gdGFsbG9jX3N0cmR1cChnX2NmZywgYXJndlswXSk7CisJaW5ldF9hdG9uKGdfY2ZnLT5idHNfaXAsICZnX2NmZy0+YnRzX2luKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19tZ2NwX2JpbmRfaXAsCisgICAgICBjZmdfbWdjcF9iaW5kX2lwX2NtZCwKKyAgICAgICJiaW5kIGlwIElQIiwKKyAgICAgICJCaW5kIHRoZSBNR0NQIHRvIHRoaXMgbG9jYWwgYWRkciIpCit7CisJaWYgKGdfY2ZnLT5zb3VyY2VfYWRkcikKKwkJdGFsbG9jX2ZyZWUoZ19jZmctPnNvdXJjZV9hZGRyKTsKKwlnX2NmZy0+c291cmNlX2FkZHIgPSB0YWxsb2Nfc3RyZHVwKGdfY2ZnLCBhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19tZ2NwX2JpbmRfcG9ydCwKKyAgICAgIGNmZ19tZ2NwX2JpbmRfcG9ydF9jbWQsCisgICAgICAiYmluZCBwb3J0IDwwLTY1NTM0PiIsCisgICAgICAiQmluZCB0aGUgTUdDUCB0byB0aGlzIHBvcnQiKQoreworCXVuc2lnbmVkIGludCBwb3J0ID0gYXRvaShhcmd2WzBdKTsKKwlpZiAocG9ydCA+IDY1NTM0KSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgd3JvbmcgYmluZCBwb3J0ICclcyclcyIsIGFyZ3ZbMF0sIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWdfY2ZnLT5zb3VyY2VfcG9ydCA9IHBvcnQ7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbWdjcF9iaW5kX2Vhcmx5LAorICAgICAgY2ZnX21nY3BfYmluZF9lYXJseV9jbWQsCisgICAgICAiYmluZCBlYXJseSAoMHwxKSIsCisgICAgICAiQmluZCBhbGwgUlRQIHBvcnRzIGVhcmx5IikKK3sKKwl1bnNpZ25lZCBpbnQgYmluZCA9IGF0b2koYXJndlswXSk7CisJaWYgKGJpbmQgIT0gMCAmJiBiaW5kICE9IDEpIHsKKwkJdnR5X291dCh2dHksICIlJSBwYXJhbSBtdXN0IGJlIDAgb3IgMS4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWdfY2ZnLT5lYXJseV9iaW5kID0gYmluZCA9PSAxOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX21nY3BfcnRwX2Jhc2VfcG9ydCwKKyAgICAgIGNmZ19tZ2NwX3J0cF9iYXNlX3BvcnRfY21kLAorICAgICAgInJ0cCBiYXNlIDwwLTY1NTM0PiIsCisgICAgICAiQmFzZSBwb3J0IHRvIHVzZSIpCit7CisJdW5zaWduZWQgaW50IHBvcnQgPSBhdG9pKGFyZ3ZbMF0pOworCWlmIChwb3J0ID4gNjU1MzQpIHsKKwkJdnR5X291dCh2dHksICIlJSB3cm9uZyBiYXNlIHBvcnQgJyVzJyVzIiwgYXJndlswXSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJZ19jZmctPnJ0cF9iYXNlX3BvcnQgPSBwb3J0OworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX21nY3Bfc2RwX3BheWxvYWRfbnVtYmVyLAorICAgICAgY2ZnX21nY3Bfc2RwX3BheWxvYWRfbnVtYmVyX2NtZCwKKyAgICAgICJzZHAgYXVkaW8gcGF5bG9hZCBudW1iZXIgPDEtMjU1PiIsCisgICAgICAiU2V0IHRoZSBhdWRpbyBjb2RlYyB0byB1c2UiKQoreworCXVuc2lnbmVkIGludCBwYXlsb2FkID0gYXRvaShhcmd2WzBdKTsKKwlpZiAocGF5bG9hZCA+IDI1NSkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIHdyb25nIHBheWxvYWQgbnVtYmVyICclcyclcyIsIGFyZ3ZbMF0sIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWdfY2ZnLT5hdWRpb19wYXlsb2FkID0gcGF5bG9hZDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19tZ2NwX3NkcF9wYXlsb2FkX25hbWUsCisgICAgICBjZmdfbWdjcF9zZHBfcGF5bG9hZF9uYW1lX2NtZCwKKyAgICAgICJzZHAgYXVkaW8gcGF5bG9hZCBuYW1lIE5BTUUiLAorICAgICAgIlNldCB0aGUgYXVkaW8gbmFtZSB0byB1c2UiKQoreworCWlmIChnX2NmZy0+YXVkaW9fbmFtZSkKKwkJdGFsbG9jX2ZyZWUoZ19jZmctPmF1ZGlvX25hbWUpOworCWdfY2ZnLT5hdWRpb19uYW1lID0gdGFsbG9jX3N0cmR1cChnX2NmZywgYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbWdjcF9sb29wLAorICAgICAgY2ZnX21nY3BfbG9vcF9jbWQsCisgICAgICAibG9vcCAoMHwxKSIsCisgICAgICAiTG9vcCB0aGUgYXVkaW8iKQoreworCWdfY2ZnLT5hdWRpb19sb29wID0gYXRvaShhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19tZ2NwX251bWJlcl9lbmRwLAorICAgICAgY2ZnX21nY3BfbnVtYmVyX2VuZHBfY21kLAorICAgICAgIm51bWJlciBlbmRwb2ludHMgPDAtNjU1MzQ+IiwKKyAgICAgICJUaGUgbnVtYmVyIG9mIGVuZHBvaW50cyB0byBhbGxvY2F0ZS4gVGhpcyBpcyBub3QgZHluYW1pYy4iKQoreworCS8qICsgMSBhcyB3ZSBzdGFydCBjb3VudGluZyBhdCBvbmUgKi8KKwlnX2NmZy0+bnVtYmVyX2VuZHBvaW50cyA9IGF0b2koYXJndlswXSkgKyAxOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX21nY3BfZm9yd2FyZF9pcCwKKyAgICAgIGNmZ19tZ2NwX2ZvcndhcmRfaXBfY21kLAorICAgICAgImZvcndhcmQgYXVkaW8gaXAgSVAiLAorICAgICAgIkZvcndhcmQgcGFja2V0cyBmcm9tIGFuZCB0byB0aGUgSVAuIFRoaXMgZGlzYWJsZXMgbW9zdCBvZiB0aGUgTUdDUCBmZWF0dXJlLiIpCit7CisJaWYgKGdfY2ZnLT5mb3J3YXJkX2lwKQorCQl0YWxsb2NfZnJlZShnX2NmZy0+Zm9yd2FyZF9pcCk7CisJZ19jZmctPmZvcndhcmRfaXAgPSB0YWxsb2Nfc3RyZHVwKGdfY2ZnLCBhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19tZ2NwX2ZvcndhcmRfcG9ydCwKKyAgICAgIGNmZ19tZ2NwX2ZvcndhcmRfcG9ydF9jbWQsCisgICAgICAiZm9yd2FyZCBhdWRpbyBwb3J0IDwxLTE1MDAwPiIsCisgICAgICAiRm9yd2FyZCBwYWNrZXRzIGZyb20gYW5kIHRvIHRoZSBwb3J0LiBUaGlzIGRpc2FibGVzIG1vc3Qgb2YgdGhlIE1HQ1AgZmVhdHVyZS4iKQoreworCWdfY2ZnLT5mb3J3YXJkX3BvcnQgPSBhdG9pKGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX21nY3BfYWdlbnRfYWRkciwKKyAgICAgIGNmZ19tZ2NwX2FnZW50X2FkZHJfY21kLAorICAgICAgImNhbGwgYWdlbnQgaXAgSVAiLAorICAgICAgIlNldCB0aGUgYWRkcmVzcyBvZiB0aGUgY2FsbCBhZ2VudC4iKQoreworCWlmIChnX2NmZy0+Y2FsbF9hZ2VudF9hZGRyKQorCQl0YWxsb2NfZnJlZShnX2NmZy0+Y2FsbF9hZ2VudF9hZGRyKTsKKwlnX2NmZy0+Y2FsbF9hZ2VudF9hZGRyID0gdGFsbG9jX3N0cmR1cChnX2NmZywgYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitpbnQgbWdjcF92dHlfaW5pdCh2b2lkKQoreworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X21nY3BfY21kKTsKKworCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJmNmZ19tZ2NwX2NtZCk7CisJaW5zdGFsbF9ub2RlKCZtZ2NwX25vZGUsIGNvbmZpZ193cml0ZV9tZ2NwKTsKKwlpbnN0YWxsX2RlZmF1bHQoTUdDUF9OT0RFKTsKKwlpbnN0YWxsX2VsZW1lbnQoTUdDUF9OT0RFLCAmY2ZnX21nY3BfbG9jYWxfaXBfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTUdDUF9OT0RFLCAmY2ZnX21nY3BfYnRzX2lwX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE1HQ1BfTk9ERSwgJmNmZ19tZ2NwX2JpbmRfaXBfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTUdDUF9OT0RFLCAmY2ZnX21nY3BfYmluZF9wb3J0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE1HQ1BfTk9ERSwgJmNmZ19tZ2NwX2JpbmRfZWFybHlfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTUdDUF9OT0RFLCAmY2ZnX21nY3BfcnRwX2Jhc2VfcG9ydF9jbWQpOworCWluc3RhbGxfZWxlbWVudChNR0NQX05PREUsICZjZmdfbWdjcF9zZHBfcGF5bG9hZF9udW1iZXJfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTUdDUF9OT0RFLCAmY2ZnX21nY3Bfc2RwX3BheWxvYWRfbmFtZV9jbWQpOworCWluc3RhbGxfZWxlbWVudChNR0NQX05PREUsICZjZmdfbWdjcF9sb29wX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE1HQ1BfTk9ERSwgJmNmZ19tZ2NwX251bWJlcl9lbmRwX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE1HQ1BfTk9ERSwgJmNmZ19tZ2NwX2ZvcndhcmRfaXBfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTUdDUF9OT0RFLCAmY2ZnX21nY3BfZm9yd2FyZF9wb3J0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE1HQ1BfTk9ERSwgJmNmZ19tZ2NwX2FnZW50X2FkZHJfY21kKTsKKwlyZXR1cm4gMDsKK30KKworaW50IG1nY3BfcGFyc2VfY29uZmlnKGNvbnN0IGNoYXIgKmNvbmZpZ19maWxlLCBzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZykKK3sKKwlpbnQgaSwgcmM7CisKKwlnX2NmZyA9IGNmZzsKKwlyYyA9IHZ0eV9yZWFkX2NvbmZpZ19maWxlKGNvbmZpZ19maWxlKTsKKwlpZiAocmMgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHBhcnNlIHRoZSBjb25maWcgZmlsZTogJyVzJ1xuIiwgY29uZmlnX2ZpbGUpOworCQlyZXR1cm4gcmM7CisJfQorCisKKwlpZiAoIWdfY2ZnLT5idHNfaXApCisJCWZwcmludGYoc3RkZXJyLCAiTm8gQlRTIGlwIGFkZHJlc3Mgc3BlY2lmaWVkLiBUaGlzIHdpbGwgYWxsb3cgZXZlcnlvbmUgdG8gY29ubmVjdC5cbiIpOworCisJaWYgKCFnX2NmZy0+c291cmNlX2FkZHIpIHsKKwkJZnByaW50ZihzdGRlcnIsICJZb3UgbmVlZCB0byBzcGVjaWZ5IGEgYmluZCBhZGRyZXNzLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAobWdjcF9lbmRwb2ludHNfYWxsb2NhdGUoZ19jZmcpICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gYWxsb2NhdGUgZW5kcG9pbnRzOiAlZC4gUXVpdHRpbmcuXG4iLCBnX2NmZy0+bnVtYmVyX2VuZHBvaW50cyk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIFRoaXMgYXBwbGljYXRpb24gc3VwcG9ydHMgdHdvIG1vZGVzLgorCSAqICAgIDEuKSBhIHRydWUgTUdDUCBnYXRld2F5IHdpdGggc3VwcG9ydCBmb3IgQVVFUCwgQ1JDWCwgTURDWCwgRExDWAorCSAqICAgIDIuKSBwbGFpbiBmb3J3YXJkaW5nIG9mIFJUUCBwYWNrZXRzIG9uIHRoZSBlbmRwb2ludHMuCisJICogYm90aCBtb2RlcyBhcmUgbXV0dWFsIGV4Y2x1c2l2ZQorCSAqLworCWlmIChnX2NmZy0+Zm9yd2FyZF9pcCkgeworCQlpbnQgcG9ydCA9IGdfY2ZnLT5ydHBfYmFzZV9wb3J0OworCQlpZiAoZ19jZmctPmZvcndhcmRfcG9ydCAhPSAwKQorCQkJcG9ydCA9IGdfY2ZnLT5mb3J3YXJkX3BvcnQ7CisKKwkJaWYgKCFnX2NmZy0+ZWFybHlfYmluZCkgeworCQkJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJGb3J3YXJkaW5nIHJlcXVpcmVzIGVhcmx5IGJpbmQuXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCS8qCisJCSAqIFN0b3JlIHRoZSBmb3J3YXJkIElQIGFuZCBhc3NpZ24gYSBjaS4gRm9yIGVhcmx5IGJpbmQKKwkJICogdGhlIHNvY2tldHMgd2lsbCBiZSBjcmVhdGVkIGFmdGVyIHRoaXMuCisJCSAqLworCQlmb3IgKGkgPSAxOyBpIDwgZ19jZmctPm51bWJlcl9lbmRwb2ludHM7ICsraSkgeworCQkJc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHAgPSAmZ19jZmctPmVuZHBvaW50c1tpXTsKKwkJCWluZXRfYXRvbihnX2NmZy0+Zm9yd2FyZF9pcCwgJmVuZHAtPnJlbW90ZSk7CisJCQllbmRwLT5jaSA9IENJX1VOVVNFRCArIDIzOworCQkJZW5kcC0+bmV0X3J0cCA9IGh0b25zKHJ0cF9jYWxjdWxhdGVfcG9ydChFTkRQT0lOVF9OVU1CRVIoZW5kcCksIHBvcnQpKTsKKwkJCWVuZHAtPm5ldF9ydGNwID0gaHRvbnMocnRwX2NhbGN1bGF0ZV9wb3J0KEVORFBPSU5UX05VTUJFUihlbmRwKSwgcG9ydCkgKyAxKTsKKwkJfQorCisJCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiQ29uZmlndXJlZCBmb3IgQXVkaW8gRm9yd2FyZGluZy5cbiIpOworCX0KKworCS8qIGVhcmx5IGJpbmQgKi8KKwlpZiAoZ19jZmctPmVhcmx5X2JpbmQpIHsKKwkJZm9yIChpID0gMTsgaSA8IGdfY2ZnLT5udW1iZXJfZW5kcG9pbnRzOyArK2kpIHsKKwkJCXN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwID0gJmdfY2ZnLT5lbmRwb2ludHNbaV07CisJCQlpbnQgcnRwX3BvcnQ7CisKKwkJCXJ0cF9wb3J0ID0gcnRwX2NhbGN1bGF0ZV9wb3J0KEVORFBPSU5UX05VTUJFUihlbmRwKSwgZ19jZmctPnJ0cF9iYXNlX3BvcnQpOworCQkJaWYgKG1nY3BfYmluZF9ydHBfcG9ydChlbmRwLCBydHBfcG9ydCkgIT0gMCkgeworCQkJCUxPR1AoRE1HQ1AsIExPR0xfRkFUQUwsICJGYWlsZWQgdG8gYmluZDogJWRcbiIsIHJ0cF9wb3J0KTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gISFnX2NmZy0+Zm9yd2FyZF9pcDsKK30KKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvbW5jYy5jIGIvb3BlbmJzYy9zcmMvbW5jYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZDUzNjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9tbmNjLmMKQEAgLTAsMCArMSw0NjggQEAKKy8qIChDKSAyMDA4LTIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEFuZHJlYXMgRXZlcnNiZXJnIDxBbmRyZWFzLkV2ZXJzYmVyZ0B2ZXJzYXRlbC5kZT4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+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+Y2F1c2UudmFsdWUpOworCQlyYyA9IG1uY2Nfc2VuZChuZXQsIE1OQ0NfTU9ESUZZX1JFSiwgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgTU5DQ19NT0RJRllfQ05GOgorCQlicmVhazsKKwljYXNlIE1OQ0NfSE9MRF9JTkQ6CisJCW1uY2Nfc2V0X2NhdXNlKGRhdGEsIEdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQlHU000OF9DQ19DQVVTRV9TRVJWX09QVF9VTklNUEwpOworCQlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgUmVqZWN0aW5nIEhPTEQgd2l0aCBjYXVzZSAlZFxuIiwKKwkJCWNhbGwtPmNhbGxyZWYsIGRhdGEtPmNhdXNlLnZhbHVlKTsKKwkJcmMgPSBtbmNjX3NlbmQobmV0LCBNTkNDX0hPTERfUkVKLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBNTkNDX1JFVFJJRVZFX0lORDoKKwkJbW5jY19zZXRfY2F1c2UoZGF0YSwgR1NNNDhfQ0FVU0VfTE9DX1BSTl9TX0xVLAorCQkJCUdTTTQ4X0NDX0NBVVNFX1NFUlZfT1BUX1VOSU1QTCk7CisJCURFQlVHUChETU5DQywgIihjYWxsICV4KSBSZWplY3RpbmcgUkVUUklFVkUgd2l0aCBjYXVzZSAlZFxuIiwKKwkJCWNhbGwtPmNhbGxyZWYsIGRhdGEtPmNhdXNlLnZhbHVlKTsKKwkJcmMgPSBtbmNjX3NlbmQobmV0LCBNTkNDX1JFVFJJRVZFX1JFSiwgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgR1NNX1RDSEZfRlJBTUU6CisJY2FzZSBHU01fVENIRl9GUkFNRV9FRlI6CisJCXJjID0gbW5jY19yY3ZfdGNoZihjYWxsLCBtc2dfdHlwZSwgYXJnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETU5DQywgTE9HTF9OT1RJQ0UsICIoY2FsbCAleCkgTWVzc2FnZSB1bmhhbmRsZWRcbiIsIGNhbGxyZWYpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy4xLTEgYi9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy4xLTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI1ODA0ZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLjEtMQpAQCAtMCwwICsxLDU0IEBACishCishIE9wZW5CU0MgY29uZmlndXJhdGlvbiBzYXZlZCBmcm9tIHZ0eQorISAgICEKK3Bhc3N3b3JkIGZvbworIQorbGluZSB2dHkKKyBubyBsb2dpbgorIQorbmV0d29yaworIG5ldHdvcmsgY291bnRyeSBjb2RlIDEKKyBtb2JpbGUgbmV0d29yayBjb2RlIDEKKyBzaG9ydCBuYW1lIE9wZW5CU0MKKyBsb25nIG5hbWUgT3BlbkJTQworIHRpbWVyIHQzMTAxIDEwCisgdGltZXIgdDMxMTMgNjAKKyBidHMgMAorICB0eXBlIGJzMTEKKyAgYmFuZCBHU005MDAKKyAgY2VsbF9pZGVudGl0eSAxCisgIGxvY2F0aW9uX2FyZWFfY29kZSAxCisgIHRyYWluaW5nX3NlcXVlbmNlX2NvZGUgNworICBiYXNlX3N0YXRpb25faWRfY29kZSA2MworICBvbWwgZTEgbGluZSAwIHRpbWVzbG90IDEgc3ViLXNsb3QgZnVsbAorICBvbWwgZTEgdGVpIDI1CisgIHRyeCAwCisgICBhcmZjbiAxMjEKKyAgIG1heF9wb3dlcl9yZWQgMAorICAgcnNsIGUxIGxpbmUgMCB0aW1lc2xvdCAxIHN1Yi1zbG90IGZ1bGwKKyAgIHJzbCBlMSB0ZWkgMQorICAgIHRpbWVzbG90IDAKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBDQ0NIK1NEQ0NINAorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMSBzdWItc2xvdCBmdWxsCisgICAgdGltZXNsb3QgMQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAyIHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCAyCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDIgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDMKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMiBzdWItc2xvdCAzCisgICAgdGltZXNsb3QgNAorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAzIHN1Yi1zbG90IDAKKyAgICB0aW1lc2xvdCA1CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDMgc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDYKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMyBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgNworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAzIHN1Yi1zbG90IDMKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcuMS0yIGIvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcuMS0yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZDUwYzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy4xLTIKQEAgLTAsMCArMSw4MiBAQAorIQorISBPcGVuQlNDIGNvbmZpZ3VyYXRpb24gc2F2ZWQgZnJvbSB2dHkKKyEgICAhCitwYXNzd29yZCBmb28KKyEKK2xpbmUgdnR5Cisgbm8gbG9naW4KKyEKK25ldHdvcmsKKyBuZXR3b3JrIGNvdW50cnkgY29kZSAxCisgbW9iaWxlIG5ldHdvcmsgY29kZSAxCisgc2hvcnQgbmFtZSBPcGVuQlNDCisgbG9uZyBuYW1lIE9wZW5CU0MKKyB0aW1lciB0MzEwMSAxMAorIHRpbWVyIHQzMTEzIDYwCisgYnRzIDAKKyAgdHlwZSBiczExCisgIGJhbmQgR1NNOTAwCisgIGNlbGxfaWRlbnRpdHkgMQorICBsb2NhdGlvbl9hcmVhX2NvZGUgMQorICB0cmFpbmluZ19zZXF1ZW5jZV9jb2RlIDcKKyAgYmFzZV9zdGF0aW9uX2lkX2NvZGUgNjMKKyAgb21sIGUxIGxpbmUgMCB0aW1lc2xvdCAxIHN1Yi1zbG90IGZ1bGwKKyAgb21sIGUxIHRlaSAyNQorICB0cnggMAorICAgYXJmY24gMTIxCisgICBtYXhfcG93ZXJfcmVkIDAKKyAgIHJzbCBlMSBsaW5lIDAgdGltZXNsb3QgMSBzdWItc2xvdCBmdWxsCisgICByc2wgZTEgdGVpIDEKKyAgICB0aW1lc2xvdCAwCisgICAgIHBoeXNfY2hhbl9jb25maWcgQ0NDSCtTRENDSDQKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDEgc3ViLXNsb3QgZnVsbAorICAgIHRpbWVzbG90IDEKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBTRENDSDgKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDIgc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDIKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMiBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgMworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAyIHN1Yi1zbG90IDMKKyAgICB0aW1lc2xvdCA0CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDMgc3ViLXNsb3QgMAorICAgIHRpbWVzbG90IDUKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMyBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgNgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAzIHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCA3CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDMgc3ViLXNsb3QgMworICB0cnggMQorICAgYXJmY24gMTIzCisgICBtYXhfcG93ZXJfcmVkIDAKKyAgIHJzbCBlMSBsaW5lIDAgdGltZXNsb3QgMSBzdWItc2xvdCBmdWxsCisgICByc2wgZTEgdGVpIDIKKyAgICB0aW1lc2xvdCAwCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDQgc3ViLXNsb3QgMAorICAgIHRpbWVzbG90IDEKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNCBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgMgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA0IHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCAzCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDQgc3ViLXNsb3QgMworICAgIHRpbWVzbG90IDQKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNSBzdWItc2xvdCAwCisgICAgdGltZXNsb3QgNQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA1IHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCA2CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDUgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDcKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNSBzdWItc2xvdCAzCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy4yLTIgYi9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy4yLTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFlODAwMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLjItMgpAQCAtMCwwICsxLDE0OCBAQAorIQorISBPcGVuQlNDIGNvbmZpZ3VyYXRpb24gc2F2ZWQgZnJvbSB2dHkKKyEgICAhCitwYXNzd29yZCBmb28KKyEKK2xpbmUgdnR5Cisgbm8gbG9naW4KKyEKK25ldHdvcmsKKyBuZXR3b3JrIGNvdW50cnkgY29kZSAxCisgbW9iaWxlIG5ldHdvcmsgY29kZSAxCisgc2hvcnQgbmFtZSBPcGVuQlNDCisgbG9uZyBuYW1lIE9wZW5CU0MKKyB0aW1lciB0MzEwMSAxMAorIHRpbWVyIHQzMTEzIDYwCisgYnRzIDAKKyAgdHlwZSBiczExCisgIGJhbmQgR1NNOTAwCisgIGNlbGxfaWRlbnRpdHkgMQorICBsb2NhdGlvbl9hcmVhX2NvZGUgMQorICB0cmFpbmluZ19zZXF1ZW5jZV9jb2RlIDcKKyAgYmFzZV9zdGF0aW9uX2lkX2NvZGUgNjMKKyAgb21sIGUxIGxpbmUgMCB0aW1lc2xvdCAxIHN1Yi1zbG90IGZ1bGwKKyAgb21sIGUxIHRlaSAyNQorICB0cnggMAorICAgYXJmY24gMTIxCisgICBtYXhfcG93ZXJfcmVkIDAKKyAgIHJzbCBlMSBsaW5lIDAgdGltZXNsb3QgMSBzdWItc2xvdCBmdWxsCisgICByc2wgZTEgdGVpIDEKKyAgICB0aW1lc2xvdCAwCisgICAgIHBoeXNfY2hhbl9jb25maWcgQ0NDSCtTRENDSDQKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDEgc3ViLXNsb3QgZnVsbAorICAgIHRpbWVzbG90IDEKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMiBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgMgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAyIHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCAzCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDIgc3ViLXNsb3QgMworICAgIHRpbWVzbG90IDQKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMyBzdWItc2xvdCAwCisgICAgdGltZXNsb3QgNQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAzIHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCA2CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDMgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDcKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMyBzdWItc2xvdCAzCisgIHRyeCAxCisgICBhcmZjbiAxMjMKKyAgIG1heF9wb3dlcl9yZWQgMAorICAgcnNsIGUxIGxpbmUgMCB0aW1lc2xvdCAxIHN1Yi1zbG90IGZ1bGwKKyAgIHJzbCBlMSB0ZWkgMgorICAgIHRpbWVzbG90IDAKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNCBzdWItc2xvdCAwCisgICAgdGltZXNsb3QgMQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA0IHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCAyCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDQgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDMKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNCBzdWItc2xvdCAzCisgICAgdGltZXNsb3QgNAorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA1IHN1Yi1zbG90IDAKKyAgICB0aW1lc2xvdCA1CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDUgc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDYKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNSBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgNworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA1IHN1Yi1zbG90IDMKKyBidHMgMQorICB0eXBlIGJzMTEKKyAgYmFuZCBHU005MDAKKyAgbG9jYXRpb25fYXJlYV9jb2RlIDIKKyAgdHJhaW5pbmdfc2VxdWVuY2VfY29kZSA3CisgIGJhc2Vfc3RhdGlvbl9pZF9jb2RlIDYzCisgIG9tbCBlMSBsaW5lIDEgdGltZXNsb3QgNiBzdWItc2xvdCBmdWxsCisgIG9tbCBlMSB0ZWkgMjUKKyAgdHJ4IDAKKyAgIGFyZmNuIDEyMgorICAgbWF4X3Bvd2VyX3JlZCAwCisgICByc2wgZTEgbGluZSAxIHRpbWVzbG90IDYgc3ViLXNsb3QgZnVsbAorICAgcnNsIGUxIHRlaSAxCisgICAgdGltZXNsb3QgMAorICAgICBwaHlzX2NoYW5fY29uZmlnIENDQ0grU0RDQ0g0CisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCA3IHN1Yi1zbG90IDAKKyAgICB0aW1lc2xvdCAxCisgICAgIHBoeXNfY2hhbl9jb25maWcgU0RDQ0g4CisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCA3IHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCAyCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDcgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDMKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgNyBzdWItc2xvdCAzCisgICAgdGltZXNsb3QgNAorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCA4IHN1Yi1zbG90IDAKKyAgICB0aW1lc2xvdCA1CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDggc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDYKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgOCBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgNworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCA4IHN1Yi1zbG90IDMKKyAgdHJ4IDEKKyAgIGFyZmNuIDEyNAorICAgbWF4X3Bvd2VyX3JlZCAwCisgICByc2wgZTEgbGluZSAxIHRpbWVzbG90IDYgc3ViLXNsb3QgZnVsbAorICAgcnNsIGUxIHRlaSAyCisgICAgdGltZXNsb3QgMAorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCA5IHN1Yi1zbG90IDAKKyAgICB0aW1lc2xvdCAxCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDkgc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDIKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgOSBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgMworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCA5IHN1Yi1zbG90IDMKKyAgICB0aW1lc2xvdCA0CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDEwIHN1Yi1zbG90IDAKKyAgICB0aW1lc2xvdCA1CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDEwIHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCA2CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDEwIHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCA3CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDEwIHN1Yi1zbG90IDMKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLm5hbm9idHMgYi9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy5uYW5vYnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMGJhNzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy5uYW5vYnRzCkBAIC0wLDAgKzEsNzUgQEAKKyEKKyEgT3BlbkJTQyBjb25maWd1cmF0aW9uIHNhdmVkIGZyb20gdnR5CishICAgIQorcGFzc3dvcmQgZm9vCishCitsaW5lIHZ0eQorIG5vIGxvZ2luCishCituZXR3b3JrCisgbmV0d29yayBjb3VudHJ5IGNvZGUgMQorIG1vYmlsZSBuZXR3b3JrIGNvZGUgMQorIHNob3J0IG5hbWUgT3BlbkJTQworIGxvbmcgbmFtZSBPcGVuQlNDCisgYXV0aCBwb2xpY3kgY2xvc2VkCisgbG9jYXRpb24gdXBkYXRpbmcgcmVqZWN0IGNhdXNlIDEzCisgZW5jcnlwdGlvbiBhNSAwCisgbmVjaSAwCisgcnJscCBtb2RlIG5vbmUKKyBtbSBpbmZvIDEKKyBoYW5kb3ZlciAwCisgaGFuZG92ZXIgd2luZG93IHJ4bGV2IGF2ZXJhZ2luZyAxMAorIGhhbmRvdmVyIHdpbmRvdyByeHF1YWwgYXZlcmFnaW5nIDEKKyBoYW5kb3ZlciB3aW5kb3cgcnhsZXYgbmVpZ2hib3IgYXZlcmFnaW5nIDEwCisgaGFuZG92ZXIgcG93ZXIgYnVkZ2V0IGludGVydmFsIDYKKyBoYW5kb3ZlciBwb3dlciBidWRnZXQgaHlzdGVyZXNpcyAzCisgaGFuZG92ZXIgbWF4aW11bSBkaXN0YW5jZSA5OTk5CisgdGltZXIgdDMxMDEgMTAKKyB0aW1lciB0MzEwMyAwCisgdGltZXIgdDMxMDUgMAorIHRpbWVyIHQzMTA3IDAKKyB0aW1lciB0MzEwOSAwCisgdGltZXIgdDMxMTEgMAorIHRpbWVyIHQzMTEzIDYwCisgdGltZXIgdDMxMTUgMAorIHRpbWVyIHQzMTE3IDAKKyB0aW1lciB0MzExOSAwCisgdGltZXIgdDMxNDEgMAorIGJ0cyAwCisgIHR5cGUgbmFub2J0cworICBiYW5kIERDUzE4MDAKKyAgY2VsbF9pZGVudGl0eSAwCisgIGxvY2F0aW9uX2FyZWFfY29kZSAxCisgIHRyYWluaW5nX3NlcXVlbmNlX2NvZGUgNworICBiYXNlX3N0YXRpb25faWRfY29kZSA2MworICBtcyBtYXggcG93ZXIgMTUKKyAgY2VsbCByZXNlbGVjdGlvbiBoeXN0ZXJlc2lzIDQKKyAgcnhsZXYgYWNjZXNzIG1pbiAwCisgIGNoYW5uZWwgYWxsb2NhdG9yIGFzY2VuZGluZworICByYWNoIHR4IGludGVnZXIgOQorICByYWNoIG1heCB0cmFuc21pc3Npb24gNworICBpcC5hY2Nlc3MgdW5pdF9pZCAxODAxIDAKKyAgb21sIGlwLmFjY2VzcyBzdHJlYW1faWQgMjU1CisgIGdwcnMgbW9kZSBub25lCisgIHRyeCAwCisgICByZl9sb2NrZWQgMAorICAgYXJmY24gNTE0CisgICBub21pbmFsIHBvd2VyIDIzCisgICBtYXhfcG93ZXJfcmVkIDIwCisgICByc2wgZTEgdGVpIDAKKyAgICB0aW1lc2xvdCAwCisgICAgIHBoeXNfY2hhbl9jb25maWcgQ0NDSCtTRENDSDQKKyAgICB0aW1lc2xvdCAxCisgICAgIHBoeXNfY2hhbl9jb25maWcgU0RDQ0g4CisgICAgdGltZXNsb3QgMgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgMworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgNAorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgNQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgNgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgNworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy5uYW5vYnRzLm11bHRpdHJ4IGIvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcubmFub2J0cy5tdWx0aXRyeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTI3ZmY1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcubmFub2J0cy5tdWx0aXRyeApAQCAtMCwwICsxLDk3IEBACishCishIE9wZW5CU0MgY29uZmlndXJhdGlvbiBzYXZlZCBmcm9tIHZ0eQorISAgICEKK3Bhc3N3b3JkIGZvbworIQorbGluZSB2dHkKKyBubyBsb2dpbgorIQorbmV0d29yaworIG5ldHdvcmsgY291bnRyeSBjb2RlIDEKKyBtb2JpbGUgbmV0d29yayBjb2RlIDEKKyBzaG9ydCBuYW1lIE9wZW5CU0MKKyBsb25nIG5hbWUgT3BlbkJTQworIGF1dGggcG9saWN5IGNsb3NlZAorIGxvY2F0aW9uIHVwZGF0aW5nIHJlamVjdCBjYXVzZSAxMworIGVuY3J5cHRpb24gYTUgMAorIG5lY2kgMAorIHJybHAgbW9kZSBub25lCisgbW0gaW5mbyAwCisgaGFuZG92ZXIgMAorIGhhbmRvdmVyIHdpbmRvdyByeGxldiBhdmVyYWdpbmcgMTAKKyBoYW5kb3ZlciB3aW5kb3cgcnhxdWFsIGF2ZXJhZ2luZyAxCisgaGFuZG92ZXIgd2luZG93IHJ4bGV2IG5laWdoYm9yIGF2ZXJhZ2luZyAxMAorIGhhbmRvdmVyIHBvd2VyIGJ1ZGdldCBpbnRlcnZhbCA2CisgaGFuZG92ZXIgcG93ZXIgYnVkZ2V0IGh5c3RlcmVzaXMgMworIGhhbmRvdmVyIG1heGltdW0gZGlzdGFuY2UgOTk5OQorIHRpbWVyIHQzMTAxIDEwCisgdGltZXIgdDMxMDMgMAorIHRpbWVyIHQzMTA1IDAKKyB0aW1lciB0MzEwNyAwCisgdGltZXIgdDMxMDkgMAorIHRpbWVyIHQzMTExIDAKKyB0aW1lciB0MzExMyA2MAorIHRpbWVyIHQzMTE1IDAKKyB0aW1lciB0MzExNyAwCisgdGltZXIgdDMxMTkgMAorIHRpbWVyIHQzMTQxIDAKKyBidHMgMAorICB0eXBlIG5hbm9idHMKKyAgYmFuZCBEQ1MxODAwCisgIGNlbGxfaWRlbnRpdHkgMAorICBsb2NhdGlvbl9hcmVhX2NvZGUgMQorICB0cmFpbmluZ19zZXF1ZW5jZV9jb2RlIDcKKyAgYmFzZV9zdGF0aW9uX2lkX2NvZGUgNjMKKyAgbXMgbWF4IHBvd2VyIDE1CisgIGNlbGwgcmVzZWxlY3Rpb24gaHlzdGVyZXNpcyA0CisgIHJ4bGV2IGFjY2VzcyBtaW4gMAorICBjaGFubmVsIGFsbG9jYXRvciBhc2NlbmRpbmcKKyAgcmFjaCB0eCBpbnRlZ2VyIDkKKyAgcmFjaCBtYXggdHJhbnNtaXNzaW9uIDcKKyAgaXAuYWNjZXNzIHVuaXRfaWQgMTgwMCAwCisgIG9tbCBpcC5hY2Nlc3Mgc3RyZWFtX2lkIDI1NQorICBncHJzIG1vZGUgbm9uZQorICB0cnggMAorICAgcmZfbG9ja2VkIDAKKyAgIGFyZmNuIDg3MQorICAgbm9taW5hbCBwb3dlciAyMworICAgbWF4X3Bvd2VyX3JlZCAwCisgICByc2wgZTEgdGVpIDAKKyAgICB0aW1lc2xvdCAwCisgICAgIHBoeXNfY2hhbl9jb25maWcgQ0NDSCtTRENDSDQKKyAgICB0aW1lc2xvdCAxCisgICAgIHBoeXNfY2hhbl9jb25maWcgU0RDQ0g4CisgICAgdGltZXNsb3QgMgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgMworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgNAorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgNQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgNgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgNworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgIHRyeCAxCisgICByZl9sb2NrZWQgMAorICAgYXJmY24gODczCisgICBub21pbmFsIHBvd2VyIDIzCisgICBtYXhfcG93ZXJfcmVkIDAKKyAgIHJzbCBlMSB0ZWkgMAorICAgIHRpbWVzbG90IDAKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBTRENDSDgKKyAgICB0aW1lc2xvdCAxCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICB0aW1lc2xvdCAyCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICB0aW1lc2xvdCAzCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICB0aW1lc2xvdCA0CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICB0aW1lc2xvdCA1CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICB0aW1lc2xvdCA2CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICB0aW1lc2xvdCA3CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3BhZ2luZy5jIGIvb3BlbmJzYy9zcmMvcGFnaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJlZDkwMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3BhZ2luZy5jCkBAIC0wLDAgKzEsMzI5IEBACisvKiBQYWdpbmcgaGVscGVyIGFuZCBtYW5hZ2VyLi4uLiAqLworLyogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKy8qCisgKiBSZWxldmFudCBzcGVjczoKKyAqICAgICAxMi4yMToKKyAqICAgICAgIC0gOS40LjEyIGZvciBDQ0NIIExvY2FsIFRocmVzaG9sZAorICoKKyAqICAgICAwNS41ODoKKyAqICAgICAgIC0gOC41LjIgQ0NDSCBMb2FkIGluZGljYXRpb24KKyAqICAgICAgIC0gOS4zLjE1IFBhZ2luZyBMb2FkCisgKgorICogQXBwcm9hY2g6CisgKiAgICAgICAtIFNlbmQgcGFnaW5nIGNvbW1hbmQgdG8gc3Vic2NyaWJlcgorICogICAgICAgLSBPbiBDaGFubmVsIFJlcXVlc3Qgd2Ugd2lsbCByZW1lbWJlciB0aGUgcmVhc29uCisgKiAgICAgICAtIEFmdGVyIHRoZSBBQ0sgd2Ugd2lsbCByZXF1ZXN0IHRoZSBpZGVudGl0eQorICoJIC0gVGhlbiB3ZSB3aWxsIHNlbmQgYXNzaWduIHRoZSBnc21fc3Vic2NyaWJlciBhbmQKKyAqCSAtIGFuZCBjYWxsIGEgY2FsbGJhY2sKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvcGFnaW5nLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2NoYW5fYWxsb2MuaD4KKwordm9pZCAqdGFsbF9wYWdpbmdfY3R4OworCitzdGF0aWMgdW5zaWduZWQgaW50IGNhbGN1bGF0ZV9ncm91cChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKwlpbnQgY2NjaF9jb25mOworCWludCBic19jY19jaGFuczsKKwlpbnQgYmxvY2tzOworCXVuc2lnbmVkIGludCBncm91cDsKKwkKKwljY2NoX2NvbmYgPSBidHMtPnNpX2NvbW1vbi5jaGFuX2Rlc2MuY2NjaF9jb25mOworCWJzX2NjX2NoYW5zID0gcnNsX2NjY2hfY29uZl90b19ic19jY19jaGFucyhjY2NoX2NvbmYpOworCS8qIGNvZGUgd29yZCArIDIsIGFzIDIgY2hhbm5lbHMgZXF1YWxzIDB4MCAqLworCWJsb2NrcyA9IHJzbF9udW1iZXJfb2ZfcGFnaW5nX3N1YmNoYW5uZWxzKGJ0cyk7CisJZ3JvdXAgPSBnZXRfcGFnaW5nX2dyb3VwKHN0cl90b19pbXNpKHN1YnNjci0+aW1zaSksCisJCQkJCWJzX2NjX2NoYW5zLCBibG9ja3MpOworCXJldHVybiBncm91cDsKK30KKworLyoKKyAqIEtpbGwgb25lIHBhZ2luZyByZXF1ZXN0IHVwZGF0ZSB0aGUgaW50ZXJuYWwgbGlzdC4uLgorICovCitzdGF0aWMgdm9pZCBwYWdpbmdfcmVtb3ZlX3JlcXVlc3Qoc3RydWN0IGdzbV9idHNfcGFnaW5nX3N0YXRlICpwYWdpbmdfYnRzLAorCQkJCXN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKnRvX2JlX2RlbGV0ZWQpCit7CisJYnNjX2RlbF90aW1lcigmdG9fYmVfZGVsZXRlZC0+VDMxMTMpOworCWxsaXN0X2RlbCgmdG9fYmVfZGVsZXRlZC0+ZW50cnkpOworCXN1YnNjcl9wdXQodG9fYmVfZGVsZXRlZC0+c3Vic2NyKTsKKwl0YWxsb2NfZnJlZSh0b19iZV9kZWxldGVkKTsKK30KKworc3RhdGljIHZvaWQgcGFnZV9tcyhzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICpyZXF1ZXN0KQoreworCXVfaW50OF90IG1pWzEyOF07CisJdW5zaWduZWQgaW50IG1pX2xlbjsKKwl1bnNpZ25lZCBpbnQgcGFnZV9ncm91cDsKKworCUxPR1AoRFBBRywgTE9HTF9JTkZPLCAiR29pbmcgdG8gc2VuZCBwYWdpbmcgY29tbWFuZHM6IGltc2k6ICclcycgdG1zaTogJzB4JXgnXG4iLAorCQlyZXF1ZXN0LT5zdWJzY3ItPmltc2ksIHJlcXVlc3QtPnN1YnNjci0+dG1zaSk7CisKKwlpZiAocmVxdWVzdC0+c3Vic2NyLT50bXNpID09IEdTTV9SRVNFUlZFRF9UTVNJKQorCQltaV9sZW4gPSBnc200OF9nZW5lcmF0ZV9taWRfZnJvbV9pbXNpKG1pLCByZXF1ZXN0LT5zdWJzY3ItPmltc2kpOworCWVsc2UKKwkJbWlfbGVuID0gZ3NtNDhfZ2VuZXJhdGVfbWlkX2Zyb21fdG1zaShtaSwgcmVxdWVzdC0+c3Vic2NyLT50bXNpKTsKKworCXBhZ2VfZ3JvdXAgPSBjYWxjdWxhdGVfZ3JvdXAocmVxdWVzdC0+YnRzLCByZXF1ZXN0LT5zdWJzY3IpOworCXJzbF9wYWdpbmdfY21kKHJlcXVlc3QtPmJ0cywgcGFnZV9ncm91cCwgbWlfbGVuLCBtaSwKKwkJCXJlcXVlc3QtPmNoYW5fdHlwZSk7Cit9CisKKy8qCisgKiBUaGlzIGlzIGtpY2tlZCBieSB0aGUgcGVyaW9kaWMgUEFHSU5HIExPQUQgSW5kaWNhdG9yCisgKiBjb21pbmcgZnJvbSBhYmlzX3JzbC5jCisgKgorICogV2UgYXR0ZW1wdCB0byBpdGVyYXRlIG9uY2Ugb3ZlciB0aGUgbGlzdCBvZiBpdGVtcyBidXQKKyAqIG9ubHkgdXB0byBhdmFpbGFibGVfc2xvdHMuCisgKi8KK3N0YXRpYyB2b2lkIHBhZ2luZ19oYW5kbGVfcGVuZGluZ19yZXF1ZXN0cyhzdHJ1Y3QgZ3NtX2J0c19wYWdpbmdfc3RhdGUgKnBhZ2luZ19idHMpCit7CisJc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCAqaW5pdGlhbF9yZXF1ZXN0ID0gTlVMTDsKKwlzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICpjdXJyZW50X3JlcXVlc3QgPSBOVUxMOworCisJLyoKKwkgKiBEZXRlcm1pbmUgaWYgdGhlIHBlbmRpbmdfcmVxdWVzdHMgbGlzdCBpcyBlbXB0eSBhbmQKKwkgKiByZXR1cm4gdGhlbi4KKwkgKi8KKwlpZiAobGxpc3RfZW1wdHkoJnBhZ2luZ19idHMtPnBlbmRpbmdfcmVxdWVzdHMpKSB7CisJCS8qIHNpbmNlIHRoZSBsaXN0IGlzIGVtcHR5LCBubyBuZWVkIHRvIHJlc2NoZWR1bGUgdGhlIHRpbWVyICovCisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIEluIGNhc2UgdGhlIEJUUyBkb2VzIG5vdCBwcm92aWRlIHVzIHdpdGggbG9hZCBpbmRpY2F0aW9uIGp1c3QgZmlsbAorCSAqIHVwIG91ciBzbG90cyBmb3IgdGhpcyByb3VuZC4gV2Ugc2hvdWxkIGJlIGFibGUgdG8gcGFnZSAyMCBzdWJzY3JpYmVycworCSAqIGV2ZXJ5IHR3byBzZWNvbmRzLiBTbyB3ZSB3aWxsIGp1c3QgZ2l2ZSB0aGUgQlRTIHNvbWUgZXh0cmEgY3JlZGl0LgorCSAqIFdlIHdpbGwgaGF2ZSB0byBzZWUgaG93IG9mdGVuIHdlIHJ1biBvdXQgb2YgdGhpcyBjcmVkaXQsIHNvIHdlIG1pZ2h0CisJICogbmVlZCBhIGxvdyB3YXRlcm1hcmsgYW5kIHRoZW4gYWRkIGNyZWRpdCBvciBnaXZlIDIwIGV2ZXJ5IHJ1biB3aGVuCisJICogdGhlIGJ0cyBzZXRzIGFuIG9wdGlvbiBmb3IgdGhhdC4KKwkgKi8KKwlpZiAocGFnaW5nX2J0cy0+YXZhaWxhYmxlX3Nsb3RzID09IDApIHsKKwkJTE9HUChEUEFHLCBMT0dMX05PVElDRSwgIk5vIHNsb3RzIGF2YWlsYWJsZSBvbiBidHMgbnIgJWRcbiIsCisJCSAgICAgcGFnaW5nX2J0cy0+YnRzLT5ucik7CisJCXBhZ2luZ19idHMtPmF2YWlsYWJsZV9zbG90cyA9IDIwOworCX0KKworCWluaXRpYWxfcmVxdWVzdCA9IGxsaXN0X2VudHJ5KHBhZ2luZ19idHMtPnBlbmRpbmdfcmVxdWVzdHMubmV4dCwKKwkJCQkgICAgICBzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0LCBlbnRyeSk7CisJY3VycmVudF9yZXF1ZXN0ID0gaW5pdGlhbF9yZXF1ZXN0OworCisJZG8geworCQkvKiBoYW5kbGUgdGhlIHBhZ2luZyByZXF1ZXN0IG5vdyAqLworCQlwYWdlX21zKGN1cnJlbnRfcmVxdWVzdCk7CisJCXBhZ2luZ19idHMtPmF2YWlsYWJsZV9zbG90cy0tOworCisJCS8qIHRha2UgdGhlIGN1cnJlbnQgYW5kIGFkZCBpdCB0byB0aGUgYmFjayAqLworCQlsbGlzdF9kZWwoJmN1cnJlbnRfcmVxdWVzdC0+ZW50cnkpOworCQlsbGlzdF9hZGRfdGFpbCgmY3VycmVudF9yZXF1ZXN0LT5lbnRyeSwgJnBhZ2luZ19idHMtPnBlbmRpbmdfcmVxdWVzdHMpOworCisJCS8qIHRha2UgdGhlIG5leHQgcmVxdWVzdCAqLworCQljdXJyZW50X3JlcXVlc3QgPSBsbGlzdF9lbnRyeShwYWdpbmdfYnRzLT5wZW5kaW5nX3JlcXVlc3RzLm5leHQsCisJCQkJCSAgICAgIHN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QsIGVudHJ5KTsKKwl9IHdoaWxlIChwYWdpbmdfYnRzLT5hdmFpbGFibGVfc2xvdHMgPiAwCisJCSAgICAmJiAgaW5pdGlhbF9yZXF1ZXN0ICE9IGN1cnJlbnRfcmVxdWVzdCk7CisKKwlic2Nfc2NoZWR1bGVfdGltZXIoJnBhZ2luZ19idHMtPndvcmtfdGltZXIsIDIsIDApOworfQorCitzdGF0aWMgdm9pZCBwYWdpbmdfd29ya2VyKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGdzbV9idHNfcGFnaW5nX3N0YXRlICpwYWdpbmdfYnRzID0gZGF0YTsKKworCXBhZ2luZ19oYW5kbGVfcGVuZGluZ19yZXF1ZXN0cyhwYWdpbmdfYnRzKTsKK30KKwordm9pZCBwYWdpbmdfaW5pdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCWJ0cy0+cGFnaW5nLmJ0cyA9IGJ0czsKKwlJTklUX0xMSVNUX0hFQUQoJmJ0cy0+cGFnaW5nLnBlbmRpbmdfcmVxdWVzdHMpOworCWJ0cy0+cGFnaW5nLndvcmtfdGltZXIuY2IgPSBwYWdpbmdfd29ya2VyOworCWJ0cy0+cGFnaW5nLndvcmtfdGltZXIuZGF0YSA9ICZidHMtPnBhZ2luZzsKKworCS8qIExhcmdlIG51bWJlciwgdW50aWwgd2UgZ2V0IGEgcHJvcGVyIG1lc3NhZ2UgKi8KKwlidHMtPnBhZ2luZy5hdmFpbGFibGVfc2xvdHMgPSAyMDsKK30KKworc3RhdGljIGludCBwYWdpbmdfcGVuZGluZ19yZXF1ZXN0KHN0cnVjdCBnc21fYnRzX3BhZ2luZ19zdGF0ZSAqYnRzLAorCQkJCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKSB7CisJc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCAqcmVxOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkocmVxLCAmYnRzLT5wZW5kaW5nX3JlcXVlc3RzLCBlbnRyeSkgeworCQlpZiAoc3Vic2NyID09IHJlcS0+c3Vic2NyKQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7CQorfQorCitzdGF0aWMgdm9pZCBwYWdpbmdfVDMxMTNfZXhwaXJlZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKnJlcSA9IChzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICopZGF0YTsKKwlzdHJ1Y3QgcGFnaW5nX3NpZ25hbF9kYXRhIHNpZ19kYXRhOworCXZvaWQgKmNiZm5fcGFyYW07CisJZ3NtX2NiZm4gKmNiZm47CisKKwlMT0dQKERQQUcsIExPR0xfSU5GTywgIlQzMTEzIGV4cGlyZWQgZm9yIHJlcXVlc3QgJXAgKCVzKVxuIiwKKwkJcmVxLCByZXEtPnN1YnNjci0+aW1zaSk7CisJCisJc2lnX2RhdGEuc3Vic2NyID0gcmVxLT5zdWJzY3I7CisJc2lnX2RhdGEuYnRzCT0gcmVxLT5idHM7CisJc2lnX2RhdGEubGNoYW4JPSBOVUxMOworCisJLyogbXVzdCBiZSBkZXN0cm95ZWQgYmVmb3JlIGNhbGxpbmcgY2JmbiwgdG8gcHJldmVudCBkb3VibGUgZnJlZSAqLworCWNvdW50ZXJfaW5jKHJlcS0+YnRzLT5uZXR3b3JrLT5zdGF0cy5wYWdpbmcuZXhwaXJlZCk7CisJY2Jmbl9wYXJhbSA9IHJlcS0+Y2Jmbl9wYXJhbTsKKwljYmZuID0gcmVxLT5jYmZuOworCXBhZ2luZ19yZW1vdmVfcmVxdWVzdCgmcmVxLT5idHMtPnBhZ2luZywgcmVxKTsKKworCisJZGlzcGF0Y2hfc2lnbmFsKFNTX1BBR0lORywgU19QQUdJTkdfRVhQSVJFRCwgJnNpZ19kYXRhKTsKKwlpZiAoY2JmbikKKwkJY2JmbihHU01fSE9PS19SUl9QQUdJTkcsIEdTTV9QQUdJTkdfRVhQSVJFRCwgTlVMTCwgTlVMTCwKKwkJCSAgY2Jmbl9wYXJhbSk7Cit9CisKK3N0YXRpYyBpbnQgX3BhZ2luZ19yZXF1ZXN0KHN0cnVjdCBnc21fYnRzICpidHMsIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJICAgIGludCB0eXBlLCBnc21fY2JmbiAqY2Jmbiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX2J0c19wYWdpbmdfc3RhdGUgKmJ0c19lbnRyeSA9ICZidHMtPnBhZ2luZzsKKwlzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICpyZXE7CisKKwlpZiAocGFnaW5nX3BlbmRpbmdfcmVxdWVzdChidHNfZW50cnksIHN1YnNjcikpIHsKKwkJTE9HUChEUEFHLCBMT0dMX0lORk8sICJQYWdpbmcgcmVxdWVzdCBhbHJlYWR5IHBlbmRpbmcgZm9yICVzXG4iLCBzdWJzY3ItPmltc2kpOworCQlyZXR1cm4gLUVFWElTVDsKKwl9CisKKwlMT0dQKERQQUcsIExPR0xfREVCVUcsICJTdGFydCBwYWdpbmcgb2Ygc3Vic2NyaWJlciAlbGx1IG9uIGJ0cyAlZC5cbiIsCisJCXN1YnNjci0+aWQsIGJ0cy0+bnIpOworCXJlcSA9IHRhbGxvY196ZXJvKHRhbGxfcGFnaW5nX2N0eCwgc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCk7CisJcmVxLT5zdWJzY3IgPSBzdWJzY3JfZ2V0KHN1YnNjcik7CisJcmVxLT5idHMgPSBidHM7CisJcmVxLT5jaGFuX3R5cGUgPSB0eXBlOworCXJlcS0+Y2JmbiA9IGNiZm47CisJcmVxLT5jYmZuX3BhcmFtID0gZGF0YTsKKwlyZXEtPlQzMTEzLmNiID0gcGFnaW5nX1QzMTEzX2V4cGlyZWQ7CisJcmVxLT5UMzExMy5kYXRhID0gcmVxOworCWJzY19zY2hlZHVsZV90aW1lcigmcmVxLT5UMzExMywgYnRzLT5uZXR3b3JrLT5UMzExMywgMCk7CisJbGxpc3RfYWRkX3RhaWwoJnJlcS0+ZW50cnksICZidHNfZW50cnktPnBlbmRpbmdfcmVxdWVzdHMpOworCisJaWYgKCFic2NfdGltZXJfcGVuZGluZygmYnRzX2VudHJ5LT53b3JrX3RpbWVyKSkKKwkJYnNjX3NjaGVkdWxlX3RpbWVyKCZidHNfZW50cnktPndvcmtfdGltZXIsIDIsIDApOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBwYWdpbmdfcmVxdWVzdChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldHdvcmssIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkgICBpbnQgdHlwZSwgZ3NtX2NiZm4gKmNiZm4sIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IE5VTEw7CisJaW50IG51bV9wYWdlcyA9IDA7CisKKwljb3VudGVyX2luYyhuZXR3b3JrLT5zdGF0cy5wYWdpbmcuYXR0ZW1wdGVkKTsKKworCS8qIHN0YXJ0IHBhZ2luZyBzdWJzY3JpYmVyIG9uIGFsbCBCVFMgd2l0aGluIExvY2F0aW9uIEFyZWEgKi8KKwlkbyB7CisJCWludCByYzsKKworCQlidHMgPSBnc21fYnRzX2J5X2xhYyhuZXR3b3JrLCBzdWJzY3ItPmxhYywgYnRzKTsKKwkJaWYgKCFidHMpCisJCQlicmVhazsKKworCQkvKiBza2lwIGFsbCBjdXJyZW50bHkgaW5hY3RpdmUgVFJYICovCisJCWlmICghdHJ4X2lzX3VzYWJsZShidHMtPmMwKSkKKwkJCWNvbnRpbnVlOworCisJCW51bV9wYWdlcysrOworCisJCS8qIFRyaWdnZXIgcGFnaW5nLCBwYXNzIGFueSBlcnJvciB0byBjYWxsZXIgKi8KKwkJcmMgPSBfcGFnaW5nX3JlcXVlc3QoYnRzLCBzdWJzY3IsIHR5cGUsIGNiZm4sIGRhdGEpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCX0gd2hpbGUgKDEpOworCisJaWYgKG51bV9wYWdlcyA9PSAwKQorCQljb3VudGVyX2luYyhuZXR3b3JrLT5zdGF0cy5wYWdpbmcuZGV0YWNoZWQpOworCisJcmV0dXJuIG51bV9wYWdlczsKK30KKworCisvKiB3ZSBjb25zY2lvdXNseSBpZ25vcmUgdGhlIHR5cGUgb2YgdGhlIHJlcXVlc3QgaGVyZSAqLworc3RhdGljIHZvaWQgX3BhZ2luZ19yZXF1ZXN0X3N0b3Aoc3RydWN0IGdzbV9idHMgKmJ0cywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQkJIHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN0cnVjdCBnc21fYnRzX3BhZ2luZ19zdGF0ZSAqYnRzX2VudHJ5ID0gJmJ0cy0+cGFnaW5nOworCXN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKnJlcSwgKnJlcTI7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlcSwgcmVxMiwgJmJ0c19lbnRyeS0+cGVuZGluZ19yZXF1ZXN0cywKKwkJCQkgZW50cnkpIHsKKwkJaWYgKHJlcS0+c3Vic2NyID09IHN1YnNjcikgeworCQkJaWYgKGxjaGFuICYmIHJlcS0+Y2JmbikgeworCQkJCUxPR1AoRFBBRywgTE9HTF9ERUJVRywgIlN0b3AgcGFnaW5nIG9uIGJ0cyAlZCwgY2FsbGluZyBjYmZuLlxuIiwgYnRzLT5ucik7CisJCQkJcmVxLT5jYmZuKEdTTV9IT09LX1JSX1BBR0lORywgR1NNX1BBR0lOR19TVUNDRUVERUQsCisJCQkJCSAgTlVMTCwgbGNoYW4sIHJlcS0+Y2Jmbl9wYXJhbSk7CisJCQl9IGVsc2UKKwkJCQlMT0dQKERQQUcsIExPR0xfREVCVUcsICJTdG9wIHBhZ2luZyBvbiBidHMgJWQgc2lsZW50bHkuXG4iLCBidHMtPm5yKTsKKwkJCXBhZ2luZ19yZW1vdmVfcmVxdWVzdCgmYnRzLT5wYWdpbmcsIHJlcSk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworLyogU3RvcCBwYWdpbmcgb24gYWxsIG90aGVyIGJ0cycgKi8KK3ZvaWQgcGFnaW5nX3JlcXVlc3Rfc3RvcChzdHJ1Y3QgZ3NtX2J0cyAqX2J0cywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQkgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IE5VTEw7CisKKwlpZiAoX2J0cykKKwkJX3BhZ2luZ19yZXF1ZXN0X3N0b3AoX2J0cywgc3Vic2NyLCBsY2hhbik7CisKKwlkbyB7CisJCS8qCisJCSAqIEZJWE1FOiBEb24ndCB1c2UgdGhlIGxhYyBvZiB0aGUgc3Vic2NyaWJlci4uLgorCQkgKiBhcyBpdCBtaWdodCBoYXZlIG1hZ2ljYWxseSBjaGFuZ2VkIHRoZSBsYWMuLiB1c2UgdGhlCisJCSAqIGxvY2F0aW9uIGFyZWEgb2YgdGhlIF9idHMgYXMgcmVjb25maWd1cmF0aW9uIG9mIHRoZQorCQkgKiBuZXR3b3JrIGlzIHByb2JhYmx5IGhhcHBlbmluZyBsZXNzIG9mdGVuLgorCQkgKi8KKwkJYnRzID0gZ3NtX2J0c19ieV9sYWMoc3Vic2NyLT5uZXQsIHN1YnNjci0+bGFjLCBidHMpOworCQlpZiAoIWJ0cykKKwkJCWJyZWFrOworCisJCS8qIFN0b3AgcGFnaW5nICovCisJCWlmIChidHMgIT0gX2J0cykKKwkJCV9wYWdpbmdfcmVxdWVzdF9zdG9wKGJ0cywgc3Vic2NyLCBOVUxMKTsKKwl9IHdoaWxlICgxKTsKK30KKwordm9pZCBwYWdpbmdfdXBkYXRlX2J1ZmZlcl9zcGFjZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDE2X3QgZnJlZV9zbG90cykKK3sKKwlidHMtPnBhZ2luZy5hdmFpbGFibGVfc2xvdHMgPSBmcmVlX3Nsb3RzOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvcmVzdF9vY3RldHMuYyBiL29wZW5ic2Mvc3JjL3Jlc3Rfb2N0ZXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM5ZDJjOAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3Jlc3Rfb2N0ZXRzLmMKQEAgLTAsMCArMSw0MjUgQEAKKy8qIEdTTSBNb2JpbGUgUmFkaW8gSW50ZXJmYWNlIExheWVyIDMgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZSwKKyAqIHJlc3Qgb2N0ZXQgaGFuZGxpbmcgYWNjb3JkaW5nIHRvCisgKiAzR1BQIFRTIDA0LjA4IHZlcnNpb24gNy4yMS4wIFJlbGVhc2UgMTk5OCAvIEVUU0kgVFMgMTAwIDk0MCBWNy4yMS4wICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2JpdHZlYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcmVzdF9vY3RldHMuaD4KKworLyogZ2VuZXJhdGUgU0kxIHJlc3Qgb2N0ZXRzICovCitpbnQgcmVzdF9vY3RldHNfc2kxKHVfaW50OF90ICpkYXRhLCB1X2ludDhfdCAqbmNoX3BvcykKK3sKKwlzdHJ1Y3QgYml0dmVjIGJ2OworCisJbWVtc2V0KCZidiwgMCwgc2l6ZW9mKGJ2KSk7CisJYnYuZGF0YSA9IGRhdGE7CisJYnYuZGF0YV9sZW4gPSAxOworCisJaWYgKG5jaF9wb3MpIHsKKwkJYml0dmVjX3NldF9iaXQoJmJ2LCBIKTsKKwkJYml0dmVjX3NldF91aW50KCZidiwgKm5jaF9wb3MsIDUpOworCX0gZWxzZQorCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEwpOworCisJYml0dmVjX3NwYXJlX3BhZGRpbmcoJmJ2LCA3KTsKKwlyZXR1cm4gYnYuZGF0YV9sZW47Cit9CisKKy8qIEFwcGVuZCBzZWxlY3Rpb24gcGFyYW1ldGVycyB0byBiaXR2ZWMgKi8KK3N0YXRpYyB2b2lkIGFwcGVuZF9zZWxlY3Rpb25fcGFyYW1zKHN0cnVjdCBiaXR2ZWMgKmJ2LAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgZ3NtNDhfc2lfc2VsZWN0aW9uX3BhcmFtcyAqc3ApCit7CisJaWYgKHNwLT5wcmVzZW50KSB7CisJCWJpdHZlY19zZXRfYml0KGJ2LCBIKTsKKwkJYml0dmVjX3NldF9iaXQoYnYsIHNwLT5jYnEpOworCQliaXR2ZWNfc2V0X3VpbnQoYnYsIHNwLT5jZWxsX3Jlc2VsX29mZiwgNik7CisJCWJpdHZlY19zZXRfdWludChidiwgc3AtPnRlbXBfb2ZmcywgMyk7CisJCWJpdHZlY19zZXRfdWludChidiwgc3AtPnBlbmFsdHlfdGltZSwgNSk7CisJfSBlbHNlCisJCWJpdHZlY19zZXRfYml0KGJ2LCBMKTsKK30KKworLyogQXBwZW5kIHBvd2VyIG9mZnNldCB0byBiaXR2ZWMgKi8KK3N0YXRpYyB2b2lkIGFwcGVuZF9wb3dlcl9vZmZzZXQoc3RydWN0IGJpdHZlYyAqYnYsCisJCQkJY29uc3Qgc3RydWN0IGdzbTQ4X3NpX3Bvd2VyX29mZnNldCAqcG8pCit7CisJaWYgKHBvLT5wcmVzZW50KSB7CisJCWJpdHZlY19zZXRfYml0KGJ2LCBIKTsKKwkJYml0dmVjX3NldF91aW50KGJ2LCBwby0+cG93ZXJfb2Zmc2V0LCAyKTsKKwl9IGVsc2UKKwkJYml0dmVjX3NldF9iaXQoYnYsIEwpOworfQorCisvKiBBcHBlbmQgR1BSUyBpbmRpY2F0b3IgdG8gYml0dmVjICovCitzdGF0aWMgdm9pZCBhcHBlbmRfZ3Byc19pbmQoc3RydWN0IGJpdHZlYyAqYnYsCisJCQkgICAgY29uc3Qgc3RydWN0IGdzbTQ4X3NpM19ncHJzX2luZCAqZ2kpCit7CisJaWYgKGdpLT5wcmVzZW50KSB7CisJCWJpdHZlY19zZXRfYml0KGJ2LCBIKTsKKwkJYml0dmVjX3NldF91aW50KGJ2LCBnaS0+cmFfY29sb3VyLCAzKTsKKwkJLyogMCA9PSBTSTEzIGluIEJDQ0ggTm9ybSwgMSA9PSBTSTEzIHNlbnQgb24gQkNDSCBFeHQgKi8KKwkJYml0dmVjX3NldF9iaXQoYnYsIGdpLT5zaTEzX3Bvc2l0aW9uKTsKKwl9IGVsc2UKKwkJYml0dmVjX3NldF9iaXQoYnYsIEwpOworfQorCisKKy8qIEdlbmVyYXRlIFNJMyBSZXN0IE9jdGVzdHMgKENoYXB0ZXIgMTAuNS4yLjM0IC8gVGFibGUgMTAuNC43MikgKi8KK2ludCByZXN0X29jdGV0c19zaTModV9pbnQ4X3QgKmRhdGEsIGNvbnN0IHN0cnVjdCBnc200OF9zaV9yb19pbmZvICpzaTMpCit7CisJc3RydWN0IGJpdHZlYyBidjsKKworCW1lbXNldCgmYnYsIDAsIHNpemVvZihidikpOworCWJ2LmRhdGEgPSBkYXRhOworCWJ2LmRhdGFfbGVuID0gNDsKKworCS8qIE9wdGlvbmFsIFNlbGVjdGlvbiBQYXJhbWV0ZXJzICovCisJYXBwZW5kX3NlbGVjdGlvbl9wYXJhbXMoJmJ2LCAmc2kzLT5zZWxlY3Rpb25fcGFyYW1zKTsKKworCS8qIE9wdGlvbmFsIFBvd2VyIE9mZnNldCAqLworCWFwcGVuZF9wb3dlcl9vZmZzZXQoJmJ2LCAmc2kzLT5wb3dlcl9vZmZzZXQpOworCisJLyogRG8gd2UgaGF2ZSBhIFNJMnRlciBvbiB0aGUgQkNDSD8gKi8KKwlpZiAoc2kzLT5zaTJ0ZXJfaW5kaWNhdG9yKQorCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEgpOworCWVsc2UKKwkJYml0dmVjX3NldF9iaXQoJmJ2LCBMKTsKKworCS8qIEVhcmx5IENsYXNzbWFyayBTZW5kaW5nIENvbnRyb2wgKi8KKwlpZiAoc2kzLT5lYXJseV9jbV9jdHJsKQorCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEgpOworCWVsc2UKKwkJYml0dmVjX3NldF9iaXQoJmJ2LCBMKTsKKworCS8qIERvIHdlIGhhdmUgYSBTSSBUeXBlIDkgb24gdGhlIEJDQ0g/ICovCisJaWYgKHNpMy0+c2NoZWR1bGluZy5wcmVzZW50KSB7CisJCWJpdHZlY19zZXRfYml0KCZidiwgSCk7CisJCWJpdHZlY19zZXRfdWludCgmYnYsIHNpMy0+c2NoZWR1bGluZy53aGVyZSwgMyk7CisJfSBlbHNlCisJCWJpdHZlY19zZXRfYml0KCZidiwgTCk7CisKKwkvKiBHUFJTIEluZGljYXRvciAqLworCWFwcGVuZF9ncHJzX2luZCgmYnYsICZzaTMtPmdwcnNfaW5kKTsKKworCWJpdHZlY19zcGFyZV9wYWRkaW5nKCZidiwgKGJ2LmRhdGFfbGVuKjgpLTEpOworCXJldHVybiBidi5kYXRhX2xlbjsKK30KKworc3RhdGljIGludCBhcHBlbmRfbHNhX3BhcmFtcyhzdHJ1Y3QgYml0dmVjICpidiwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGdzbTQ4X2xzYV9wYXJhbXMgKmxzYV9wYXJhbXMpCit7CisJLyogRklYTUUgKi8KKwlyZXR1cm4gLTE7Cit9CisKKy8qIEdlbmVyYXRlIFNJNCBSZXN0IE9jdGV0cyAoQ2hhcHRlciAxMC41LjIuMzUpICovCitpbnQgcmVzdF9vY3RldHNfc2k0KHVfaW50OF90ICpkYXRhLCBjb25zdCBzdHJ1Y3QgZ3NtNDhfc2lfcm9faW5mbyAqc2k0KQoreworCXN0cnVjdCBiaXR2ZWMgYnY7CisKKwltZW1zZXQoJmJ2LCAwLCBzaXplb2YoYnYpKTsKKwlidi5kYXRhID0gZGF0YTsKKwlidi5kYXRhX2xlbiA9IDEwOyAvKiBGSVhNRTogdXAgdG8gPyAqLworCisJLyogU0k0IFJlc3QgT2N0ZXRzIE8gKi8KKwlhcHBlbmRfc2VsZWN0aW9uX3BhcmFtcygmYnYsICZzaTQtPnNlbGVjdGlvbl9wYXJhbXMpOworCWFwcGVuZF9wb3dlcl9vZmZzZXQoJmJ2LCAmc2k0LT5wb3dlcl9vZmZzZXQpOworCWFwcGVuZF9ncHJzX2luZCgmYnYsICZzaTQtPmdwcnNfaW5kKTsKKworCWlmICgwIC8qIEZJWE1FICovKSB7CisJCS8qIEggYW5kIFNJNCBSZXN0IE9jdGV0cyBTICovCisJCWJpdHZlY19zZXRfYml0KCZidiwgSCk7CisKKwkJLyogTFNBIFBhcmFtZXRlcnMgKi8KKwkJaWYgKHNpNC0+bHNhX3BhcmFtcy5wcmVzZW50KSB7CisJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEgpOworCQkJYXBwZW5kX2xzYV9wYXJhbXMoJmJ2LCAmc2k0LT5sc2FfcGFyYW1zKTsKKwkJfSBlbHNlCisJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEwpOworCisJCS8qIENlbGwgSWRlbnRpdHkgKi8KKwkJaWYgKDEpIHsKKwkJCWJpdHZlY19zZXRfYml0KCZidiwgSCk7CisJCQliaXR2ZWNfc2V0X3VpbnQoJmJ2LCBzaTQtPmNlbGxfaWQsIDE2KTsKKwkJfSBlbHNlCisJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEwpOworCisJCS8qIExTQSBJRCBJbmZvcm1hdGlvbiAqLworCQlpZiAoMCkgeworCQkJYml0dmVjX3NldF9iaXQoJmJ2LCBIKTsKKwkJCS8qIEZJWE1FICovCisJCX0gZWxzZQorCQkJYml0dmVjX3NldF9iaXQoJmJ2LCBMKTsKKwl9IGVsc2UgeworCQkvKiBMIGFuZCBicmVhayBpbmRpY2F0b3IgKi8KKwkJYml0dmVjX3NldF9iaXQoJmJ2LCBMKTsKKwkJYml0dmVjX3NldF9iaXQoJmJ2LCBzaTQtPmJyZWFrX2luZCA/IEggOiBMKTsKKwl9CisKKwlyZXR1cm4gYnYuZGF0YV9sZW47Cit9CisKKy8qIEdQUlMgTW9iaWxlIEFsbG9jYXRpb24gYXMgcGVyIFRTIDA0LjYwIENoYXB0ZXIgMTIuMTBhOgorICAgPCBHUFJTIE1vYmlsZSBBbGxvY2F0aW9uIElFID4gOjo9CisgICAgIDwgSFNOIDogYml0ICg2KSA+CisgICAgIHsgMCB8IDEgPCBSRkwgbnVtYmVyIGxpc3QgOiA8IFJGTCBudW1iZXIgbGlzdCBzdHJ1Y3QgPiA+IH0KKyAgICAgeyAwIDwgTUFfTEVOR1RIIDogYml0ICg2KSA+CisgICAgICAgICA8IE1BX0JJVE1BUDogYml0ICh2YWwoTUFfTEVOR1RIKSArIDEpID4KKyAgICAgfCAxIHsgMCB8IDEgPEFSRkNOIGluZGV4IGxpc3QgOiA8IEFSRkNOIGluZGV4IGxpc3Qgc3RydWN0ID4gPiB9IH0gOworCisgICAgIDwgUkZMIG51bWJlciBsaXN0IHN0cnVjdCA+IDo6ID0KKyAgICAgICA8IFJGTF9OVU1CRVIgOiBiaXQgKDQpID4KKyAgICAgICB7IDAgfCAxIDwgUkZMIG51bWJlciBsaXN0IHN0cnVjdCA+IH0gOworICAgICA8IEFSRkNOIGluZGV4IGxpc3Qgc3RydWN0ID4gOjo9CisgICAgICAgPCBBUkZDTl9JTkRFWCA6IGJpdCg2KSA+CisgICAgICAgeyAwIHwgMSA8IEFSRkNOIGluZGV4IGxpc3Qgc3RydWN0ID4gfSA7CisgKi8KK3N0YXRpYyBpbnQgYXBwZW5kX2dwcnNfbW9iaWxlX2FsbG9jKHN0cnVjdCBiaXR2ZWMgKmJ2KQoreworCS8qIEhvcHBpbmcgU2VxdWVuY2UgTnVtYmVyICovCisJYml0dmVjX3NldF91aW50KGJ2LCAwLCA2KTsKKworCWlmICgwKSB7CisJCS8qIFdlIHdhbnQgdG8gdXNlIGEgUkZMIG51bWJlciBsaXN0ICovCisJCWJpdHZlY19zZXRfYml0KGJ2LCAxKTsKKwkJLyogRklYTUU6IFJGTCBudW1iZXIgbGlzdCAqLworCX0gZWxzZQorCQliaXR2ZWNfc2V0X2JpdChidiwgMCk7CisKKwlpZiAoMCkgeworCQkvKiBXZSB3YW50IHRvIHVzZSBhIE1BX0JJVE1BUCAqLworCQliaXR2ZWNfc2V0X2JpdChidiwgMCk7CisJCS8qIEZJWE1FOiBNQV9MRU5HVEgsIE1BX0JJVE1BUCwgLi4uICovCisJfSBlbHNlIHsKKwkJYml0dmVjX3NldF9iaXQoYnYsIDEpOworCQlpZiAoMCkgeworCQkJLyogV2Ugd2FudCB0byBwcm92aWRlIGFuIEFSRkNOIGluZGV4IGxpc3QgKi8KKwkJCWJpdHZlY19zZXRfYml0KGJ2LCAxKTsKKwkJCS8qIEZJWE1FICovCisJCX0gZWxzZQorCQkJYml0dmVjX3NldF9iaXQoYnYsIDApOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmNvZGVfdDMxOTIodW5zaWduZWQgaW50IHQzMTkyKQoreworCWlmICh0MzE5MiA9PSAwKQorCQlyZXR1cm4gMzsKKwllbHNlIGlmICh0MzE5MiA8PSA4MCkKKwkJcmV0dXJuIDQ7CisJZWxzZSBpZiAodDMxOTIgPD0gMTIwKQorCQlyZXR1cm4gNTsKKwllbHNlIGlmICh0MzE5MiA8PSAxNjApCisJCXJldHVybiA2OworCWVsc2UgaWYgKHQzMTkyIDw9IDIwMCkKKwkJcmV0dXJuIDc7CisJZWxzZSBpZiAodDMxOTIgPD0gNTAwKQorCQlyZXR1cm4gMDsKKwllbHNlIGlmICh0MzE5MiA8PSAxMDAwKQorCQlyZXR1cm4gMTsKKwllbHNlIGlmICh0MzE5MiA8PSAxNTAwKQorCQlyZXR1cm4gMjsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGVuY29kZV9kcnhfdGltZXIodW5zaWduZWQgaW50IGRyeCkKK3sKKwlpZiAoZHJ4ID09IDApCisJCXJldHVybiAwOworCWVsc2UgaWYgKGRyeCA9PSAxKQorCQlyZXR1cm4gMTsKKwllbHNlIGlmIChkcnggPT0gMikKKwkJcmV0dXJuIDI7CisJZWxzZSBpZiAoZHJ4IDw9IDQpCisJCXJldHVybiAzOworCWVsc2UgaWYgKGRyeCA8PSA4KQorCQlyZXR1cm4gNDsKKwllbHNlIGlmIChkcnggPD0gMTYpCisJCXJldHVybiA1OworCWVsc2UgaWYgKGRyeCA8PSAzMikKKwkJcmV0dXJuIDY7CisJZWxzZSBpZiAoZHJ4IDw9IDY0KQorCQlyZXR1cm4gNzsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworfQorCisvKiBHUFJTIENlbGwgT3B0aW9ucyBhcyBwZXIgVFMgMDQuNjAgQ2hhcHRlciAxMi4yNAorCTwgR1BSUyBDZWxsIE9wdGlvbnMgSUUgPiA6Oj0KKwkJPCBOTU8gOiBiaXQoMikgPgorCQk8IFQzMTY4IDogYml0KDMpID4KKwkJPCBUMzE5MiA6IGJpdCgzKSA+CisJCTwgRFJYX1RJTUVSX01BWDogYml0KDMpID4KKwkJPCBBQ0NFU1NfQlVSU1RfVFlQRTogYml0ID4KKwkJPCBDT05UUk9MX0FDS19UWVBFIDogYml0ID4KKwkJPCBCU19DVl9NQVg6IGJpdCg0KSA+CisJCXsgMCB8IDEgPCBQQU5fREVDIDogYml0KDMpID4KKwkJCTwgUEFOX0lOQyA6IGJpdCgzKSA+CisJCQk8IFBBTl9NQVggOiBiaXQoMykgPgorCQl7IDAgfCAxIDwgRXh0ZW5zaW9uIExlbmd0aCA6IGJpdCg2KSA+CisJCQk8IGJpdCAodmFsKEV4dGVuc2lvbiBMZW5ndGgpICsgMQorCQkJJiB7IDwgRXh0ZW5zaW9uIEluZm9ybWF0aW9uID4gISB7IGJpdCAqKiA9IDxubyBzdHJpbmc+IH0gfSA7CisJPCBFeHRlbnNpb24gSW5mb3JtYXRpb24gPiA6Oj0KKwkJeyAwIHwgMSA8IEVHUFJTX1BBQ0tFVF9DSEFOTkVMX1JFUVVFU1QgOiBiaXQgPgorCQkJPCBCRVBfUEVSSU9EIDogYml0KDQpID4gfQorCQk8IFBGQ19GRUFUVVJFX01PREUgOiBiaXQgPgorCQk8IERUTV9TVVBQT1JUIDogYml0ID4KKwkJPEJTU19QQUdJTkdfQ09PUkRJTkFUSU9OOiBiaXQgPgorCQk8c3BhcmUgYml0ID4gKiogOworICovCitzdGF0aWMgaW50IGFwcGVuZF9ncHJzX2NlbGxfb3B0KHN0cnVjdCBiaXR2ZWMgKmJ2LAorCQkJCWNvbnN0IHN0cnVjdCBncHJzX2NlbGxfb3B0aW9ucyAqZ2NvKQoreworCWludCB0MzE5MiwgZHJ4X3RpbWVyX21heDsKKworCXQzMTkyID0gZW5jb2RlX3QzMTkyKGdjby0+dDMxOTIpOworCWlmICh0MzE5MiA8IDApCisJCXJldHVybiB0MzE5MjsKKworCWRyeF90aW1lcl9tYXggPSBlbmNvZGVfZHJ4X3RpbWVyKGdjby0+ZHJ4X3RpbWVyX21heCk7CisJaWYgKGRyeF90aW1lcl9tYXggPCAwKQorCQlyZXR1cm4gZHJ4X3RpbWVyX21heDsKKworCWJpdHZlY19zZXRfdWludChidiwgZ2NvLT5ubW8sIDIpOworCWJpdHZlY19zZXRfdWludChidiwgZ2NvLT50MzE2OCAvIDUwMCwgMyk7CisJYml0dmVjX3NldF91aW50KGJ2LCB0MzE5MiwgMyk7CisJYml0dmVjX3NldF91aW50KGJ2LCBkcnhfdGltZXJfbWF4LCAzKTsKKwkvKiBBQ0NFU1NfQlVSU1RfVFlQRTogSGFyZC1jb2RlIDhiaXQgKi8KKwliaXR2ZWNfc2V0X2JpdChidiwgMCk7CisJLyogQ09OVFJPTF9BQ0tfVFlQRTogSGFyZC1jb2RlIHRvIFJMQy9NQUMgY29udHJvbCBibG9jayAqLworCWJpdHZlY19zZXRfYml0KGJ2LCAxKTsKKwliaXR2ZWNfc2V0X3VpbnQoYnYsIGdjby0+YnNfY3ZfbWF4LCA0KTsKKworCS8qIGhhcmQtY29kZSBubyBQQU5fe0RFQyxJTkMsTUFYfSAqLworCWJpdHZlY19zZXRfYml0KGJ2LCAwKTsKKworCWlmICghZ2NvLT5leHRfaW5mb19wcmVzZW50KSB7CisJCS8qIG5vIGV4dGVuc2lvbiBpbmZvcm1hdGlvbiAqLworCQliaXR2ZWNfc2V0X2JpdChidiwgMCk7CisJfSBlbHNlIHsKKwkJLyogZXh0ZW5zaW9uIGluZm9ybWF0aW9uICovCisJCWJpdHZlY19zZXRfYml0KGJ2LCAxKTsKKwkJaWYgKCFnY28tPmV4dF9pbmZvLmVncHJzX3N1cHBvcnRlZCkgeworCQkJLyogNmJpdCBsZW5ndGggb2YgZXh0ZW5zaW9uICovCisJCQliaXR2ZWNfc2V0X3VpbnQoYnYsICgxICsgMyktMSwgNik7CisJCQkvKiBFR1BSUyBzdXBwb3J0ZWQgaW4gdGhlIGNlbGwgKi8KKwkJCWJpdHZlY19zZXRfYml0KGJ2LCAwKTsKKwkJfSBlbHNlIHsKKwkJCS8qIDZiaXQgbGVuZ3RoIG9mIGV4dGVuc2lvbiAqLworCQkJYml0dmVjX3NldF91aW50KGJ2LCAoMSArIDUgKyAzKS0xLCA2KTsKKwkJCS8qIEVHUFJTIHN1cHBvcnRlZCBpbiB0aGUgY2VsbCAqLworCQkJYml0dmVjX3NldF9iaXQoYnYsIDEpOworCQkJLyogMWJpdCBFR1BSUyBQQUNLRVQgQ0hBTk5FTCBSRVFVRVNUICovCisJCQliaXR2ZWNfc2V0X2JpdChidiwgZ2NvLT5leHRfaW5mby51c2VfZWdwcnNfcF9jaF9yZXEpOworCQkJLyogNGJpdCBCRVAgUEVSSU9EICovCisJCQliaXR2ZWNfc2V0X3VpbnQoYnYsIGdjby0+ZXh0X2luZm8uYmVwX3BlcmlvZCwgNCk7CisJCX0KKwkJYml0dmVjX3NldF9iaXQoYnYsIGdjby0+ZXh0X2luZm8ucGZjX3N1cHBvcnRlZCk7CisJCWJpdHZlY19zZXRfYml0KGJ2LCBnY28tPmV4dF9pbmZvLmR0bV9zdXBwb3J0ZWQpOworCQliaXR2ZWNfc2V0X2JpdChidiwgZ2NvLT5leHRfaW5mby5ic3NfcGFnaW5nX2Nvb3JkaW5hdGlvbik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFwcGVuZF9ncHJzX3B3cl9jdHJsX3BhcnMoc3RydWN0IGJpdHZlYyAqYnYsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IGdwcnNfcG93ZXJfY3RybF9wYXJzICpwY3ApCit7CisJYml0dmVjX3NldF91aW50KGJ2LCBwY3AtPmFscGhhLCA0KTsKKwliaXR2ZWNfc2V0X3VpbnQoYnYsIHBjcC0+dF9hdmdfdywgNSk7CisJYml0dmVjX3NldF91aW50KGJ2LCBwY3AtPnRfYXZnX3QsIDUpOworCWJpdHZlY19zZXRfdWludChidiwgcGNwLT5wY19tZWFzX2NoYW4sIDEpOworCWJpdHZlY19zZXRfdWludChidiwgcGNwLT5uX2F2Z19pLCA0KTsKK30KKworLyogR2VuZXJhdGUgU0kxMyBSZXN0IE9jdGVzdHMgKDA0LjA4IENoYXB0ZXIgMTAuNS4yLjM3YikgKi8KK2ludCByZXN0X29jdGV0c19zaTEzKHVfaW50OF90ICpkYXRhLCBjb25zdCBzdHJ1Y3QgZ3NtNDhfc2kxM19pbmZvICpzaTEzKQoreworCXN0cnVjdCBiaXR2ZWMgYnY7CisKKwltZW1zZXQoJmJ2LCAwLCBzaXplb2YoYnYpKTsKKwlidi5kYXRhID0gZGF0YTsKKwlidi5kYXRhX2xlbiA9IDIwOworCisJaWYgKDApIHsKKwkJLyogTm8gcmVzdCBvY3RldHMgKi8KKwkJYml0dmVjX3NldF9iaXQoJmJ2LCBMKTsKKwl9IGVsc2UgeworCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEgpOworCQliaXR2ZWNfc2V0X3VpbnQoJmJ2LCBzaTEzLT5iY2NoX2NoYW5nZV9tYXJrLCAzKTsKKwkJYml0dmVjX3NldF91aW50KCZidiwgc2kxMy0+c2lfY2hhbmdlX2ZpZWxkLCA0KTsKKwkJaWYgKDEpIHsKKwkJCWJpdHZlY19zZXRfYml0KCZidiwgMCk7CisJCX0gZWxzZSB7CisJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIDEpOworCQkJYml0dmVjX3NldF91aW50KCZidiwgc2kxMy0+YmNjaF9jaGFuZ2VfbWFyaywgMik7CisJCQlhcHBlbmRfZ3Byc19tb2JpbGVfYWxsb2MoJmJ2KTsKKwkJfQorCQlpZiAoIXNpMTMtPnBiY2NoX3ByZXNlbnQpIHsKKwkJCS8qIFBCQ0NIIG5vdCBwcmVzZW50IGluIGNlbGwgKi8KKwkJCWJpdHZlY19zZXRfYml0KCZidiwgMCk7CisJCQliaXR2ZWNfc2V0X3VpbnQoJmJ2LCBzaTEzLT5ub19wYmNjaC5yYWMsIDgpOworCQkJYml0dmVjX3NldF9iaXQoJmJ2LCBzaTEzLT5ub19wYmNjaC5zcGdjX2NjY2hfc3VwKTsKKwkJCWJpdHZlY19zZXRfdWludCgmYnYsIHNpMTMtPm5vX3BiY2NoLnByaW9fYWNjX3RociwgMyk7CisJCQliaXR2ZWNfc2V0X3VpbnQoJmJ2LCBzaTEzLT5ub19wYmNjaC5uZXRfY3RybF9vcmQsIDIpOworCQkJYXBwZW5kX2dwcnNfY2VsbF9vcHQoJmJ2LCAmc2kxMy0+Y2VsbF9vcHRzKTsKKwkJCWFwcGVuZF9ncHJzX3B3cl9jdHJsX3BhcnMoJmJ2LCAmc2kxMy0+cHdyX2N0cmxfcGFycyk7CisJCX0gZWxzZSB7CisJCQkvKiBQQkNDSCBwcmVzZW50IGluIGNlbGwgKi8KKwkJCWJpdHZlY19zZXRfYml0KCZidiwgMSk7CisJCQliaXR2ZWNfc2V0X3VpbnQoJmJ2LCBzaTEzLT5wYmNjaC5wc2kxX3JlcF9wZXIsIDQpOworCQkJLyogUEJDQ0ggRGVzY3JpcGl0b24gKi8KKwkJCWJpdHZlY19zZXRfdWludCgmYnYsIHNpMTMtPnBiY2NoLnBiLCA0KTsKKwkJCWJpdHZlY19zZXRfdWludCgmYnYsIHNpMTMtPnBiY2NoLnRzYywgMyk7CisJCQliaXR2ZWNfc2V0X3VpbnQoJmJ2LCBzaTEzLT5wYmNjaC50biwgMyk7CisJCQlzd2l0Y2ggKHNpMTMtPnBiY2NoLmNhcnJpZXJfdHlwZSkgeworCQkJY2FzZSBQQkNDSF9CQ0NIOgorCQkJCWJpdHZlY19zZXRfYml0KCZidiwgMCk7CisJCQkJYml0dmVjX3NldF9iaXQoJmJ2LCAwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUEJDQ0hfQVJGQ046CisJCQkJYml0dmVjX3NldF9iaXQoJmJ2LCAwKTsKKwkJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIDEpOworCQkJCWJpdHZlY19zZXRfdWludCgmYnYsIHNpMTMtPnBiY2NoLmFyZmNuLCAxMCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFBCQ0NIX01BSU86CisJCQkJYml0dmVjX3NldF9iaXQoJmJ2LCAxKTsKKwkJCQliaXR2ZWNfc2V0X3VpbnQoJmJ2LCBzaTEzLT5wYmNjaC5tYWlvLCA2KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkvKiAzR1BQIFRTIDQ0LjAxOCBSZWxlYXNlIDYgLyAxMC41LjIuMzdiICovCisJCWJpdHZlY19zZXRfYml0KCZidiwgSCk7CS8qIGFkZGVkIFJlbGVhc2UgOTkgKi8KKwkJLyogY2xhaW0gb3VyIFNHU04gaXMgY29tcGF0aWJsZSB3aXRoIFJlbGVhc2UgOTksIGFzIEVER0UgYW5kIEVHUFJTCisJCSAqIHdhcyBvbmx5IGFkZGVkIGluIHRoaXMgUmVsZWFzZSAqLworCQliaXR2ZWNfc2V0X2JpdCgmYnYsIDEpOworCX0KKwliaXR2ZWNfc3BhcmVfcGFkZGluZygmYnYsIChidi5kYXRhX2xlbio4KS0xKTsKKwlyZXR1cm4gYnYuZGF0YV9sZW47Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ycmxwLmMgYi9vcGVuYnNjL3NyYy9ycmxwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwNDQ1MQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3JybHAuYwpAQCAtMCwwICsxLDEwNiBAQAorLyogUmFkaW8gUmVzb3VyY2UgTENTIChMb2NhdGlvbikgUHJvdG9jb2wsIEdNUyBUUyAwNC4zMSAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jaGFuX2FsbG9jLmg+CisKKy8qIFJSTFAgbXNQb3NpdGlvblJlcSwgbnNCYXNlZCwKKyAqCUFjY3VyYWN5PTYwLCBNZXRob2Q9Z3BzLCBSZXNwb25zZVRpbWU9Miwgb25lU2V0ICovCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgbXNfYmFzZWRfcG9zX3JlcVtdID0geyAweDQwLCAweDAxLCAweDc4LCAweGE4IH07CisKKy8qIFJSTFAgbXNQb3NpdGlvblJlcSwgbXNCYXNlZFByZWYsCisJQWNjdXJhY3k9NjAsIE1ldGhvZD1ncHNPckVPVEQsIFJlc3BvbnNlVGltZT01LCBtdWx0aXBsZVNldHMgKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBtc19wcmVmX3Bvc19yZXFbXSAgPSB7IDB4NDAsIDB4MDIsIDB4NzksIDB4NTAgfTsKKworLyogUlJMUCBtc1Bvc2l0aW9uUmVxLCBtc0Fzc2lzdGVkUHJlZiwKKwlBY2N1cmFjeT02MCwgTWV0aG9kPWdwc09yRU9URCwgUmVzcG9uc2VUaW1lPTUsIG11bHRpcGxlU2V0cyAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IGFzc19wcmVmX3Bvc19yZXFbXSA9IHsgMHg0MCwgMHgwMywgMHg3OSwgMHg1MCB9OworCitzdGF0aWMgaW50IHNlbmRfcnJscF9yZXEoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBsY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrOworCWNvbnN0IHVfaW50OF90ICpyZXE7CisKKwlzd2l0Y2ggKG5ldC0+cnJscC5tb2RlKSB7CisJY2FzZSBSUkxQX01PREVfTVNfQkFTRUQ6CisJCXJlcSA9IG1zX2Jhc2VkX3Bvc19yZXE7CisJCWJyZWFrOworCWNhc2UgUlJMUF9NT0RFX01TX1BSRUY6CisJCXJlcSA9IG1zX3ByZWZfcG9zX3JlcTsKKwkJYnJlYWs7CisJY2FzZSBSUkxQX01PREVfQVNTX1BSRUY6CisJCXJlcSA9IGFzc19wcmVmX3Bvc19yZXE7CisJCWJyZWFrOworCWNhc2UgUlJMUF9NT0RFX05PTkU6CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIGdzbTQ4X3NlbmRfcnJfYXBwX2luZm8obGNoYW4sIDB4MDAsCisJCQkJICAgICAgc2l6ZW9mKG1zX2Jhc2VkX3Bvc19yZXEpLCByZXEpOworfQorCitzdGF0aWMgaW50IHN1YnNjcl9zaWdfY2IodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJCSB2b2lkICpoYW5kbGVyX2RhdGEsIHZvaWQgKnNpZ25hbF9kYXRhKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCisJc3dpdGNoIChzaWduYWwpIHsKKwljYXNlIFNfU1VCU0NSX0FUVEFDSEVEOgorCQkvKiBBIHN1YnNjcmliZXIgaGFzIGF0dGFjaGVkLiAqLworCQlzdWJzY3IgPSBzaWduYWxfZGF0YTsKKwkJbGNoYW4gPSBsY2hhbl9mb3Jfc3Vic2NyKHN1YnNjcik7CisJCWlmICghbGNoYW4pCisJCQlicmVhazsKKwkJc2VuZF9ycmxwX3JlcShsY2hhbik7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYWdpbmdfc2lnX2NiKHVuc2lnbmVkIGludCBzdWJzeXMsIHVuc2lnbmVkIGludCBzaWduYWwsCisJCQkgdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSkKK3sKKwlzdHJ1Y3QgcGFnaW5nX3NpZ25hbF9kYXRhICpwc2lnX2RhdGEgPSBzaWduYWxfZGF0YTsKKworCXN3aXRjaCAoc2lnbmFsKSB7CisJY2FzZSBTX1BBR0lOR19TVUNDRUVERUQ6CisJCS8qIEEgc3Vic2NyaWJlciBoYXMgYXR0YWNoZWQuICovCisJCXNlbmRfcnJscF9yZXEocHNpZ19kYXRhLT5sY2hhbik7CisJCWJyZWFrOworCWNhc2UgU19QQUdJTkdfRVhQSVJFRDoKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCit2b2lkIG9uX2Rzb19sb2FkX3JybHAodm9pZCkKK3sKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19TVUJTQ1IsIHN1YnNjcl9zaWdfY2IsIE5VTEwpOworCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX1BBR0lORywgcGFnaW5nX3NpZ19jYiwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9yczIzMi5jIGIvb3BlbmJzYy9zcmMvcnMyMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmFkZjU2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvcnMyMzIuYwpAQCAtMCwwICsxLDI0OSBAQAorLyogT3BlbkJTQyBCUy0xMSBULUxpbmsgaW50ZXJmYWNlIHVzaW5nIFBPU0lYIHNlcmlhbCBwb3J0ICovCisKKy8qIChDKSAyMDA4LTIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcnMyMzIuaD4KKworLyogYWRhcHRpb24gbGF5ZXIgZnJvbSBHU00gMDguNTkgKyAxMi4yMSB0byBSUzIzMiAqLworCitzdHJ1Y3Qgc2VyaWFsX2hhbmRsZSB7CisJc3RydWN0IGJzY19mZCBmZDsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCB0eF9xdWV1ZTsKKworCXN0cnVjdCBtc2diICpyeF9tc2c7CisJdW5zaWduZWQgaW50IHJ4bXNnX2J5dGVzX21pc3Npbmc7CisKKwl1bnNpZ25lZCBpbnQgZGVsYXlfbXM7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKK307CisKKy8qIEZJWE1FOiB0aGlzIG5lZWRzIHRvIGdvICovCitzdGF0aWMgc3RydWN0IHNlcmlhbF9oYW5kbGUgX3Nlcl9oYW5kbGUsICpzZXJfaGFuZGxlID0gJl9zZXJfaGFuZGxlOworCisjZGVmaW5lIExBUERfSERSX0xFTgkxMAorCitzdGF0aWMgaW50IGhhbmRsZV9zZXJfd3JpdGUoc3RydWN0IGJzY19mZCAqYmZkKTsKKworLyogY2FsbGJhY2sgZnJvbSBhYmlzX25tICovCitpbnQgX2FiaXNfbm1fc2VuZG1zZyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBzZXJpYWxfaGFuZGxlICpzaCA9IHNlcl9oYW5kbGU7CisJdV9pbnQ4X3QgKmxhcGQ7CisJdW5zaWduZWQgaW50IGxlbjsKKworCW1zZy0+bDJoID0gbXNnLT5kYXRhOworCisJLyogcHJlcGVuZCBMQVBEIGhlYWRlciAqLworCWxhcGQgPSBtc2diX3B1c2gobXNnLCBMQVBEX0hEUl9MRU4pOworCisJbGVuID0gbXNnLT5sZW4gLSAyOworCisJbGFwZFswXSA9IChsZW4gPj4gOCkgJiAweGZmOworCWxhcGRbMV0gPSBsZW4gJiAweGZmOyAvKiBsZW5ndGggb2YgYnl0ZXMgc3RhcnRpZ24gYXQgbGFwZFsyXSAqLworCWxhcGRbMl0gPSAweDAwOworCWxhcGRbM10gPSAweDA3OworCWxhcGRbNF0gPSAweDAxOworCWxhcGRbNV0gPSAweDNlOworCWxhcGRbNl0gPSAweDAwOworCWxhcGRbN10gPSAweDAwOworCWxhcGRbOF0gPSBtc2ctPmxlbiAtIDEwOyAvKiBsZW5ndGggb2YgYnl0ZXMgc3RhcnRpbmcgYXQgbGFwZFsxMF0gKi8KKwlsYXBkWzldID0gbGFwZFs4XSBeIDB4Mzg7CisKKwltc2diX2VucXVldWUoJnNoLT50eF9xdWV1ZSwgbXNnKTsKKwlzaC0+ZmQud2hlbiB8PSBCU0NfRkRfV1JJVEU7CisKKwkvKiB3ZSB0cnkgdG8gaW1tZWRpYXRlbHkgc2VuZCAqLworCWhhbmRsZV9zZXJfd3JpdGUoJnNoLT5mZCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogc2VsZWN0LmMgY2FsbGJhY2sgaW4gY2FzZSB3ZSBjYW4gd3JpdGUgdG8gdGhlIFJTMjMyICovCitzdGF0aWMgaW50IGhhbmRsZV9zZXJfd3JpdGUoc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCBzZXJpYWxfaGFuZGxlICpzaCA9IGJmZC0+ZGF0YTsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCWludCB3cml0dGVuOworCisJbXNnID0gbXNnYl9kZXF1ZXVlKCZzaC0+dHhfcXVldWUpOworCWlmICghbXNnKSB7CisJCWJmZC0+d2hlbiAmPSB+QlNDX0ZEX1dSSVRFOworCQlyZXR1cm4gMDsKKwl9CisKKwlERUJVR1AoRE1JLCAiUlMyMzIgVFg6ICVzXG4iLCBoZXhkdW1wKG1zZy0+ZGF0YSwgbXNnLT5sZW4pKTsKKworCS8qIHNlbmQgb3ZlciBzZXJpYWwgbGluZSAqLworCXdyaXR0ZW4gPSB3cml0ZShiZmQtPmZkLCBtc2ctPmRhdGEsIG1zZy0+bGVuKTsKKwlpZiAod3JpdHRlbiA8IG1zZy0+bGVuKSB7CisJCXBlcnJvcigic2hvcnQgd3JpdGU6Iik7CisJCW1zZ2JfZnJlZShtc2cpOworCQlyZXR1cm4gLTE7CisJfQorCisJbXNnYl9mcmVlKG1zZyk7CisJdXNsZWVwKHNoLT5kZWxheV9tcyoxMDAwKTsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIFNFUklBTF9BTExPQ19TSVpFCTMwMAorCisvKiBzZWxlY3QuYyBjYWxsYmFjayBpbiBjYXNlIHdlIGNhbiByZWFkIGZyb20gdGhlIFJTMjMyICovCitzdGF0aWMgaW50IGhhbmRsZV9zZXJfcmVhZChzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IHNlcmlhbF9oYW5kbGUgKnNoID0gYmZkLT5kYXRhOworCXN0cnVjdCBtc2diICptc2c7CisJaW50IHJjID0gMDsKKworCWlmICghc2gtPnJ4X21zZykgeworCQlzaC0+cnhfbXNnID0gbXNnYl9hbGxvYyhTRVJJQUxfQUxMT0NfU0laRSwgIlJTMjMyIFJ4Iik7CisJCXNoLT5yeF9tc2ctPmwyaCA9IE5VTEw7CisJCXNoLT5yeF9tc2ctPnRyeCA9IHNoLT5idHMtPmMwOworCX0KKwltc2cgPSBzaC0+cnhfbXNnOworCisJLyogZmlyc3QgcmVhZCB0d28gYnllcyB0byBvYnRhaW4gbGVuZ3RoICovCisJaWYgKG1zZy0+bGVuIDwgMikgeworCQlyYyA9IHJlYWQoc2gtPmZkLmZkLCBtc2ctPnRhaWwsIDIgLSBtc2ctPmxlbik7CisJCWlmIChyYyA8IDApIHsKKwkJCXBlcnJvcigiRVJST1IgcmVhZGluZyBmcm9tIHNlcmlhbCBwb3J0Iik7CisJCQltc2diX2ZyZWUobXNnKTsKKwkJCXJldHVybiByYzsKKwkJfQorCQltc2diX3B1dChtc2csIHJjKTsKKworCQlpZiAobXNnLT5sZW4gPj0gMikgeworCQkJLyogcGFyc2UgTEFQRCBwYXlsb2FkIGxlbmd0aCAqLworCQkJaWYgKG1zZy0+ZGF0YVswXSAhPSAwKQorCQkJCWZwcmludGYoc3RkZXJyLCAiU3VzcGljaW91cyBoZWFkZXIgYnl0ZSAwOiAweCUwMnhcbiIsCisJCQkJCW1zZy0+ZGF0YVswXSk7CisKKwkJCXNoLT5yeG1zZ19ieXRlc19taXNzaW5nID0gbXNnLT5kYXRhWzBdIDw8IDg7CisJCQlzaC0+cnhtc2dfYnl0ZXNfbWlzc2luZyArPSBtc2ctPmRhdGFbMV07CisKKwkJCWlmIChzaC0+cnhtc2dfYnl0ZXNfbWlzc2luZyA8IExBUERfSERSX0xFTiAtMikKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgbGVuZ3RoIGluIGhkcjogJXVcbiIsCisJCQkJCXNoLT5yeG1zZ19ieXRlc19taXNzaW5nKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIHRyeSB0byByZWFkIGFzIG1hbnkgb2YgdGhlIG1pc3NpbmcgYnl0ZXMgYXMgYXJlIGF2YWlsYWJsZSAqLworCQlyYyA9IHJlYWQoc2gtPmZkLmZkLCBtc2ctPnRhaWwsIHNoLT5yeG1zZ19ieXRlc19taXNzaW5nKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcGVycm9yKCJFUlJPUiByZWFkaW5nIGZyb20gc2VyaWFsIHBvcnQiKTsKKwkJCW1zZ2JfZnJlZShtc2cpOworCQkJcmV0dXJuIHJjOworCQl9CisJCW1zZ2JfcHV0KG1zZywgcmMpOworCQlzaC0+cnhtc2dfYnl0ZXNfbWlzc2luZyAtPSByYzsKKworCQlpZiAoc2gtPnJ4bXNnX2J5dGVzX21pc3NpbmcgPT0gMCkgeworCQkJLyogd2UgaGF2ZSBvbmUgY29tcGxldGUgbWVzc2FnZSBub3cgKi8KKwkJCXNoLT5yeF9tc2cgPSBOVUxMOworCisJCQlpZiAobXNnLT5sZW4gPiBMQVBEX0hEUl9MRU4pCisJCQkJbXNnLT5sMmggPSBtc2ctPmRhdGEgKyBMQVBEX0hEUl9MRU47CisKKwkJCURFQlVHUChETUksICJSUzIzMiBSWDogJXNcbiIsIGhleGR1bXAobXNnLT5kYXRhLCBtc2ctPmxlbikpOworCQkJcmMgPSBoYW5kbGVfc2VyaWFsX21zZyhtc2cpOworCQl9CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKiBzZWxlY3QuYyBjYWxsYmFjayAqLworc3RhdGljIGludCBzZXJpYWxfZmRfY2Ioc3RydWN0IGJzY19mZCAqYmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKHdoYXQgJiBCU0NfRkRfUkVBRCkKKwkJcmMgPSBoYW5kbGVfc2VyX3JlYWQoYmZkKTsKKworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCWlmICh3aGF0ICYgQlNDX0ZEX1dSSVRFKQorCQlyYyA9IGhhbmRsZV9zZXJfd3JpdGUoYmZkKTsKKworCXJldHVybiByYzsKK30KKworaW50IHJzMjMyX3NldHVwKGNvbnN0IGNoYXIgKnNlcmlhbF9wb3J0LCB1bnNpZ25lZCBpbnQgZGVsYXlfbXMsCisJCXN0cnVjdCBnc21fYnRzICpidHMpCit7CisJaW50IHJjLCBzZXJpYWxfZmQ7CisJc3RydWN0IHRlcm1pb3MgdGlvOworCisJc2VyaWFsX2ZkID0gb3BlbihzZXJpYWxfcG9ydCwgT19SRFdSKTsKKwlpZiAoc2VyaWFsX2ZkIDwgMCkgeworCQlwZXJyb3IoImNhbm5vdCBvcGVuIHNlcmlhbCBwb3J0OiIpOworCQlyZXR1cm4gc2VyaWFsX2ZkOworCX0KKworCS8qIHNldCBiYXVkcmF0ZSAqLworCXJjID0gdGNnZXRhdHRyKHNlcmlhbF9mZCwgJnRpbyk7CisJaWYgKHJjIDwgMCkgeworCQlwZXJyb3IoInRjZ2V0YXR0cigpIik7CisJCXJldHVybiByYzsKKwl9CisJY2ZzZXRpc3BlZWQoJnRpbywgQjE5MjAwKTsKKwljZnNldG9zcGVlZCgmdGlvLCBCMTkyMDApOworCXRpby5jX2NmbGFnIHw9ICAoQ1JFQUQgfCBDTE9DQUwgfCBDUzgpOworCXRpby5jX2NmbGFnICY9IH4oUEFSRU5CIHwgQ1NUT1BCIHwgQ1NJWkUgfCBDUlRTQ1RTKTsKKwl0aW8uY19sZmxhZyAmPSB+KElDQU5PTiB8IEVDSE8gfCBFQ0hPRSB8IElTSUcpOworCXRpby5jX2lmbGFnIHw9ICAoSU5QQ0sgfCBJU1RSSVApOworCXRpby5jX2lmbGFnICY9IH4oSVNUUklQIHwgSVhPTiB8IElYT0ZGIHwgSUdOQlJLIHwgSU5MQ1IgfCBJQ1JOTCB8IElHTkNSKTsKKwl0aW8uY19vZmxhZyAmPSB+KE9QT1NUKTsKKwlyYyA9IHRjc2V0YXR0cihzZXJpYWxfZmQsIFRDU0FEUkFJTiwgJnRpbyk7CisJaWYgKHJjIDwgMCkgeworCQlwZXJyb3IoInRjc2V0YXR0cigpIik7CisJCXJldHVybiByYzsKKwl9CisKKwlJTklUX0xMSVNUX0hFQUQoJnNlcl9oYW5kbGUtPnR4X3F1ZXVlKTsKKwlzZXJfaGFuZGxlLT5mZC5mZCA9IHNlcmlhbF9mZDsKKwlzZXJfaGFuZGxlLT5mZC53aGVuID0gQlNDX0ZEX1JFQUQ7CisJc2VyX2hhbmRsZS0+ZmQuY2IgPSBzZXJpYWxfZmRfY2I7CisJc2VyX2hhbmRsZS0+ZmQuZGF0YSA9IHNlcl9oYW5kbGU7CisJc2VyX2hhbmRsZS0+ZGVsYXlfbXMgPSBkZWxheV9tczsKKwlzZXJfaGFuZGxlLT5idHMgPSBidHM7CisJcmMgPSBic2NfcmVnaXN0ZXJfZmQoJnNlcl9oYW5kbGUtPmZkKTsKKwlpZiAocmMgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IHJlZ2lzdGVyIEZEOiAlc1xuIiwKKwkJCXN0cmVycm9yKHJjKSk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3J0cF9wcm94eS5jIGIvb3BlbmJzYy9zcmMvcnRwX3Byb3h5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI0MTczZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3J0cF9wcm94eS5jCkBAIC0wLDAgKzEsNzIxIEBACisvKiBSVFAgcHJveHkgaGFuZGxpbmcgZm9yIGlwLmFjY2VzcyBuYW5vQlRTICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGVuZGlhbi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPiAgICAvKiBnZXR0aW1lb2ZkYXkoKSAqLworI2luY2x1ZGUgPHVuaXN0ZC5oPiAgICAgIC8qIGdldC4uKCkgKi8KKyNpbmNsdWRlIDx0aW1lLmg+ICAgICAgICAvKiBjbG9jaygpICovCisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4gLyogdW5hbWUoKSAqLworCisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ydHBfcHJveHkuaD4KKworc3RhdGljIExMSVNUX0hFQUQocnRwX3NvY2tldHMpOworCisvKiBzaG91bGQgd2UgbWFuZ2xlIHRoZSBDTkFNRSBpbnNpZGUgU0RFUyBvZiBSVENQIHBhY2tldHM/IFdlIGRpc2FibGUKKyAqIHRoaXMgYnkgZGVmYXVsdCwgYXMgaXQgc2VlbXMgdG8gYmUgbm90IG5lZWRlZCAqLworc3RhdGljIGludCBtYW5nbGVfcnRjcF9jbmFtZSA9IDA7CisKK2VudW0gcnRwX2JmZF9wcml2IHsKKwlSVFBfUFJJVl9OT05FLAorCVJUUF9QUklWX1JUUCwKKwlSVFBfUFJJVl9SVENQCit9OworCisjZGVmaW5lIFJUUF9BTExPQ19TSVpFCTE1MDAKKworLyogYWNjb3JkaW5nIHRvIFJGQyAxODg5ICovCitzdHJ1Y3QgcnRjcF9oZHIgeworCXVfaW50OF90IGJ5dGUwOworCXVfaW50OF90IHR5cGU7CisJdV9pbnQxNl90IGxlbmd0aDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNkZWZpbmUgUlRDUF9UWVBFX1NERVMJMjAyCisJCisjZGVmaW5lIFJUQ1BfSUVfQ05BTUUJMQorCisvKiBhY2NvcmRpbmcgdG8gUkZDIDM1NTAgKi8KK3N0cnVjdCBydHBfaGRyIHsKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisJdV9pbnQ4X3QgIGNzcmNfY291bnQ6NCwKKwkJICBleHRlbnNpb246MSwKKwkJICBwYWRkaW5nOjEsCisJCSAgdmVyc2lvbjoyOworCXVfaW50OF90ICBwYXlsb2FkX3R5cGU6NywKKwkJICBtYXJrZXI6MTsKKyNlbGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKwl1X2ludDhfdCAgdmVyc2lvbjoyLAorCQkgIHBhZGRpbmc6MSwKKwkJICBleHRlbnNpb246MSwKKwkJICBjc3JjX2NvdW50OjQ7CisJdV9pbnQ4X3QgIG1hcmtlcjoxLAorCQkgIHBheWxvYWRfdHlwZTo3OworI2VuZGlmCisJdV9pbnQxNl90IHNlcXVlbmNlOworCXVfaW50MzJfdCB0aW1lc3RhbXA7CisJdV9pbnQzMl90IHNzcmM7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgcnRwX3hfaGRyIHsKKwl1X2ludDE2X3QgYnlfcHJvZmlsZTsKKwl1X2ludDE2X3QgbGVuZ3RoOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2RlZmluZSBSVFBfVkVSU0lPTgkyCisKKy8qIGRlY29kZSBhbiBydHAgZnJhbWUgYW5kIGNyZWF0ZSBhIG5ldyBidWZmZXIgd2l0aCBwYXlsb2FkICovCitzdGF0aWMgaW50IHJ0cF9kZWNvZGUoc3RydWN0IG1zZ2IgKm1zZywgdV9pbnQzMl90IGNhbGxyZWYsIHN0cnVjdCBtc2diICoqZGF0YSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbmV3X21zZzsKKwlzdHJ1Y3QgZ3NtX2RhdGFfZnJhbWUgKmZyYW1lOworCXN0cnVjdCBydHBfaGRyICpydHBoID0gKHN0cnVjdCBydHBfaGRyICopbXNnLT5kYXRhOworCXN0cnVjdCBydHBfeF9oZHIgKnJ0cHhoOworCXVfaW50OF90ICpwYXlsb2FkOworCWludCBwYXlsb2FkX2xlbjsKKwlpbnQgbXNnX3R5cGU7CisJaW50IHhfbGVuOworCisJaWYgKG1zZy0+bGVuIDwgMTIpIHsKKwkJREVCVUdQQyhETVVYLCAicmVjZWl2ZWQgUlRQIGZyYW1lIHRvbyBzaG9ydCAobGVuID0gJWQpXG4iLAorCQkJbXNnLT5sZW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHJ0cGgtPnZlcnNpb24gIT0gUlRQX1ZFUlNJT04pIHsKKwkJREVCVUdQQyhETVVYLCAicmVjZWl2ZWQgUlRQIHZlcnNpb24gJWQgbm90IHN1cHBvcnRlZC5cbiIsCisJCQlydHBoLT52ZXJzaW9uKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXBheWxvYWQgPSBtc2ctPmRhdGEgKyBzaXplb2Yoc3RydWN0IHJ0cF9oZHIpICsgKHJ0cGgtPmNzcmNfY291bnQgPDwgMik7CisJcGF5bG9hZF9sZW4gPSBtc2ctPmxlbiAtIHNpemVvZihzdHJ1Y3QgcnRwX2hkcikgLSAocnRwaC0+Y3NyY19jb3VudCA8PCAyKTsKKwlpZiAocGF5bG9hZF9sZW4gPCAwKSB7CisJCURFQlVHUEMoRE1VWCwgInJlY2VpdmVkIFJUUCBmcmFtZSB0b28gc2hvcnQgKGxlbiA9ICVkLCAiCisJCQkiY3NyYyBjb3VudCA9ICVkKVxuIiwgbXNnLT5sZW4sIHJ0cGgtPmNzcmNfY291bnQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHJ0cGgtPmV4dGVuc2lvbikgeworCQlpZiAocGF5bG9hZF9sZW4gPCBzaXplb2Yoc3RydWN0IHJ0cF94X2hkcikpIHsKKwkJCURFQlVHUEMoRE1VWCwgInJlY2VpdmVkIFJUUCBmcmFtZSB0b28gc2hvcnQgZm9yICIKKwkJCQkiZXh0ZW5zaW9uIGhlYWRlclxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlydHB4aCA9IChzdHJ1Y3QgcnRwX3hfaGRyICopcGF5bG9hZDsKKwkJeF9sZW4gPSBudG9ocyhydHB4aC0+bGVuZ3RoKSAqIDQgKyBzaXplb2Yoc3RydWN0IHJ0cF94X2hkcik7CisJCXBheWxvYWQgKz0geF9sZW47CisJCXBheWxvYWRfbGVuIC09IHhfbGVuOworCQlpZiAocGF5bG9hZF9sZW4gPCAwKSB7CisJCQlERUJVR1BDKERNVVgsICJyZWNlaXZlZCBSVFAgZnJhbWUgdG9vIHNob3J0LCAiCisJCQkJImV4dGVuc2lvbiBoZWFkZXIgZXhjZWVkcyBmcmFtZSBsZW5ndGhcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJaWYgKHJ0cGgtPnBhZGRpbmcpIHsKKwkJaWYgKHBheWxvYWRfbGVuIDwgMCkgeworCQkJREVCVUdQQyhETVVYLCAicmVjZWl2ZWQgUlRQIGZyYW1lIHRvbyBzaG9ydCBmb3IgIgorCQkJCSJwYWRkaW5nIGxlbmd0aFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlwYXlsb2FkX2xlbiAtPSBwYXlsb2FkW3BheWxvYWRfbGVuIC0gMV07CisJCWlmIChwYXlsb2FkX2xlbiA8IDApIHsKKwkJCURFQlVHUEMoRE1VWCwgInJlY2VpdmVkIFJUUCBmcmFtZSB3aXRoIHBhZGRpbmcgIgorCQkJCSJncmVhdGVyIHRoYW4gcGF5bG9hZFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCXN3aXRjaCAocnRwaC0+cGF5bG9hZF90eXBlKSB7CisJY2FzZSBSVFBfUFRfR1NNX0ZVTEw6CisJCW1zZ190eXBlID0gR1NNX1RDSEZfRlJBTUU7CisJCWlmIChwYXlsb2FkX2xlbiAhPSAzMykgeworCQkJREVCVUdQQyhETVVYLCAicmVjZWl2ZWQgUlRQIGZ1bGwgcmF0ZSBmcmFtZSB3aXRoICIKKwkJCQkicGF5bG9hZCBsZW5ndGggIT0gMzIgKGxlbiA9ICVkKVxuIiwKKwkJCQlwYXlsb2FkX2xlbik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwljYXNlIFJUUF9QVF9HU01fRUZSOgorCQltc2dfdHlwZSA9IEdTTV9UQ0hGX0ZSQU1FX0VGUjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREVCVUdQQyhETVVYLCAicmVjZWl2ZWQgUlRQIGZyYW1lIHdpdGggdW5rbm93biBwYXlsb2FkICIKKwkJCSJ0eXBlICVkXG4iLCBydHBoLT5wYXlsb2FkX3R5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwluZXdfbXNnID0gbXNnYl9hbGxvYyhzaXplb2Yoc3RydWN0IGdzbV9kYXRhX2ZyYW1lKSArIHBheWxvYWRfbGVuLAorCQkJCSJHU00tREFUQSIpOworCWlmICghbmV3X21zZykKKwkJcmV0dXJuIC1FTk9NRU07CisJZnJhbWUgPSAoc3RydWN0IGdzbV9kYXRhX2ZyYW1lICopKG5ld19tc2ctPmRhdGEpOworCWZyYW1lLT5tc2dfdHlwZSA9IG1zZ190eXBlOworCWZyYW1lLT5jYWxscmVmID0gY2FsbHJlZjsKKwltZW1jcHkoZnJhbWUtPmRhdGEsIHBheWxvYWQsIHBheWxvYWRfbGVuKTsKKwltc2diX3B1dChuZXdfbXNnLCBzaXplb2Yoc3RydWN0IGdzbV9kYXRhX2ZyYW1lKSArIHBheWxvYWRfbGVuKTsKKworCSpkYXRhID0gbmV3X21zZzsKKwlyZXR1cm4gMDsKK30KKworLyogInRvIC0gZnJvbSIgKi8KK3N0YXRpYyB2b2lkIHR2X2RpZmZlcmVuY2Uoc3RydWN0IHRpbWV2YWwgKmRpZmYsIGNvbnN0IHN0cnVjdCB0aW1ldmFsICpmcm9tLAorCQkJICBjb25zdCBzdHJ1Y3QgdGltZXZhbCAqX190bykKK3sKKwlzdHJ1Y3QgdGltZXZhbCBfdG8gPSAqX190bywgKnRvID0gJl90bzsKKworCWlmICh0by0+dHZfdXNlYyA8IGZyb20tPnR2X3VzZWMpIHsKKwkJdG8tPnR2X3NlYyAtPSAxOworCQl0by0+dHZfdXNlYyArPSAxMDAwMDAwOworCX0KKworCWRpZmYtPnR2X3VzZWMgPSB0by0+dHZfdXNlYyAtIGZyb20tPnR2X3VzZWM7CisJZGlmZi0+dHZfc2VjID0gdG8tPnR2X3NlYyAtIGZyb20tPnR2X3NlYzsKK30KKworLyogZW5jb2RlIGFuZCBzZW5kIGEgcnRwIGZyYW1lICovCitpbnQgcnRwX3NlbmRfZnJhbWUoc3RydWN0IHJ0cF9zb2NrZXQgKnJzLCBzdHJ1Y3QgZ3NtX2RhdGFfZnJhbWUgKmZyYW1lKQoreworCXN0cnVjdCBydHBfc3ViX3NvY2tldCAqcnNzID0gJnJzLT5ydHA7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlzdHJ1Y3QgcnRwX2hkciAqcnRwaDsKKwlpbnQgcGF5bG9hZF90eXBlOworCWludCBwYXlsb2FkX2xlbjsKKwlpbnQgZHVyYXRpb247IC8qIGluIHNhbXBsZXMgKi8KKworCWlmIChycy0+dHhfYWN0aW9uICE9IFJUUF9TRU5EX0RPV05TVFJFQU0pIHsKKwkJLyogaW5pdGlhbGl6ZSBzZXF1ZW5jZXMgKi8KKwkJcnMtPnR4X2FjdGlvbiA9IFJUUF9TRU5EX0RPV05TVFJFQU07CisJCXJzLT50cmFuc21pdC5zc3JjID0gcmFuZCgpOworCQlycy0+dHJhbnNtaXQuc2VxdWVuY2UgPSByYW5kb20oKTsKKwkJcnMtPnRyYW5zbWl0LnRpbWVzdGFtcCA9IHJhbmRvbSgpOworCX0KKworCXN3aXRjaCAoZnJhbWUtPm1zZ190eXBlKSB7CisJY2FzZSBHU01fVENIRl9GUkFNRToKKwkJcGF5bG9hZF90eXBlID0gUlRQX1BUX0dTTV9GVUxMOworCQlwYXlsb2FkX2xlbiA9IDMzOworCQlkdXJhdGlvbiA9IDE2MDsKKwkJYnJlYWs7CisJY2FzZSBHU01fVENIRl9GUkFNRV9FRlI6CisJCXBheWxvYWRfdHlwZSA9IFJUUF9QVF9HU01fRUZSOworCQlwYXlsb2FkX2xlbiA9IDMxOworCQlkdXJhdGlvbiA9IDE2MDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREVCVUdQQyhETVVYLCAidW5zdXBwb3J0ZWQgbWVzc2FnZSB0eXBlICVkXG4iLAorCQkJZnJhbWUtPm1zZ190eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJeworCQlzdHJ1Y3QgdGltZXZhbCB0diwgdHZfZGlmZjsKKwkJbG9uZyBpbnQgdXNlY19kaWZmLCBmcmFtZV9kaWZmOworCisJCWdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworCQl0dl9kaWZmZXJlbmNlKCZ0dl9kaWZmLCAmcnMtPnRyYW5zbWl0Lmxhc3RfdHYsICZ0dik7CisJCXJzLT50cmFuc21pdC5sYXN0X3R2ID0gdHY7CisKKwkJdXNlY19kaWZmID0gdHZfZGlmZi50dl9zZWMgKiAxMDAwMDAwICsgdHZfZGlmZi50dl91c2VjOworCQlmcmFtZV9kaWZmID0gKHVzZWNfZGlmZiAvIDIwMDAwKTsKKworCQlpZiAoYWJzKGZyYW1lX2RpZmYpID4gMSkgeworCQkJbG9uZyBpbnQgZnJhbWVfZGlmZl9leGNlc3MgPSBmcmFtZV9kaWZmIC0gMTsKKworCQkJTE9HUChETVVYLCBMT0dMX05PVElDRSwKKwkJCQkiQ29ycmVjdGluZyBmcmFtZSBkaWZmZXJlbmNlIG9mICVsZCBmcmFtZXNcbiIsIGZyYW1lX2RpZmZfZXhjZXNzKTsKKwkJCXJzLT50cmFuc21pdC5zZXF1ZW5jZSArPSBmcmFtZV9kaWZmX2V4Y2VzczsKKwkJCXJzLT50cmFuc21pdC50aW1lc3RhbXAgKz0gZnJhbWVfZGlmZl9leGNlc3MgKiBkdXJhdGlvbjsKKwkJfQorCX0KKworCW1zZyA9IG1zZ2JfYWxsb2Moc2l6ZW9mKHN0cnVjdCBydHBfaGRyKSArIHBheWxvYWRfbGVuLCAiUlRQLUdTTS1GVUxMIik7CisJaWYgKCFtc2cpCisJCXJldHVybiAtRU5PTUVNOworCXJ0cGggPSAoc3RydWN0IHJ0cF9oZHIgKiltc2ctPmRhdGE7CisJcnRwaC0+dmVyc2lvbiA9IFJUUF9WRVJTSU9OOworCXJ0cGgtPnBhZGRpbmcgPSAwOworCXJ0cGgtPmV4dGVuc2lvbiA9IDA7CisJcnRwaC0+Y3NyY19jb3VudCA9IDA7CisJcnRwaC0+bWFya2VyID0gMDsKKwlydHBoLT5wYXlsb2FkX3R5cGUgPSBwYXlsb2FkX3R5cGU7CisJcnRwaC0+c2VxdWVuY2UgPSBodG9ucyhycy0+dHJhbnNtaXQuc2VxdWVuY2UrKyk7CisJcnRwaC0+dGltZXN0YW1wID0gaHRvbmwocnMtPnRyYW5zbWl0LnRpbWVzdGFtcCk7CisJcnMtPnRyYW5zbWl0LnRpbWVzdGFtcCArPSBkdXJhdGlvbjsKKwlydHBoLT5zc3JjID0gaHRvbmwocnMtPnRyYW5zbWl0LnNzcmMpOworCW1lbWNweShtc2ctPmRhdGEgKyBzaXplb2Yoc3RydWN0IHJ0cF9oZHIpLCBmcmFtZS0+ZGF0YSwgcGF5bG9hZF9sZW4pOworCW1zZ2JfcHV0KG1zZywgc2l6ZW9mKHN0cnVjdCBydHBfaGRyKSArIHBheWxvYWRfbGVuKTsKKwltc2diX2VucXVldWUoJnJzcy0+dHhfcXVldWUsIG1zZyk7CisJcnNzLT5iZmQud2hlbiB8PSBCU0NfRkRfV1JJVEU7CisKKwlyZXR1cm4gMDsKK30KKworLyogaXRlcmF0ZSBvdmVyIGFsbCBjaHVua3MgaW4gb25lIFJUQ1AgbWVzc2FnZSwgbG9vayBmb3IgQ05BTUUgSUVzIGFuZAorICogcmVwbGFjZSBhbGwgb2YgdGhvc2Ugd2l0aCAnbmV3X2NuYW1lJyAqLworc3RhdGljIGludCBydGNwX3NkZXNfY25hbWVfbWFuZ2xlKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBydGNwX2hkciAqcmgsCisJCQkJICB1X2ludDE2X3QgKnJ0Y3BfbGVuLCBjb25zdCBjaGFyICpuZXdfY25hbWUpCit7CisJdV9pbnQ4X3QgKnJ0Y3BfZW5kOworCXVfaW50OF90ICpjdXIgPSAodV9pbnQ4X3QgKikgcmg7CisJdV9pbnQ4X3QgdGFnLCBsZW4gPSAwOworCisJcnRjcF9lbmQgPSBjdXIgKyAqcnRjcF9sZW47CisJLyogbW92ZSBjdXIgdG8gZW5kIG9mIFJUUCBoZWFkZXIgKi8KKwljdXIgKz0gc2l6ZW9mKCpyaCk7CisKKwkvKiBpdGVyYXRlIG92ZXIgQ2h1bmtzICovCisJd2hpbGUgKGN1cis0IDwgcnRjcF9lbmQpIHsKKwkJLyogc2tpcCBmb3VyIGJ5dGVzIFNTUkMvQ1NSQyAqLworCQljdXIgKz0gNDsKKwkKKwkJLyogaXRlcmF0ZSBvdmVyIElFJ3MgaW5zaWRlIHRoZSBjaHVuayAqLworCQl3aGlsZSAoY3VyKzEgPCBydGNwX2VuZCkgeworCQkJdGFnID0gKmN1cisrOworCQkJaWYgKHRhZyA9PSAwKSB7CisJCQkJLyogZW5kIG9mIGNodW5rLCBza2lwIGFkZGl0aW9uYWwgemVybyAqLworCQkJCXdoaWxlICgqY3VyKysgPT0gMCkgeyB9CisJCQkJYnJlYWs7CisJCQl9CisJCQlsZW4gPSAqY3VyKys7CisJCisJCQlpZiAodGFnID09IFJUQ1BfSUVfQ05BTUUpIHsKKwkJCQkvKiB3ZSd2ZSBmb3VuZCB0aGUgQ05BTUUsIGxldHMgbWFuZ2xlIGl0ICovCisJCQkJaWYgKGxlbiA8IHN0cmxlbihuZXdfY25hbWUpKSB7CisJCQkJCS8qIHdlIG5lZWQgdG8gbWFrZSBtb3JlIHNwYWNlICovCisJCQkJCWludCBpbmNyZWFzZSA9IHN0cmxlbihuZXdfY25hbWUpIC0gbGVuOworCisJCQkJCW1zZ2JfcHVzaChtc2csIGluY3JlYXNlKTsKKwkJCQkJbWVtbW92ZShjdXIrbGVuK2luY3JlYXNlLCBjdXIrbGVuLAorCQkJCQkJcnRjcF9lbmQgLSAoY3VyK2xlbikpOworCQkJCQkvKiBGSVhNRTogd2UgaGF2ZSB0byByZXNwZWN0IFJUQ1AKKwkJCQkJICogcGFkZGluZy9hbGlnbm1lbnQgcnVsZXMhICovCisJCQkJCWxlbiArPSBpbmNyZWFzZTsKKwkJCQkJKihjdXItMSkgKz0gaW5jcmVhc2U7CisJCQkJCXJ0Y3BfZW5kICs9IGluY3JlYXNlOworCQkJCQkqcnRjcF9sZW4gKz0gaW5jcmVhc2U7CisJCQkJfQorCQkJCS8qIGNvcHkgbmV3IENOQU1FIGludG8gbWVzc2FnZSAqLworCQkJCW1lbWNweShjdXIsIG5ld19jbmFtZSwgc3RybGVuKG5ld19jbmFtZSkpOworCQkJCS8qIEZJWE1FOiB6ZXJvIHRoZSBwYWRkaW5nIGluIGNhc2UgbmV3IENOQU1FCisJCQkJICogaXMgc21hbGxlciB0aGFuIG9sZCBvbmUgISEhICovCisJCQl9CisJCQljdXIgKz0gbGVuOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnRjcF9tYW5nbGUoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IHJ0cF9zb2NrZXQgKnJzKQoreworCXN0cnVjdCBydHBfc3ViX3NvY2tldCAqcnNzID0gJnJzLT5ydGNwOworCXN0cnVjdCBydGNwX2hkciAqcnRwaDsKKwl1X2ludDE2X3Qgb2xkX2xlbjsKKwlpbnQgcmM7CisKKwlpZiAoIW1hbmdsZV9ydGNwX2NuYW1lKQorCQlyZXR1cm4gMDsKKworCXByaW50ZigiUlRDUFxuIik7CisJLyogaXRlcmF0ZSBvdmVyIGxpc3Qgb2YgUlRDUCBtZXNzYWdlcyAqLworCXJ0cGggPSAoc3RydWN0IHJ0Y3BfaGRyICopbXNnLT5kYXRhOworCXdoaWxlICgodm9pZCAqKXJ0cGggKyBzaXplb2YoKnJ0cGgpIDw9ICh2b2lkICopbXNnLT5kYXRhICsgbXNnLT5sZW4pIHsKKwkJb2xkX2xlbiA9IChudG9ocyhydHBoLT5sZW5ndGgpICsgMSkgKiA0OworCQlpZiAoKHZvaWQgKilydHBoICsgb2xkX2xlbiA+ICh2b2lkICopbXNnLT5kYXRhICsgbXNnLT5sZW4pIHsKKwkJCURFQlVHUEMoRE1VWCwgInJlY2VpdmVkIFJUQ1AgcGFja2V0IHRvbyBzaG9ydCBmb3IgIgorCQkJCSJsZW5ndGggZWxlbWVudFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAocnRwaC0+dHlwZSA9PSBSVENQX1RZUEVfU0RFUykgeworCQkJY2hhciBuZXdfY25hbWVbMjU1XTsKKwkJCXN0cm5jcHkobmV3X2NuYW1lLCBpbmV0X250b2EocnNzLT5zaW5fbG9jYWwuc2luX2FkZHIpLAorCQkJCXNpemVvZihuZXdfY25hbWUpKTsKKwkJCW5ld19jbmFtZVtzaXplb2YobmV3X2NuYW1lKS0xXSA9ICdcMCc7CisJCQlyYyA9IHJ0Y3Bfc2Rlc19jbmFtZV9tYW5nbGUobXNnLCBydHBoLCAmb2xkX2xlbiwKKwkJCQkJCSAgICBuZXdfY25hbWUpOworCQkJaWYgKHJjIDwgMCkKKwkJCQlyZXR1cm4gcmM7CisJCX0KKwkJcnRwaCA9ICh2b2lkICopcnRwaCArIG9sZF9sZW47CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHJlYWQgZnJvbSBpbmNvbWluZyBSVFAvUlRDUCBzb2NrZXQgKi8KK3N0YXRpYyBpbnQgcnRwX3NvY2tldF9yZWFkKHN0cnVjdCBydHBfc29ja2V0ICpycywgc3RydWN0IHJ0cF9zdWJfc29ja2V0ICpyc3MpCit7CisJaW50IHJjOworCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jKFJUUF9BTExPQ19TSVpFLCAiUlRQL1JUQ1AiKTsKKwlzdHJ1Y3QgbXNnYiAqbmV3X21zZzsKKwlzdHJ1Y3QgcnRwX3N1Yl9zb2NrZXQgKm90aGVyX3JzczsKKworCWlmICghbXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJjID0gcmVhZChyc3MtPmJmZC5mZCwgbXNnLT5kYXRhLCBSVFBfQUxMT0NfU0laRSk7CisJaWYgKHJjIDw9IDApIHsKKwkJcnNzLT5iZmQud2hlbiAmPSB+QlNDX0ZEX1JFQUQ7CisJCXJldHVybiByYzsKKwl9CisKKwltc2diX3B1dChtc2csIHJjKTsKKworCXN3aXRjaCAocnMtPnJ4X2FjdGlvbikgeworCWNhc2UgUlRQX1BST1hZOgorCQlpZiAoIXJzLT5wcm94eS5vdGhlcl9zb2NrKSB7CisJCQlyYyA9IC1FSU87CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisJCWlmIChyc3MtPmJmZC5wcml2X25yID09IFJUUF9QUklWX1JUUCkKKwkJCW90aGVyX3JzcyA9ICZycy0+cHJveHkub3RoZXJfc29jay0+cnRwOworCQllbHNlIGlmIChyc3MtPmJmZC5wcml2X25yID09IFJUUF9QUklWX1JUQ1ApIHsKKwkJCW90aGVyX3JzcyA9ICZycy0+cHJveHkub3RoZXJfc29jay0+cnRjcDsKKwkJCS8qIG1vZGlmeSBSVENQIFNERVMgQ05BTUUgKi8KKwkJCXJjID0gcnRjcF9tYW5nbGUobXNnLCBycyk7CisJCQlpZiAocmMgPCAwKQorCQkJCWdvdG8gb3V0X2ZyZWU7CisJCX0gZWxzZSB7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisJCW1zZ2JfZW5xdWV1ZSgmb3RoZXJfcnNzLT50eF9xdWV1ZSwgbXNnKTsKKwkJb3RoZXJfcnNzLT5iZmQud2hlbiB8PSBCU0NfRkRfV1JJVEU7CisJCWJyZWFrOworCisJY2FzZSBSVFBfUkVDVl9VUFNUUkVBTToKKwkJaWYgKCFycy0+cmVjZWl2ZS5jYWxscmVmIHx8ICFycy0+cmVjZWl2ZS5uZXQpIHsKKwkJCXJjID0gLUVJTzsKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKwkJaWYgKHJzcy0+YmZkLnByaXZfbnIgPT0gUlRQX1BSSVZfUlRDUCkgeworCQkJaWYgKCFtYW5nbGVfcnRjcF9jbmFtZSkgeworCQkJCW1zZ2JfZnJlZShtc2cpOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogbW9kaWZ5IFJUQ1AgU0RFUyBDTkFNRSAqLworCQkJcmMgPSBydGNwX21hbmdsZShtc2csIHJzKTsKKwkJCWlmIChyYyA8IDApCisJCQkJZ290byBvdXRfZnJlZTsKKwkJCW1zZ2JfZW5xdWV1ZSgmcnNzLT50eF9xdWV1ZSwgbXNnKTsKKwkJCXJzcy0+YmZkLndoZW4gfD0gQlNDX0ZEX1dSSVRFOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHJzcy0+YmZkLnByaXZfbnIgIT0gUlRQX1BSSVZfUlRQKSB7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisJCXJjID0gcnRwX2RlY29kZShtc2csIHJzLT5yZWNlaXZlLmNhbGxyZWYsICZuZXdfbXNnKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCW1zZ2JfZnJlZShtc2cpOworCQltc2diX2VucXVldWUoJnJzLT5yZWNlaXZlLm5ldC0+dXBxdWV1ZSwgbmV3X21zZyk7CisJCWJyZWFrOworCisJY2FzZSBSVFBfTk9ORTogLyogaWYgc29ja2V0IGV4aXN0cywgYnV0IGRpc2FibGVkIGJ5IGFwcCAqLworCQltc2diX2ZyZWUobXNnKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7CisKK291dF9mcmVlOgorCW1zZ2JfZnJlZShtc2cpOworCXJldHVybiByYzsKK30KKworLyogd3JpdGUgZnJvbSB0eF9xdWV1ZSB0byBSVFAvUlRDUCBzb2NrZXQgKi8KK3N0YXRpYyBpbnQgcnRwX3NvY2tldF93cml0ZShzdHJ1Y3QgcnRwX3NvY2tldCAqcnMsIHN0cnVjdCBydHBfc3ViX3NvY2tldCAqcnNzKQoreworCXN0cnVjdCBtc2diICptc2c7CisJaW50IHdyaXR0ZW47CisKKwltc2cgPSBtc2diX2RlcXVldWUoJnJzcy0+dHhfcXVldWUpOworCWlmICghbXNnKSB7CisJCXJzcy0+YmZkLndoZW4gJj0gfkJTQ19GRF9XUklURTsKKwkJcmV0dXJuIDA7CisJfQorCisJd3JpdHRlbiA9IHdyaXRlKHJzcy0+YmZkLmZkLCBtc2ctPmRhdGEsIG1zZy0+bGVuKTsKKwlpZiAod3JpdHRlbiA8IG1zZy0+bGVuKSB7CisJCUxPR1AoRE1JQiwgTE9HTF9FUlJPUiwgInNob3J0IHdyaXRlIik7CisJCW1zZ2JfZnJlZShtc2cpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwltc2diX2ZyZWUobXNnKTsKKworCXJldHVybiAwOworfQorCisKKy8qIGNhbGxiYWNrIGZvciB0aGUgc2VsZWN0LmM6YmZkXyogbGF5ZXIgKi8KK3N0YXRpYyBpbnQgcnRwX2JmZF9jYihzdHJ1Y3QgYnNjX2ZkICpiZmQsIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgcnRwX3NvY2tldCAqcnMgPSBiZmQtPmRhdGE7CisJc3RydWN0IHJ0cF9zdWJfc29ja2V0ICpyc3M7CisKKwlzd2l0Y2ggKGJmZC0+cHJpdl9ucikgeworCWNhc2UgUlRQX1BSSVZfUlRQOgorCQlyc3MgPSAmcnMtPnJ0cDsKKwkJYnJlYWs7CisJY2FzZSBSVFBfUFJJVl9SVENQOgorCQlyc3MgPSAmcnMtPnJ0Y3A7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChmbGFncyAmIEJTQ19GRF9SRUFEKQorCQlydHBfc29ja2V0X3JlYWQocnMsIHJzcyk7CisKKwlpZiAoZmxhZ3MgJiBCU0NfRkRfV1JJVEUpCisJCXJ0cF9zb2NrZXRfd3JpdGUocnMsIHJzcyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaW5pdF9yc3Moc3RydWN0IHJ0cF9zdWJfc29ja2V0ICpyc3MsCisJCSAgICAgc3RydWN0IHJ0cF9zb2NrZXQgKnJzLCBpbnQgZmQsIGludCBwcml2X25yKQoreworCS8qIGluaXRpYWxpemUgYmZkICovCisJcnNzLT5iZmQuZmQgPSBmZDsKKwlyc3MtPmJmZC5kYXRhID0gcnM7CisJcnNzLT5iZmQucHJpdl9uciA9IHByaXZfbnI7CisJcnNzLT5iZmQuY2IgPSBydHBfYmZkX2NiOworfQorCitzdHJ1Y3QgcnRwX3NvY2tldCAqcnRwX3NvY2tldF9jcmVhdGUodm9pZCkKK3sKKwlpbnQgcmM7CisJc3RydWN0IHJ0cF9zb2NrZXQgKnJzOworCisJREVCVUdQKERNVVgsICJydHBfc29ja2V0X2NyZWF0ZSgpOiAiKTsKKworCXJzID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3QgcnRwX3NvY2tldCk7CisJaWYgKCFycykKKwkJcmV0dXJuIE5VTEw7CisKKwlJTklUX0xMSVNUX0hFQUQoJnJzLT5ydHAudHhfcXVldWUpOworCUlOSVRfTExJU1RfSEVBRCgmcnMtPnJ0Y3AudHhfcXVldWUpOworCisJcmMgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgSVBQUk9UT19VRFApOworCWlmIChyYyA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlpbml0X3JzcygmcnMtPnJ0cCwgcnMsIHJjLCBSVFBfUFJJVl9SVFApOworCXJjID0gYnNjX3JlZ2lzdGVyX2ZkKCZycy0+cnRwLmJmZCk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBvdXRfcnRwX3NvY2tldDsKKworCXJjID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIG91dF9ydHBfYmZkOworCisJaW5pdF9yc3MoJnJzLT5ydGNwLCBycywgcmMsIFJUUF9QUklWX1JUQ1ApOworCXJjID0gYnNjX3JlZ2lzdGVyX2ZkKCZycy0+cnRjcC5iZmQpOworCWlmIChyYyA8IDApCisJCWdvdG8gb3V0X3J0Y3Bfc29ja2V0OworCisJREVCVUdQQyhETVVYLCAic3VjY2Vzc1xuIik7CisKKwlyYyA9IHJ0cF9zb2NrZXRfYmluZChycywgSU5BRERSX0FOWSk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBvdXRfcnRjcF9iZmQ7CisKKwlyZXR1cm4gcnM7CisKK291dF9ydGNwX2JmZDoKKwlic2NfdW5yZWdpc3Rlcl9mZCgmcnMtPnJ0Y3AuYmZkKTsKK291dF9ydGNwX3NvY2tldDoKKwljbG9zZShycy0+cnRjcC5iZmQuZmQpOworb3V0X3J0cF9iZmQ6CisJYnNjX3VucmVnaXN0ZXJfZmQoJnJzLT5ydHAuYmZkKTsKK291dF9ydHBfc29ja2V0OgorCWNsb3NlKHJzLT5ydHAuYmZkLmZkKTsKK291dF9mcmVlOgorCXRhbGxvY19mcmVlKHJzKTsKKwlERUJVR1BDKERNVVgsICJmYWlsZWRcbiIpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHJ0cF9zdWJfc29ja2V0X2JpbmQoc3RydWN0IHJ0cF9zdWJfc29ja2V0ICpyc3MsIHVfaW50MzJfdCBpcCwKKwkJCQl1X2ludDE2X3QgcG9ydCkKK3sKKwlpbnQgcmM7CisJc29ja2xlbl90IGFsZW4gPSBzaXplb2YocnNzLT5zaW5fbG9jYWwpOworCisJcnNzLT5zaW5fbG9jYWwuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJcnNzLT5zaW5fbG9jYWwuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoaXApOworCXJzcy0+c2luX2xvY2FsLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisJcnNzLT5iZmQud2hlbiB8PSBCU0NfRkRfUkVBRDsKKworCXJjID0gYmluZChyc3MtPmJmZC5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZyc3MtPnNpbl9sb2NhbCwKKwkJICBzaXplb2YocnNzLT5zaW5fbG9jYWwpKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwkvKiByZXRyaWV2ZSB0aGUgYWRkcmVzcyB3ZSBhY3R1YWxseSBib3VuZCB0bywgaW4gY2FzZSB3ZQorCSAqIHBhc3NlZCBJTkFERFJfQU5ZIGFzIElQIGFkZHJlc3MgKi8KKwlyZXR1cm4gZ2V0c29ja25hbWUocnNzLT5iZmQuZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmcnNzLT5zaW5fbG9jYWwsCisJCQkgICAmYWxlbik7Cit9CisKKyNkZWZpbmUgUlRQX1BPUlRfQkFTRQkzMDAwMAorc3RhdGljIHVuc2lnbmVkIGludCBuZXh0X3VkcF9wb3J0ID0gUlRQX1BPUlRfQkFTRTsKKworLyogYmluZCBhIFJUUCBzb2NrZXQgdG8gYSBsb2NhbCBhZGRyZXNzICovCitpbnQgcnRwX3NvY2tldF9iaW5kKHN0cnVjdCBydHBfc29ja2V0ICpycywgdV9pbnQzMl90IGlwKQoreworCWludCByYyA9IC1FSU87CisJc3RydWN0IGluX2FkZHIgaWE7CisKKwlpYS5zX2FkZHIgPSBodG9ubChpcCk7CisJREVCVUdQKERNVVgsICJydHBfc29ja2V0X2JpbmQocnM9JXAsIElQPSVzKTogIiwgcnMsCisJCWluZXRfbnRvYShpYSkpOworCisJLyogdHJ5IHRvIGJpbmQgdG8gYSBjb25zZWN1dGl2ZSBwYWlyIG9mIHBvcnRzICovCisJZm9yIChuZXh0X3VkcF9wb3J0ID0gbmV4dF91ZHBfcG9ydCAlIDB4ZmZmZjsKKwkgICAgIG5leHRfdWRwX3BvcnQgPCAweGZmZmY7IG5leHRfdWRwX3BvcnQgKz0gMikgeworCQlyYyA9IHJ0cF9zdWJfc29ja2V0X2JpbmQoJnJzLT5ydHAsIGlwLCBuZXh0X3VkcF9wb3J0KTsKKwkJaWYgKHJjICE9IDApCisJCQljb250aW51ZTsKKworCQlyYyA9IHJ0cF9zdWJfc29ja2V0X2JpbmQoJnJzLT5ydGNwLCBpcCwgbmV4dF91ZHBfcG9ydCsxKTsKKwkJaWYgKHJjID09IDApCisJCQlicmVhazsKKwl9CisJaWYgKHJjIDwgMCkgeworCQlERUJVR1BDKERNVVgsICJmYWlsZWRcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJaWEuc19hZGRyID0gcnMtPnJ0cC5zaW5fbG9jYWwuc2luX2FkZHIuc19hZGRyOworCURFQlVHUEMoRE1VWCwgIkJPVU5EX0lQPSVzLCBCT1VORF9QT1JUPSV1XG4iLAorCQlpbmV0X250b2EoaWEpLCBudG9ocyhycy0+cnRwLnNpbl9sb2NhbC5zaW5fcG9ydCkpOworCXJldHVybiBudG9ocyhycy0+cnRwLnNpbl9sb2NhbC5zaW5fcG9ydCk7Cit9CisKK3N0YXRpYyBpbnQgcnRwX3N1Yl9zb2NrZXRfY29ubmVjdChzdHJ1Y3QgcnRwX3N1Yl9zb2NrZXQgKnJzcywKKwkJCQkgIHVfaW50MzJfdCBpcCwgdV9pbnQxNl90IHBvcnQpCit7CisJaW50IHJjOworCXNvY2tsZW5fdCBhbGVuID0gc2l6ZW9mKHJzcy0+c2luX2xvY2FsKTsKKworCXJzcy0+c2luX3JlbW90ZS5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlyc3MtPnNpbl9yZW1vdGUuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoaXApOworCXJzcy0+c2luX3JlbW90ZS5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworCisJcmMgPSBjb25uZWN0KHJzcy0+YmZkLmZkLCAoc3RydWN0IHNvY2thZGRyICopICZyc3MtPnNpbl9yZW1vdGUsCisJCSAgICAgc2l6ZW9mKHJzcy0+c2luX3JlbW90ZSkpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXJldHVybiBnZXRzb2NrbmFtZShyc3MtPmJmZC5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZyc3MtPnNpbl9sb2NhbCwKKwkJCSAgICZhbGVuKTsKK30KKworLyogJ2Nvbm5lY3QnIGEgUlRQIHNvY2tldCB0byBhIHJlbW90ZSBwZWVyICovCitpbnQgcnRwX3NvY2tldF9jb25uZWN0KHN0cnVjdCBydHBfc29ja2V0ICpycywgdV9pbnQzMl90IGlwLCB1X2ludDE2X3QgcG9ydCkKK3sKKwlpbnQgcmM7CisJc3RydWN0IGluX2FkZHIgaWE7CisKKwlpYS5zX2FkZHIgPSBodG9ubChpcCk7CisJREVCVUdQKERNVVgsICJydHBfc29ja2V0X2Nvbm5lY3QocnM9JXAsIGlwPSVzLCBwb3J0PSV1KVxuIiwKKwkJcnMsIGluZXRfbnRvYShpYSksIHBvcnQpOworCisJcmMgPSBydHBfc3ViX3NvY2tldF9jb25uZWN0KCZycy0+cnRwLCBpcCwgcG9ydCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIHJ0cF9zdWJfc29ja2V0X2Nvbm5lY3QoJnJzLT5ydGNwLCBpcCwgcG9ydCsxKTsKK30KKworLyogYmluZCB0d28gUlRQL1JUQ1Agc29ja2V0cyB0b2dldGhlciAqLworaW50IHJ0cF9zb2NrZXRfcHJveHkoc3RydWN0IHJ0cF9zb2NrZXQgKnRoaXMsIHN0cnVjdCBydHBfc29ja2V0ICpvdGhlcikKK3sKKwlERUJVR1AoRE1VWCwgInJ0cF9zb2NrZXRfcHJveHkodGhpcz0lcCwgb3RoZXI9JXApXG4iLAorCQl0aGlzLCBvdGhlcik7CisKKwl0aGlzLT5yeF9hY3Rpb24gPSBSVFBfUFJPWFk7CisJdGhpcy0+cHJveHkub3RoZXJfc29jayA9IG90aGVyOworCisJb3RoZXItPnJ4X2FjdGlvbiA9IFJUUF9QUk9YWTsKKwlvdGhlci0+cHJveHkub3RoZXJfc29jayA9IHRoaXM7CisKKwlyZXR1cm4gMDsKK30KKworLyogYmluZCBSVFAvUlRDUCBzb2NrZXQgdG8gYXBwbGljYXRpb24gKi8KK2ludCBydHBfc29ja2V0X3Vwc3RyZWFtKHN0cnVjdCBydHBfc29ja2V0ICp0aGlzLCBzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCXVfaW50MzJfdCBjYWxscmVmKQoreworCURFQlVHUChETVVYLCAicnRwX3NvY2tldF9wcm94eSh0aGlzPSVwLCBjYWxscmVmPSV1KVxuIiwKKwkJdGhpcywgY2FsbHJlZik7CisKKwlpZiAoY2FsbHJlZikgeworCQl0aGlzLT5yeF9hY3Rpb24gPSBSVFBfUkVDVl9VUFNUUkVBTTsKKwkJdGhpcy0+cmVjZWl2ZS5uZXQgPSBuZXQ7CisJCXRoaXMtPnJlY2VpdmUuY2FsbHJlZiA9IGNhbGxyZWY7CisJfSBlbHNlCisJCXRoaXMtPnJ4X2FjdGlvbiA9IFJUUF9OT05FOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfdHhfcXVldWUoc3RydWN0IHJ0cF9zdWJfc29ja2V0ICpyc3MpCit7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwkKKwl3aGlsZSAoKG1zZyA9IG1zZ2JfZGVxdWV1ZSgmcnNzLT50eF9xdWV1ZSkpKQorCQltc2diX2ZyZWUobXNnKTsKK30KKworaW50IHJ0cF9zb2NrZXRfZnJlZShzdHJ1Y3QgcnRwX3NvY2tldCAqcnMpCit7CisJREVCVUdQKERNVVgsICJydHBfc29ja2V0X2ZyZWUocnM9JXApXG4iLCBycyk7CisKKwkvKiBtYWtlIHN1cmUgd2UgZG9uJ3QgbGVhdmUgcmVmZXJlbmNlcyBkYW5nbGluZyB0byB1cyAqLworCWlmIChycy0+cnhfYWN0aW9uID09IFJUUF9QUk9YWSAmJgorCSAgICBycy0+cHJveHkub3RoZXJfc29jaykKKwkJcnMtPnByb3h5Lm90aGVyX3NvY2stPnByb3h5Lm90aGVyX3NvY2sgPSBOVUxMOworCisJYnNjX3VucmVnaXN0ZXJfZmQoJnJzLT5ydHAuYmZkKTsKKwljbG9zZShycy0+cnRwLmJmZC5mZCk7CisJZnJlZV90eF9xdWV1ZSgmcnMtPnJ0cCk7CisKKwlic2NfdW5yZWdpc3Rlcl9mZCgmcnMtPnJ0Y3AuYmZkKTsKKwljbG9zZShycy0+cnRjcC5iZmQuZmQpOworCWZyZWVfdHhfcXVldWUoJnJzLT5ydGNwKTsKKworCXRhbGxvY19mcmVlKHJzKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvc2NjcC9zY2NwLmMgYi9vcGVuYnNjL3NyYy9zY2NwL3NjY3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTE4NjE0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvc2NjcC9zY2NwLmMKQEAgLTAsMCArMSwxMzU3IEBACisvKgorICogU0NDUCBtYW5hZ2VtZW50IGNvZGUKKyAqCisgKiAoQykgMjAwOSwgMjAxMCBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiAoQykgMjAwOSwgMjAxMCBieSBPbi1XYXZlcworICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCisjaW5jbHVkZSA8c2NjcC9zY2NwLmg+CisKKworc3RhdGljIHZvaWQgKnRhbGxfc2NjcF9jdHg7CitzdGF0aWMgTExJU1RfSEVBRChzY2NwX2Nvbm5lY3Rpb25zKTsKKworI2RlZmluZSBTQ0NQX01TR19TSVpFIDQwOTYKKyNkZWZpbmUgU0NDUF9NU0dfSEVBRFJPT00gMTI4CisKKy8qIGdsb2JhbCBkYXRhICovCitjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCBzY2NwX3Nzbl9ic3NhcCA9IHsKKwkuc2NjcF9mYW1pbHkJPSAwLAorCS5zY2NwX3Nzbgk9IFNDQ1BfU1NOX0JTU0FQLAorfTsKKworc3RydWN0IHNjY3Bfc3lzdGVtIHsKKwkvKiBsYXllcjMgLT4gbGF5ZXIyICovCisJdm9pZCAoKndyaXRlX2RhdGEpKHN0cnVjdCBtc2diICpkYXRhLCB2b2lkICpjb250ZXh0KTsKKwl2b2lkICp3cml0ZV9jb250ZXh0OworfTsKKworCitzdGF0aWMgc3RydWN0IHNjY3Bfc3lzdGVtIHNjY3Bfc3lzdGVtID0geworCS53cml0ZV9kYXRhID0gTlVMTCwKK307CisKK3N0cnVjdCBzY2NwX2RhdGFfY2FsbGJhY2sgeworCS8qIGNvbm5lY3Rpb24gYmFzZWQgKi8KKwlpbnQgKCphY2NlcHRfY2IpKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKiwgdm9pZCAqKTsKKwl2b2lkICphY2NlcHRfY29udGV4dDsKKworCS8qIGNvbm5lY3Rpb24gbGVzcyAqLworCWludCAoKnJlYWRfY2IpKHN0cnVjdCBtc2diICosIHVuc2lnbmVkIGludCwgdm9pZCAqKTsKKwl2b2lkICpyZWFkX2NvbnRleHQ7CisKKwl1X2ludDhfdCBzc247CisJc3RydWN0IGxsaXN0X2hlYWQgY2FsbGJhY2s7Cit9OworCitzdGF0aWMgTExJU1RfSEVBRChzY2NwX2NhbGxiYWNrcyk7CisKK3N0YXRpYyBzdHJ1Y3Qgc2NjcF9kYXRhX2NhbGxiYWNrICpfZmluZF9zc24odV9pbnQ4X3Qgc3NuKQoreworCXN0cnVjdCBzY2NwX2RhdGFfY2FsbGJhY2sgKmNiOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoY2IsICZzY2NwX2NhbGxiYWNrcywgY2FsbGJhY2spIHsKKwkJaWYgKGNiLT5zc24gPT0gc3NuKQorCQkJcmV0dXJuIGNiOworCX0KKworCS8qIG5lZWQgdG8gYWRkIG9uZSAqLworCWNiID0gdGFsbG9jX3plcm8odGFsbF9zY2NwX2N0eCwgc3RydWN0IHNjY3BfZGF0YV9jYWxsYmFjayk7CisJaWYgKCFjYikgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIGFsbG9jYXRlIHNjY3AgY2FsbGJhY2suXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJY2ItPnNzbiA9IHNzbjsKKwlsbGlzdF9hZGRfdGFpbCgmY2ItPmNhbGxiYWNrLCAmc2NjcF9jYWxsYmFja3MpOworCXJldHVybiBjYjsKK30KKworCitzdGF0aWMgdm9pZCBfc2VuZF9tc2coc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzY2NwX3N5c3RlbS53cml0ZV9kYXRhKG1zZywgc2NjcF9zeXN0ZW0ud3JpdGVfY29udGV4dCk7Cit9CisKKy8qCisgKiBwYXJzaW5nIHJvdXRpbmVzCisgKi8KK3N0YXRpYyBpbnQgY29weV9hZGRyZXNzKHN0cnVjdCBzY2NwX2FkZHJlc3MgKmFkZHIsIHVfaW50OF90IG9mZnNldCwgc3RydWN0IG1zZ2IgKm1zZ2IpCit7CisJc3RydWN0IHNjY3BfY2FsbGVkX3BhcnR5X2FkZHJlc3MgKnBhcnR5OworCisJaW50IHJvb20gPSBtc2diX2wybGVuKG1zZ2IpIC0gb2Zmc2V0OworCXVfaW50OF90IHJlYWQgPSAwOworCXVfaW50OF90IGxlbmd0aDsKKworCWlmIChyb29tIDw9IDApIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIk5vdCBlbm91Z2ggcm9vbSBmb3IgYW4gYWRkcmVzczogJXVcbiIsIHJvb20pOworCQlyZXR1cm4gLTE7CisJfQorCisJbGVuZ3RoID0gbXNnYi0+bDJoW29mZnNldF07CisJaWYgKHJvb20gPD0gbGVuZ3RoKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJOb3QgZW5vdWdoIHJvb20gZm9yIG9wdGlvbmFsIGRhdGEgJXUgJXVcbiIsIHJvb20sIGxlbmd0aCk7CisJCXJldHVybiAtMTsKKwl9CisKKworCXBhcnR5ID0gKHN0cnVjdCBzY2NwX2NhbGxlZF9wYXJ0eV9hZGRyZXNzICopKG1zZ2ItPmwyaCArIG9mZnNldCArIDEpOworCWlmIChwYXJ0eS0+cG9pbnRfY29kZV9pbmRpY2F0b3IpIHsKKwkJaWYgKGxlbmd0aCA8PSByZWFkICsgMikgeworCQkgICAgTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIlBPSSBkb2VzIG5vdCBmaXQgJXVcbiIsIGxlbmd0aCk7CisJCSAgICByZXR1cm4gLTE7CisJCX0KKworCisJCW1lbWNweSgmYWRkci0+cG9pLCAmcGFydHktPmRhdGFbcmVhZF0sIDIpOworCQlyZWFkICs9IDI7CisJfQorCisJaWYgKHBhcnR5LT5zc25faW5kaWNhdG9yKSB7CisJCWlmIChsZW5ndGggPD0gcmVhZCArIDEpIHsKKwkJICAgIExPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJTU04gZG9lcyBub3QgZml0ICV1XG4iLCBsZW5ndGgpOworCQkgICAgcmV0dXJuIC0xOworCQl9CisKKwkJYWRkci0+c3NuID0gcGFydHktPmRhdGFbcmVhZF07CisJCXJlYWQgKz0gMTsKKwl9CisKKwlpZiAocGFydHktPmdsb2JhbF90aXRsZV9pbmRpY2F0b3IpIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIkdUSSBub3Qgc3VwcG9ydGVkICV1XG4iLCAqKHVfaW50OF90ICopcGFydHkpOworCQlyZXR1cm4gLTE7CisJfQorCisJYWRkci0+YWRkcmVzcyA9ICpwYXJ0eTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaGVja19hZGRyZXNzKHN0cnVjdCBzY2NwX2FkZHJlc3MgKmFkZHIpCit7CisJLyogaWdub3JlIHBvaW50X2NvZGVfaW5kaWNhdG9yLi4uIGl0IHNob3VsZCBiZSB6ZXJvLi4uIGJ1dCAqLworCWlmIChhZGRyLT5hZGRyZXNzLnNzbl9pbmRpY2F0b3IgIT0gMQorCSAgICB8fCBhZGRyLT5hZGRyZXNzLmdsb2JhbF90aXRsZV9pbmRpY2F0b3IgPT0gMQorCSAgICB8fCBhZGRyLT5hZGRyZXNzLnJvdXRpbmdfaW5kaWNhdG9yICE9IDEpIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwKKwkJCSJJbnZhbGlkIGNhbGxlZCBhZGRyZXNzIGFjY29yZGluZyB0byAwOC4wNjogMHgleCAweCV4XG4iLAorCQkJKih1X2ludDhfdCAqKSZhZGRyLT5hZGRyZXNzLCBhZGRyLT5zc24pOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX3NjY3BfcGFyc2Vfb3B0aW9uYWxfZGF0YShjb25zdCBpbnQgb2Zmc2V0LAorCQkJCSAgICAgc3RydWN0IG1zZ2IgKm1zZ2IsIHN0cnVjdCBzY2NwX29wdGlvbmFsX2RhdGEgKmRhdGEpCit7CisJdV9pbnQxNl90IHJvb20gPSBtc2diX2wybGVuKG1zZ2IpIC0gb2Zmc2V0OworCXVfaW50MTZfdCByZWFkID0gMDsKKworCXdoaWxlIChyb29tID4gcmVhZCkgeworCQl1X2ludDhfdCB0eXBlID0gbXNnYi0+bDJoW29mZnNldCArIHJlYWRdOworCQlpZiAodHlwZSA9PSBTQ0NQX1BOQ19FTkRfT0ZfT1BUSU9OQUwpCisJCQlyZXR1cm4gMDsKKworCQlpZiAocmVhZCArIDEgPj0gcm9vbSkgeworCQkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIm5vIHBsYWNlIGZvciBsZW5ndGhcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQl1X2ludDhfdCBsZW5ndGggPSBtc2diLT5sMmhbb2Zmc2V0ICsgcmVhZCArIDFdOworCQlyZWFkICs9IDIgKyBsZW5ndGg7CisKKworCQlpZiAocm9vbSA8PSByZWFkKSB7CisJCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLAorCQkJICAgICAgICJubyBzcGFjZSBmb3IgdGhlIGRhdGE6IHR5cGU6ICVkIHJlYWQ6ICVkIHJvb206ICVkIGwyOiAlZFxuIiwKKwkJCSAgICAgICB0eXBlLCByZWFkLCByb29tLCBtc2diX2wybGVuKG1zZ2IpKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKHR5cGUgPT0gU0NDUF9QTkNfREFUQSkgeworCQkJZGF0YS0+ZGF0YV9sZW4gPSBsZW5ndGg7CisJCQlkYXRhLT5kYXRhX3N0YXJ0ID0gb2Zmc2V0ICsgcmVhZCAtIGxlbmd0aDsKKwkJfQorCisJfQorCisJcmV0dXJuIC0xOworfQorCitpbnQgX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9yZXF1ZXN0KHN0cnVjdCBtc2diICptc2diLCBzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgKnJlc3VsdCkKK3sKKwlzdGF0aWMgY29uc3QgdV9pbnQzMl90IGhlYWRlcl9zaXplID0KKwkJCXNpemVvZihzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlcXVlc3QpOworCXN0YXRpYyBjb25zdCB1X2ludDMyX3Qgb3B0aW9uYWxfb2Zmc2V0ID0KKwkJCW9mZnNldG9mKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVxdWVzdCwgb3B0aW9uYWxfc3RhcnQpOworCXN0YXRpYyBjb25zdCB1X2ludDMyX3QgY2FsbGVkX29mZnNldCA9CisJCQlvZmZzZXRvZihzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlcXVlc3QsIHZhcmlhYmxlX2NhbGxlZCk7CisKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlcXVlc3QgKnJlcSA9IChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlcXVlc3QgKiltc2diLT5sMmg7CisJc3RydWN0IHNjY3Bfb3B0aW9uYWxfZGF0YSBvcHRpb25hbF9kYXRhOworCisJLyogaGVhZGVyIGNoZWNrICovCisJaWYgKG1zZ2JfbDJsZW4obXNnYikgPCBoZWFkZXJfc2l6ZSkgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAibXNnYiA8IGhlYWRlcl9zaXplICV1ICV1XG4iLAorCQkgICAgICAgIG1zZ2JfbDJsZW4obXNnYiksIGhlYWRlcl9zaXplKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIGNvcHkgb3V0IHRoZSBjYWxsaW5nIGFuZCBjYWxsZWQgYWRkcmVzcy4gQWRkIHRoZSBvZmZzZXQgKi8KKwlpZiAoY29weV9hZGRyZXNzKCZyZXN1bHQtPmNhbGxlZCwgY2FsbGVkX29mZnNldCArIHJlcS0+dmFyaWFibGVfY2FsbGVkLCBtc2diKSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoY2hlY2tfYWRkcmVzcygmcmVzdWx0LT5jYWxsZWQpICE9IDApIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIkludmFsaWQgY2FsbGVkIGFkZHJlc3MgYWNjb3JkaW5nIHRvIDA4LjA2OiAweCV4IDB4JXhcbiIsCisJCQkqKHVfaW50OF90ICopJnJlc3VsdC0+Y2FsbGVkLmFkZHJlc3MsIHJlc3VsdC0+Y2FsbGVkLnNzbik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXN1bHQtPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UgPSAmcmVxLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlOworCisJLyoKKwkgKiBwYXJzZSBvcHRpb25hbCBkYXRhLgorCSAqLworCW1lbXNldCgmb3B0aW9uYWxfZGF0YSwgMCwgc2l6ZW9mKG9wdGlvbmFsX2RhdGEpKTsKKwlpZiAoX3NjY3BfcGFyc2Vfb3B0aW9uYWxfZGF0YShvcHRpb25hbF9vZmZzZXQgKyByZXEtPm9wdGlvbmFsX3N0YXJ0LCBtc2diLCAmb3B0aW9uYWxfZGF0YSkgIT0gMCkgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAicGFyc2luZyBvZiBvcHRpb25hbCBkYXRhIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKG9wdGlvbmFsX2RhdGEuZGF0YV9sZW4gIT0gMCkgeworCQltc2diLT5sM2ggPSAmbXNnYi0+bDJoW29wdGlvbmFsX2RhdGEuZGF0YV9zdGFydF07CisJCXJlc3VsdC0+ZGF0YV9sZW4gPSBvcHRpb25hbF9kYXRhLmRhdGFfbGVuOworCX0gZWxzZSB7CisJCXJlc3VsdC0+ZGF0YV9sZW4gPSAwOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9yZWxlYXNlZChzdHJ1Y3QgbXNnYiAqbXNnYiwgc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0ICpyZXN1bHQpCit7CisJc3RhdGljIGludCBoZWFkZXJfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlbGVhc2VkKTsKKwlzdGF0aWMgaW50IG9wdGlvbmFsX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVsZWFzZWQsIG9wdGlvbmFsX3N0YXJ0KTsKKworCXN0cnVjdCBzY2NwX29wdGlvbmFsX2RhdGEgb3B0aW9uYWxfZGF0YTsKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlbGVhc2VkICpybHMgPSAoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWxlYXNlZCAqKSBtc2diLT5sMmg7CisKKwkvKiB3ZSBkb24ndCBoYXZlIGVub3VnaCBzaXplIGZvciB0aGUgc3RydWN0ICovCisJaWYgKG1zZ2JfbDJsZW4obXNnYikgPCBoZWFkZXJfc2l6ZSkgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAibXNnYiA+IGhlYWRlcl9zaXplICV1ICV1XG4iLAorCQkgICAgICAgIG1zZ2JfbDJsZW4obXNnYiksIGhlYWRlcl9zaXplKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW1lbXNldCgmb3B0aW9uYWxfZGF0YSwgMCwgc2l6ZW9mKG9wdGlvbmFsX2RhdGEpKTsKKwlpZiAoX3NjY3BfcGFyc2Vfb3B0aW9uYWxfZGF0YShvcHRpb25hbF9vZmZzZXQgKyBybHMtPm9wdGlvbmFsX3N0YXJ0LCBtc2diLCAmb3B0aW9uYWxfZGF0YSkgIT0gMCkgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAicGFyc2luZyBvZiBvcHRpb25hbCBkYXRhIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmVzdWx0LT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlID0gJnJscy0+c291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKwlyZXN1bHQtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSA9ICZybHMtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKworCWlmIChvcHRpb25hbF9kYXRhLmRhdGFfbGVuICE9IDApIHsKKwkJbXNnYi0+bDNoID0gJm1zZ2ItPmwyaFtvcHRpb25hbF9kYXRhLmRhdGFfc3RhcnRdOworCQlyZXN1bHQtPmRhdGFfbGVuID0gb3B0aW9uYWxfZGF0YS5kYXRhX2xlbjsKKwl9IGVsc2UgeworCQlyZXN1bHQtPmRhdGFfbGVuID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fcmVmdXNlZChzdHJ1Y3QgbXNnYiAqbXNnYiwgc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0ICpyZXN1bHQpCit7CisJc3RhdGljIGNvbnN0IHVfaW50MzJfdCBoZWFkZXJfc2l6ZSA9CisJCQlzaXplb2Yoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWZ1c2VkKTsKKwlzdGF0aWMgaW50IG9wdGlvbmFsX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVmdXNlZCwgb3B0aW9uYWxfc3RhcnQpOworCisJc3RydWN0IHNjY3Bfb3B0aW9uYWxfZGF0YSBvcHRpb25hbF9kYXRhOworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVmdXNlZCAqcmVmOworCisJLyogaGVhZGVyIGNoZWNrICovCisJaWYgKG1zZ2JfbDJsZW4obXNnYikgPCBoZWFkZXJfc2l6ZSkgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAibXNnYiA8IGhlYWRlcl9zaXplICV1ICV1XG4iLAorCQkgICAgICAgIG1zZ2JfbDJsZW4obXNnYiksIGhlYWRlcl9zaXplKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJlZiA9IChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlZnVzZWQgKikgbXNnYi0+bDJoOworCisJcmVzdWx0LT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UgPSAmcmVmLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisKKwltZW1zZXQoJm9wdGlvbmFsX2RhdGEsIDAsIHNpemVvZihvcHRpb25hbF9kYXRhKSk7CisJaWYgKF9zY2NwX3BhcnNlX29wdGlvbmFsX2RhdGEob3B0aW9uYWxfb2Zmc2V0ICsgcmVmLT5vcHRpb25hbF9zdGFydCwgbXNnYiwgJm9wdGlvbmFsX2RhdGEpICE9IDApIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgInBhcnNpbmcgb2Ygb3B0aW9uYWwgZGF0YSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIG9wdGlvbmFsIGRhdGEgKi8KKwlpZiAob3B0aW9uYWxfZGF0YS5kYXRhX2xlbiAhPSAwKSB7CisJCW1zZ2ItPmwzaCA9ICZtc2diLT5sMmhbb3B0aW9uYWxfZGF0YS5kYXRhX3N0YXJ0XTsKKwkJcmVzdWx0LT5kYXRhX2xlbiA9IG9wdGlvbmFsX2RhdGEuZGF0YV9sZW47CisJfSBlbHNlIHsKKwkJcmVzdWx0LT5kYXRhX2xlbiA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBfc2NjcF9wYXJzZV9jb25uZWN0aW9uX2NvbmZpcm0oc3RydWN0IG1zZ2IgKm1zZ2IsIHN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCAqcmVzdWx0KQoreworCXN0YXRpYyB1X2ludDMyX3QgaGVhZGVyX3NpemUgPQorCQkgICAgc2l6ZW9mKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fY29uZmlybSk7CisJc3RhdGljIGNvbnN0IHVfaW50MzJfdCBvcHRpb25hbF9vZmZzZXQgPQorCQkJb2Zmc2V0b2Yoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9jb25maXJtLCBvcHRpb25hbF9zdGFydCk7CisKKwlzdHJ1Y3Qgc2NjcF9vcHRpb25hbF9kYXRhIG9wdGlvbmFsX2RhdGE7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbl9jb25maXJtICpjb247CisKKwkvKiBoZWFkZXIgY2hlY2sgKi8KKwlpZiAobXNnYl9sMmxlbihtc2diKSA8IGhlYWRlcl9zaXplKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJtc2diIDwgaGVhZGVyX3NpemUgJXUgJXVcbiIsCisJCSAgICAgICAgbXNnYl9sMmxlbihtc2diKSwgaGVhZGVyX3NpemUpOworCQlyZXR1cm4gLTE7CisJfQorCisJY29uID0gKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fY29uZmlybSAqKSBtc2diLT5sMmg7CisJcmVzdWx0LT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UgPSAmY29uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisJcmVzdWx0LT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlID0gJmNvbi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKworCW1lbXNldCgmb3B0aW9uYWxfZGF0YSwgMCwgc2l6ZW9mKG9wdGlvbmFsX2RhdGEpKTsKKwlpZiAoX3NjY3BfcGFyc2Vfb3B0aW9uYWxfZGF0YShvcHRpb25hbF9vZmZzZXQgKyBjb24tPm9wdGlvbmFsX3N0YXJ0LCBtc2diLCAmb3B0aW9uYWxfZGF0YSkgIT0gMCkgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAicGFyc2luZyBvZiBvcHRpb25hbCBkYXRhIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKG9wdGlvbmFsX2RhdGEuZGF0YV9sZW4gIT0gMCkgeworCQltc2diLT5sM2ggPSAmbXNnYi0+bDJoW29wdGlvbmFsX2RhdGEuZGF0YV9zdGFydF07CisJCXJlc3VsdC0+ZGF0YV9sZW4gPSBvcHRpb25hbF9kYXRhLmRhdGFfbGVuOworCX0gZWxzZSB7CisJCXJlc3VsdC0+ZGF0YV9sZW4gPSAwOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9yZWxlYXNlX2NvbXBsZXRlKHN0cnVjdCBtc2diICptc2diLCBzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgKnJlc3VsdCkKK3sKKwlzdGF0aWMgaW50IGhlYWRlcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVsZWFzZV9jb21wbGV0ZSk7CisKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlbGVhc2VfY29tcGxldGUgKmNtcGw7CisKKwkvKiBoZWFkZXIgY2hlY2sgKi8KKwlpZiAobXNnYl9sMmxlbihtc2diKSA8IGhlYWRlcl9zaXplKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJtc2diIDwgaGVhZGVyX3NpemUgJXUgJXVcbiIsCisJCSAgICAgICAgbXNnYl9sMmxlbihtc2diKSwgaGVhZGVyX3NpemUpOworCQlyZXR1cm4gLTE7CisJfQorCisJY21wbCA9IChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlbGVhc2VfY29tcGxldGUgKikgbXNnYi0+bDJoOworCXJlc3VsdC0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSA9ICZjbXBsLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlOworCXJlc3VsdC0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlID0gJmNtcGwtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKworCXJldHVybiAwOworfQorCitpbnQgX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9kdDEoc3RydWN0IG1zZ2IgKm1zZ2IsIHN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCAqcmVzdWx0KQoreworCXN0YXRpYyBpbnQgaGVhZGVyX3NpemUgPSBzaXplb2Yoc3RydWN0IHNjY3BfZGF0YV9mb3JtMSk7CisJc3RhdGljIGludCB2YXJpYWJsZV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3Qgc2NjcF9kYXRhX2Zvcm0xLCB2YXJpYWJsZV9zdGFydCk7CisKKwlzdHJ1Y3Qgc2NjcF9kYXRhX2Zvcm0xICpkdDEgPSAoc3RydWN0IHNjY3BfZGF0YV9mb3JtMSAqKW1zZ2ItPmwyaDsKKworCS8qIHdlIGRvbid0IGhhdmUgZW5vdWdoIHNpemUgZm9yIHRoZSBzdHJ1Y3QgKi8KKwlpZiAobXNnYl9sMmxlbihtc2diKSA8IGhlYWRlcl9zaXplKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJtc2diID4gaGVhZGVyX3NpemUgJXUgJXVcbiIsCisJCSAgICAgICAgbXNnYl9sMmxlbihtc2diKSwgaGVhZGVyX3NpemUpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGR0MS0+c2VnbWVudGluZyAhPSAwKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJUaGlzIHBhY2tldCBoYXMgc2VnbWVudGluZywgbm90IHN1cHBvcnRlZDogJWRcbiIsIGR0MS0+c2VnbWVudGluZyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXN1bHQtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSA9ICZkdDEtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKworCS8qIHNvbWUgbW9yZSAgc2l6ZSBjaGVja3MgaW4gaGVyZSAqLworCWlmIChtc2diX2wybGVuKG1zZ2IpIDwgdmFyaWFibGVfb2Zmc2V0ICsgZHQxLT52YXJpYWJsZV9zdGFydCArIDEpIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIk5vdCBlbm91Z2ggc3BhY2UgZm9yIHZhcmlhYmxlIHN0YXJ0OiAldSAldVxuIiwKKwkJCW1zZ2JfbDJsZW4obXNnYiksIGR0MS0+dmFyaWFibGVfc3RhcnQpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmVzdWx0LT5kYXRhX2xlbiA9IG1zZ2ItPmwyaFt2YXJpYWJsZV9vZmZzZXQgKyBkdDEtPnZhcmlhYmxlX3N0YXJ0XTsKKwltc2diLT5sM2ggPSAmbXNnYi0+bDJoW2R0MS0+dmFyaWFibGVfc3RhcnQgKyB2YXJpYWJsZV9vZmZzZXQgKyAxXTsKKworCWlmIChtc2diX2wzbGVuKG1zZ2IpIDwgcmVzdWx0LT5kYXRhX2xlbikgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAiTm90IGVub3VnaCByb29tIGZvciB0aGUgcGF5bG9hZDogJXUgJXVcbiIsCisJCQltc2diX2wzbGVuKG1zZ2IpLCByZXN1bHQtPmRhdGFfbGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgX3NjY3BfcGFyc2VfdWR0KHN0cnVjdCBtc2diICptc2diLCBzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgKnJlc3VsdCkKK3sKKwlzdGF0aWMgY29uc3QgdV9pbnQzMl90IGhlYWRlcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBzY2NwX2RhdGFfdW5pdGRhdGEpOworCXN0YXRpYyBjb25zdCB1X2ludDMyX3QgY2FsbGVkX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBzY2NwX2RhdGFfdW5pdGRhdGEsIHZhcmlhYmxlX2NhbGxlZCk7CisJc3RhdGljIGNvbnN0IHVfaW50MzJfdCBjYWxsaW5nX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBzY2NwX2RhdGFfdW5pdGRhdGEsIHZhcmlhYmxlX2NhbGxpbmcpOworCXN0YXRpYyBjb25zdCB1X2ludDMyX3QgZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3Qgc2NjcF9kYXRhX3VuaXRkYXRhLCB2YXJpYWJsZV9kYXRhKTsKKworCXN0cnVjdCBzY2NwX2RhdGFfdW5pdGRhdGEgKnVkdCA9IChzdHJ1Y3Qgc2NjcF9kYXRhX3VuaXRkYXRhICopbXNnYi0+bDJoOworCisJaWYgKG1zZ2JfbDJsZW4obXNnYikgPCBoZWFkZXJfc2l6ZSkgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAibXNnYiA8IGhlYWRlcl9zaXplICV1ICV1XG4iLAorCQkgICAgICAgIG1zZ2JfbDJsZW4obXNnYiksIGhlYWRlcl9zaXplKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIGNvcHkgb3V0IHRoZSBjYWxsaW5nIGFuZCBjYWxsZWQgYWRkcmVzcy4gQWRkIHRoZSBvZmYgKi8KKwlpZiAoY29weV9hZGRyZXNzKCZyZXN1bHQtPmNhbGxlZCwgY2FsbGVkX29mZnNldCArIHVkdC0+dmFyaWFibGVfY2FsbGVkLCBtc2diKSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoY2hlY2tfYWRkcmVzcygmcmVzdWx0LT5jYWxsZWQpICE9IDApIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIkludmFsaWQgY2FsbGVkIGFkZHJlc3MgYWNjb3JkaW5nIHRvIDA4LjA2OiAweCV4IDB4JXhcbiIsCisJCQkqKHVfaW50OF90ICopJnJlc3VsdC0+Y2FsbGVkLmFkZHJlc3MsIHJlc3VsdC0+Y2FsbGVkLnNzbik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoY29weV9hZGRyZXNzKCZyZXN1bHQtPmNhbGxpbmcsIGNhbGxpbmdfb2Zmc2V0ICsgdWR0LT52YXJpYWJsZV9jYWxsaW5nLCBtc2diKSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoY2hlY2tfYWRkcmVzcygmcmVzdWx0LT5jYWxsaW5nKSAhPSAwKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJJbnZhbGlkIGNhbGxlZCBhZGRyZXNzIGFjY29yZGluZyB0byAwOC4wNjogMHgleCAweCV4XG4iLAorCQkJKih1X2ludDhfdCAqKSZyZXN1bHQtPmNhbGxlZC5hZGRyZXNzLCByZXN1bHQtPmNhbGxlZC5zc24pOworCX0KKworCS8qIHdlIGRvbid0IGhhdmUgZW5vdWdoIHNpemUgZm9yIHRoZSBkYXRhICovCisJaWYgKG1zZ2JfbDJsZW4obXNnYikgPCBkYXRhX29mZnNldCArIHVkdC0+dmFyaWFibGVfZGF0YSArIDEpIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIm1zZ2IgPCBoZWFkZXIgKyBvZmZzZXQgJXUgJXUgJXVcbiIsCisJCQltc2diX2wybGVuKG1zZ2IpLCBoZWFkZXJfc2l6ZSwgdWR0LT52YXJpYWJsZV9kYXRhKTsKKwkJcmV0dXJuIC0xOworCX0KKworCisJbXNnYi0+bDNoID0gJnVkdC0+ZGF0YVt1ZHQtPnZhcmlhYmxlX2RhdGFdOworCXJlc3VsdC0+ZGF0YV9sZW4gPSBtc2diX2wzbGVuKG1zZ2IpOworCisJaWYgKG1zZ2JfbDNsZW4obXNnYikgIT0gIG1zZ2ItPmwzaFstMV0pIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIm1zZ2IgaXMgdHJ1bmNhdGVkIGlzOiAldSBzaG91bGQ6ICV1XG4iLAorCQkJbXNnYl9sM2xlbihtc2diKSwgbXNnYi0+bDNoWy0xXSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfc2NjcF9wYXJzZV9pdChzdHJ1Y3QgbXNnYiAqbXNnYiwgc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0ICpyZXN1bHQpCit7CisJc3RhdGljIGNvbnN0IHVfaW50MzJfdCBoZWFkZXJfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2NjcF9kYXRhX2l0KTsKKworCXN0cnVjdCBzY2NwX2RhdGFfaXQgKml0OworCisJaWYgKG1zZ2JfbDJsZW4obXNnYikgPCBoZWFkZXJfc2l6ZSkgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAibXNnYiA8IGhlYWRlcl9zaXplICV1ICV1XG4iLAorCQkgICAgICAgIG1zZ2JfbDJsZW4obXNnYiksIGhlYWRlcl9zaXplKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWl0ID0gKHN0cnVjdCBzY2NwX2RhdGFfaXQgKikgbXNnYi0+bDJoOworCXJlc3VsdC0+ZGF0YV9sZW4gPSAwOworCXJlc3VsdC0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSA9ICZpdC0+c291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKwlyZXN1bHQtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSA9ICZpdC0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9zY2NwX3BhcnNlX2VycihzdHJ1Y3QgbXNnYiAqbXNnYiwgc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0ICpyZXN1bHQpCit7CisJc3RhdGljIGNvbnN0IHVfaW50MzJfdCBoZWFkZXJfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2NjcF9wcm90b19lcnIpOworCisJc3RydWN0IHNjY3BfcHJvdG9fZXJyICplcnI7CisKKwlpZiAobXNnYl9sMmxlbihtc2diKSA8IGhlYWRlcl9zaXplKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJtc2diIDwgaGVhZGVyX3NpemUgJXUgJXVcbiIsCisJCSAgICAgbXNnYl9sMmxlbihtc2diKSwgaGVhZGVyX3NpemUpOworCQlyZXR1cm4gLTE7CisJfQorCisJZXJyID0gKHN0cnVjdCBzY2NwX3Byb3RvX2VyciAqKSBtc2diLT5sMmg7CisJcmVzdWx0LT5kYXRhX2xlbiA9IDA7CisJcmVzdWx0LT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UgPSAmZXJyLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZW5kIFVEVC4gQ3VycmVudGx5IHdlIGhhdmUgYSBmaXhlZCBhZGRyZXNzLi4uCisgKi8KK3N0YXRpYyBpbnQgX3NjY3Bfc2VuZF9kYXRhKGludCBjbGFzcywgY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3AgKmluLAorCQkJICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3AgKm91dCwgc3RydWN0IG1zZ2IgKnBheWxvYWQpCit7CisJc3RydWN0IHNjY3BfZGF0YV91bml0ZGF0YSAqdWR0OworCXVfaW50OF90ICpkYXRhOworCisJaWYgKG1zZ2JfbDNsZW4ocGF5bG9hZCkgPiAyNTYpIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIlRoZSBwYXlsb2FkIGlzIHRvbyBiaWcgZm9yIG9uZSB1ZHRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2NfaGVhZHJvb20oU0NDUF9NU0dfU0laRSwKKwkJCQkJICAgICAgIFNDQ1BfTVNHX0hFQURST09NLCAic2NjcDogdWR0Iik7CisJbXNnLT5sMmggPSAmbXNnLT5kYXRhWzBdOworCXVkdCA9IChzdHJ1Y3Qgc2NjcF9kYXRhX3VuaXRkYXRhICopbXNnYl9wdXQobXNnLCBzaXplb2YoKnVkdCkpOworCisJdWR0LT50eXBlID0gU0NDUF9NU0dfVFlQRV9VRFQ7CisJdWR0LT5wcm90b19jbGFzcyA9IGNsYXNzOworCXVkdC0+dmFyaWFibGVfY2FsbGVkID0gMzsKKwl1ZHQtPnZhcmlhYmxlX2NhbGxpbmcgPSA1OworCXVkdC0+dmFyaWFibGVfZGF0YSA9IDc7CisKKwkvKiBmb3IgdmFyaWFibGUgZGF0YSB3ZSBzdGFydCB3aXRoIGEgc2l6ZSBhbmQgdGhlIGRhdGEgKi8KKwlkYXRhID0gbXNnYl9wdXQobXNnLCAxICsgMik7CisJZGF0YVswXSA9IDI7CisJZGF0YVsxXSA9IDB4NDI7CisJZGF0YVsyXSA9IG91dC0+c2NjcF9zc247CisKKwlkYXRhID0gbXNnYl9wdXQobXNnLCAxICsgMik7CisJZGF0YVswXSA9IDI7CisJZGF0YVsxXSA9IDB4NDI7CisJZGF0YVsyXSA9IGluLT5zY2NwX3NzbjsKKworCS8qIGNvcHkgdGhlIHBheWxvYWQgKi8KKwlkYXRhID0gbXNnYl9wdXQobXNnLCAxICsgbXNnYl9sM2xlbihwYXlsb2FkKSk7CisJZGF0YVswXSA9IG1zZ2JfbDNsZW4ocGF5bG9hZCk7CisJbWVtY3B5KCZkYXRhWzFdLCBwYXlsb2FkLT5sM2gsIG1zZ2JfbDNsZW4ocGF5bG9hZCkpOworCisJX3NlbmRfbXNnKG1zZyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX3NjY3BfaGFuZGxlX3JlYWQoc3RydWN0IG1zZ2IgKm1zZ2IpCit7CisJc3RydWN0IHNjY3BfZGF0YV9jYWxsYmFjayAqY2I7CisJc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0IHJlc3VsdDsKKworCWlmIChfc2NjcF9wYXJzZV91ZHQobXNnYiwgJnJlc3VsdCkgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJY2IgPSBfZmluZF9zc24ocmVzdWx0LmNhbGxlZC5zc24pOworCWlmICghY2IgfHwgIWNiLT5yZWFkX2NiKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJObyByb3V0aW5nIGZvciBVRFQgZm9yIGNhbGxlZCBTU046ICV1XG4iLCByZXN1bHQuY2FsbGVkLnNzbik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBzYW5pdHkgY2hlY2sgKi8KKwlyZXR1cm4gY2ItPnJlYWRfY2IobXNnYiwgbXNnYl9sM2xlbihtc2diKSwgY2ItPnJlYWRfY29udGV4dCk7Cit9CisKKy8qCisgKiBoYW5kbGUgY29ubmVjdGlvbiBvcmllbnRhdGVkIG1ldGhvZHMKKyAqLworc3RhdGljIGludCBzb3VyY2VfbG9jYWxfcmVmZXJlbmNlX2lzX2ZyZWUoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSAqcmVmZXJlbmNlKQoreworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0aW9uLCAmc2NjcF9jb25uZWN0aW9ucywgbGlzdCkgeworCQlpZiAobWVtY21wKHJlZmVyZW5jZSwgJmNvbm5lY3Rpb24tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsIHNpemVvZigqcmVmZXJlbmNlKSkgPT0gMCkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2VfaXNfZnJlZShzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlICpyZWZlcmVuY2UpCit7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3Rpb24sICZzY2NwX2Nvbm5lY3Rpb25zLCBsaXN0KSB7CisJCWlmIChtZW1jbXAocmVmZXJlbmNlLCAmY29ubmVjdGlvbi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLCBzaXplb2YoKnJlZmVyZW5jZSkpID09IDApCisJCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXNzaWduX3NvdXJjZV9sb2NhbF9yZWZlcmVuY2Uoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlzdGF0aWMgdV9pbnQzMl90IGxhc3RfcmVmID0gMHgzMDAwMDsKKwlpbnQgd3JhcHBlZCA9IDA7CisKKwlkbyB7CisJCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgcmVmZXJlbmNlOworCQlyZWZlcmVuY2Uub2N0ZXQxID0gKGxhc3RfcmVmID4+ICAwKSAmIDB4ZmY7CisJCXJlZmVyZW5jZS5vY3RldDIgPSAobGFzdF9yZWYgPj4gIDgpICYgMHhmZjsKKwkJcmVmZXJlbmNlLm9jdGV0MyA9IChsYXN0X3JlZiA+PiAxNikgJiAweGZmOworCisJCSsrbGFzdF9yZWY7CisJCS8qIGRvIG5vdCB1c2UgdGhlIHJldmVyc2VkIHdvcmQgYW5kIHdyYXAgYXJvdW5kICovCisJCWlmICgobGFzdF9yZWYgJiAweDAwRkZGRkZGKSA9PSAweDAwRkZGRkZGKSB7CisJCQlMT0dQKERTQ0NQLCBMT0dMX0RFQlVHLCAiV3JhcHBlZCBzZWFyY2hpbmcgZm9yIGEgZnJlZSBjb2RlXG4iKTsKKwkJCWxhc3RfcmVmID0gMDsKKwkJCSsrd3JhcHBlZDsKKwkJfQorCisJCWlmIChzb3VyY2VfbG9jYWxfcmVmZXJlbmNlX2lzX2ZyZWUoJnJlZmVyZW5jZSkgPT0gMCkgeworCQkJY29ubmVjdGlvbi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSA9IHJlZmVyZW5jZTsKKwkJCXJldHVybiAwOworCQl9CisJfSB3aGlsZSAod3JhcHBlZCAhPSAyKTsKKworCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJGaW5kaW5nIGEgZnJlZSByZWZlcmVuY2UgZmFpbGVkXG4iKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIF9zY2NwX3NldF9jb25uZWN0aW9uX3N0YXRlKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIGludCBuZXdfc3RhdGUpCit7CisJaW50IG9sZF9zdGF0ZSA9IGNvbm5lY3Rpb24tPmNvbm5lY3Rpb25fc3RhdGU7CisKKwljb25uZWN0aW9uLT5jb25uZWN0aW9uX3N0YXRlID0gbmV3X3N0YXRlOworCWlmIChjb25uZWN0aW9uLT5zdGF0ZV9jYikKKwkJY29ubmVjdGlvbi0+c3RhdGVfY2IoY29ubmVjdGlvbiwgb2xkX3N0YXRlKTsKK30KKworc3RhdGljIGludCBfc2NjcF9zZW5kX3JlZnVzZShzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlICpzcmNfcmVmLCBpbnQgY2F1c2UpCit7CisJc3RydWN0IG1zZ2IgKm1zZ2I7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWZ1c2VkICpyZWY7CisJdV9pbnQ4X3QgKmRhdGE7CisKKwltc2diID0gbXNnYl9hbGxvY19oZWFkcm9vbShTQ0NQX01TR19TSVpFLAorCQkJCSAgIFNDQ1BfTVNHX0hFQURST09NLCAic2NjcCByZWYiKTsKKwltc2diLT5sMmggPSAmbXNnYi0+ZGF0YVswXTsKKworCXJlZiA9IChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlZnVzZWQgKikgbXNnYl9wdXQobXNnYiwgc2l6ZW9mKCpyZWYpKTsKKwlyZWYtPnR5cGUgPSBTQ0NQX01TR19UWVBFX0NSRUY7CisJbWVtY3B5KCZyZWYtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwgc3JjX3JlZiwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UpKTsKKwlyZWYtPmNhdXNlID0gY2F1c2U7CisJcmVmLT5vcHRpb25hbF9zdGFydCA9IDE7CisKKwlkYXRhID0gbXNnYl9wdXQobXNnYiwgMSk7CisJZGF0YVswXSA9IFNDQ1BfUE5DX0VORF9PRl9PUFRJT05BTDsKKworCV9zZW5kX21zZyhtc2diKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfc2NjcF9zZW5kX2Nvbm5lY3Rpb25fY29uZmlybShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCXN0cnVjdCBtc2diICpyZXNwb25zZTsKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX2NvbmZpcm0gKmNvbmZpcm07CisJdV9pbnQ4X3QgKm9wdGlvbmFsX2RhdGE7CisKKwlpZiAoYXNzaWduX3NvdXJjZV9sb2NhbF9yZWZlcmVuY2UoY29ubmVjdGlvbikgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJcmVzcG9uc2UgPSBtc2diX2FsbG9jX2hlYWRyb29tKFNDQ1BfTVNHX1NJWkUsCisJCQkJICAgICAgIFNDQ1BfTVNHX0hFQURST09NLCAic2NjcCBjb25maXJtIik7CisJcmVzcG9uc2UtPmwyaCA9ICZyZXNwb25zZS0+ZGF0YVswXTsKKworCWNvbmZpcm0gPSAoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9jb25maXJtICopIG1zZ2JfcHV0KHJlc3BvbnNlLCBzaXplb2YoKmNvbmZpcm0pKTsKKworCWNvbmZpcm0tPnR5cGUgPSBTQ0NQX01TR19UWVBFX0NDOworCW1lbWNweSgmY29uZmlybS0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCSAgICAgICAmY29ubmVjdGlvbi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCSAgICAgICBzaXplb2YoY29ubmVjdGlvbi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlKSk7CisJbWVtY3B5KCZjb25maXJtLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLAorCSAgICAgICAmY29ubmVjdGlvbi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkgICAgICAgc2l6ZW9mKGNvbm5lY3Rpb24tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UpKTsKKwljb25maXJtLT5wcm90b19jbGFzcyA9IDI7CisJY29uZmlybS0+b3B0aW9uYWxfc3RhcnQgPSAxOworCisJb3B0aW9uYWxfZGF0YSA9ICh1X2ludDhfdCAqKSBtc2diX3B1dChyZXNwb25zZSwgMSk7CisJb3B0aW9uYWxfZGF0YVswXSA9IFNDQ1BfUE5DX0VORF9PRl9PUFRJT05BTDsKKworCV9zZW5kX21zZyhyZXNwb25zZSk7CisJX3NjY3Bfc2V0X2Nvbm5lY3Rpb25fc3RhdGUoY29ubmVjdGlvbiwgU0NDUF9DT05ORUNUSU9OX1NUQVRFX0VTVEFCTElTSEVEKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfc2NjcF9zZW5kX2Nvbm5lY3Rpb25fcmVxdWVzdChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCQkgY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3AgKmNhbGxlZCwgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgbXNnYiAqcmVxdWVzdDsKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlcXVlc3QgKnJlcTsKKwl1X2ludDhfdCAqZGF0YTsKKwl1X2ludDhfdCBleHRyYV9zaXplID0gMyArIDE7CisKKworCWlmIChtc2cgJiYgKG1zZ2JfbDNsZW4obXNnKSA8IDMgfHwgbXNnYl9sM2xlbihtc2cpID4gMTMwKSkgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAiSW52YWxpZCBhbW91bnQgb2YgZGF0YS4uLiAlZFxuIiwgbXNnYl9sM2xlbihtc2cpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIHRyeSB0byBmaW5kIGEgaWQgKi8KKwlpZiAoYXNzaWduX3NvdXJjZV9sb2NhbF9yZWZlcmVuY2UoY29ubmVjdGlvbikgIT0gMCkgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAiQXNzaWduaW5nIGEgbG9jYWwgcmVmZXJlbmNlIGZhaWxlZC5cbiIpOworCQlfc2NjcF9zZXRfY29ubmVjdGlvbl9zdGF0ZShjb25uZWN0aW9uLCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfU0VUVVBfRVJST1IpOworCQlyZXR1cm4gLTE7CisJfQorCisKKwlpZiAobXNnKQorCQlleHRyYV9zaXplICs9IDIgKyBtc2diX2wzbGVuKG1zZyk7CisJcmVxdWVzdCA9IG1zZ2JfYWxsb2NfaGVhZHJvb20oU0NDUF9NU0dfU0laRSwKKwkJCQkgICAgICBTQ0NQX01TR19IRUFEUk9PTSwgInNjY3AgY29ubmVjdGlvbiByZXF1ZXN0Iik7CisJcmVxdWVzdC0+bDJoID0gJnJlcXVlc3QtPmRhdGFbMF07CisJcmVxID0gKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVxdWVzdCAqKSBtc2diX3B1dChyZXF1ZXN0LCBzaXplb2YoKnJlcSkpOworCisJcmVxLT50eXBlID0gU0NDUF9NU0dfVFlQRV9DUjsKKwltZW1jcHkoJnJlcS0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwgJmNvbm5lY3Rpb24tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsCisJICAgICAgIHNpemVvZihjb25uZWN0aW9uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlKSk7CisJcmVxLT5wcm90b19jbGFzcyA9IDI7CisJcmVxLT52YXJpYWJsZV9jYWxsZWQgPSAyOworCXJlcS0+b3B0aW9uYWxfc3RhcnQgPSA0OworCisJLyogd3JpdGUgdGhlIGNhbGxlZCBwYXJ0eSBhZGRyZXNzICovCisJZGF0YSA9IG1zZ2JfcHV0KHJlcXVlc3QsIDEgKyAyKTsKKwlkYXRhWzBdID0gMjsKKwlkYXRhWzFdID0gMHg0MjsKKwlkYXRhWzJdID0gY2FsbGVkLT5zY2NwX3NzbjsKKworCS8qIHdyaXRlIHRoZSBwYXlsb2FkICovCisJaWYgKG1zZykgeworCSAgICBkYXRhID0gbXNnYl9wdXQocmVxdWVzdCwgMiArIG1zZ2JfbDNsZW4obXNnKSk7CisJICAgIGRhdGFbMF0gPSBTQ0NQX1BOQ19EQVRBOworCSAgICBkYXRhWzFdID0gbXNnYl9sM2xlbihtc2cpOworCSAgICBtZW1jcHkoJmRhdGFbMl0sIG1zZy0+bDNoLCBtc2diX2wzbGVuKG1zZykpOworCX0KKworCWRhdGEgPSBtc2diX3B1dChyZXF1ZXN0LCAxKTsKKwlkYXRhWzBdID0gU0NDUF9QTkNfRU5EX09GX09QVElPTkFMOworCisJbGxpc3RfYWRkX3RhaWwoJmNvbm5lY3Rpb24tPmxpc3QsICZzY2NwX2Nvbm5lY3Rpb25zKTsKKwlfc2NjcF9zZXRfY29ubmVjdGlvbl9zdGF0ZShjb25uZWN0aW9uLCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVRVUVTVCk7CisKKwlfc2VuZF9tc2cocmVxdWVzdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX3NjY3Bfc2VuZF9jb25uZWN0aW9uX2RhdGEoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubiwgc3RydWN0IG1zZ2IgKl9kYXRhKQoreworCXN0cnVjdCBtc2diICptc2diOworCXN0cnVjdCBzY2NwX2RhdGFfZm9ybTEgKmR0MTsKKwl1X2ludDhfdCAqZGF0YTsKKwlpbnQgZXh0cmFfc2l6ZTsKKworCWlmIChtc2diX2wzbGVuKF9kYXRhKSA8IDIgfHwgbXNnYl9sM2xlbihfZGF0YSkgPiAyNTYpIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgImRhdGEgc2l6ZSB0b28gYmlnLCBzZWdtZW50aW5nIHVuaW1wbGVtZW50ZWQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWV4dHJhX3NpemUgPSAxICsgbXNnYl9sM2xlbihfZGF0YSk7CisJbXNnYiA9IG1zZ2JfYWxsb2NfaGVhZHJvb20oU0NDUF9NU0dfU0laRSwKKwkJCQkgICBTQ0NQX01TR19IRUFEUk9PTSwgInNjY3AgZHQxIik7CisJbXNnYi0+bDJoID0gJm1zZ2ItPmRhdGFbMF07CisKKwlkdDEgPSAoc3RydWN0IHNjY3BfZGF0YV9mb3JtMSAqKSBtc2diX3B1dChtc2diLCBzaXplb2YoKmR0MSkpOworCWR0MS0+dHlwZSA9IFNDQ1BfTVNHX1RZUEVfRFQxOworCW1lbWNweSgmZHQxLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsICZjb25uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsCisJICAgICAgIHNpemVvZihzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlKSk7CisJZHQxLT5zZWdtZW50aW5nID0gMDsKKworCS8qIGNvcHkgdGhlIGRhdGEgKi8KKwlkdDEtPnZhcmlhYmxlX3N0YXJ0ID0gMTsKKwlkYXRhID0gbXNnYl9wdXQobXNnYiwgZXh0cmFfc2l6ZSk7CisJZGF0YVswXSA9IGV4dHJhX3NpemUgLSAxOworCW1lbWNweSgmZGF0YVsxXSwgX2RhdGEtPmwzaCwgZXh0cmFfc2l6ZSAtIDEpOworCisJX3NlbmRfbXNnKG1zZ2IpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9zY2NwX3NlbmRfY29ubmVjdGlvbl9pdChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uKQoreworCXN0cnVjdCBtc2diICptc2diOworCXN0cnVjdCBzY2NwX2RhdGFfaXQgKml0OworCisJbXNnYiA9IG1zZ2JfYWxsb2NfaGVhZHJvb20oU0NDUF9NU0dfU0laRSwKKwkJCQkgICBTQ0NQX01TR19IRUFEUk9PTSwgInNjY3AgaXQiKTsKKwltc2diLT5sMmggPSAmbXNnYi0+ZGF0YVswXTsKKwlpdCA9IChzdHJ1Y3Qgc2NjcF9kYXRhX2l0ICopIG1zZ2JfcHV0KG1zZ2IsIHNpemVvZigqaXQpKTsKKwlpdC0+dHlwZSA9IFNDQ1BfTVNHX1RZUEVfSVQ7CisJbWVtY3B5KCZpdC0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLCAmY29ubi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCQlzaXplb2Yoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSkpOworCW1lbWNweSgmaXQtPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsICZjb25uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLAorCQlzaXplb2Yoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSkpOworCisJaXQtPnByb3RvX2NsYXNzID0gMHgyOworCWl0LT5zZXF1ZW5jaW5nWzBdID0gaXQtPnNlcXVlbmNpbmdbMV0gPSAwOworCWl0LT5jcmVkaXQgPSAwOworCisJX3NlbmRfbXNnKG1zZ2IpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9zY2NwX3NlbmRfY29ubmVjdGlvbl9yZWxlYXNlZChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uLCBpbnQgY2F1c2UpCit7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlbGVhc2VkICpyZWw7CisJdV9pbnQ4X3QgKmRhdGE7CisKKwltc2cgPSBtc2diX2FsbG9jX2hlYWRyb29tKFNDQ1BfTVNHX1NJWkUsIFNDQ1BfTVNHX0hFQURST09NLAorCQkJCSAgInNjY3A6IGNvbm5lY3Rpb24gcmVsZWFzZWQiKTsKKwltc2ctPmwyaCA9ICZtc2ctPmRhdGFbMF07CisJcmVsID0gKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVsZWFzZWQgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKnJlbCkpOworCXJlbC0+dHlwZSA9IFNDQ1BfTVNHX1RZUEVfUkxTRDsKKwlyZWwtPnJlbGVhc2VfY2F1c2UgPSBjYXVzZTsKKworCS8qIGNvcHkgdGhlIHNvdXJjZSByZWZlcmVuY2VzICovCisJbWVtY3B5KCZyZWwtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwgJmNvbm4tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UpKTsKKwltZW1jcHkoJnJlbC0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwgJmNvbm4tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsCisJICAgICAgIHNpemVvZihzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlKSk7CisKKwlkYXRhID0gbXNnYl9wdXQobXNnLCAxKTsKKwlkYXRhWzBdID0gU0NDUF9QTkNfRU5EX09GX09QVElPTkFMOworCisJX3NjY3Bfc2V0X2Nvbm5lY3Rpb25fc3RhdGUoY29ubiwgU0NDUF9DT05ORUNUSU9OX1NUQVRFX1JFTEVBU0UpOworCV9zZW5kX21zZyhtc2cpOworCXJldHVybiAwOworfQorCisvKgorICogT3BlbiBhIGNvbm5lY3Rpb24uIFRoZSBmb2xsb3dpbmcgaXMgZ29pbmcgdG8gaGFwcGVuOgorICoKKyAqCS0gVmVyaWZ5IHRoZSBwYWNrZXQsIGUuZy4gdGhhdCB3ZSBoYXZlIG5vIG90aGVyIGNvbm5lY3Rpb24KKyAqCSAgdGhhdCBpZC4KKyAqICAgICAgLSBBc2sgdGhlIHVzZXIgaWYgaGUgd2FudHMgdG8gYWNjZXB0IHRoZSBjb25uZWN0aW9uCisgKiAgICAgIC0gVHJ5IHRvIG9wZW4gdGhlIGNvbm5lY3Rpb24gYnkgYXNzaWduaW5nIGEgc291cmNlIGxvY2FsIHJlZmVyZW5jZQorICogICAgICAgIGFuZCBzZW5kaW5nIHRoZSBwYWNrZXQKKyAqLworc3RhdGljIGludCBfc2NjcF9oYW5kbGVfY29ubmVjdGlvbl9yZXF1ZXN0KHN0cnVjdCBtc2diICptc2diKQoreworCXN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCByZXN1bHQ7CisKKwlzdHJ1Y3Qgc2NjcF9kYXRhX2NhbGxiYWNrICpjYjsKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uOworCisJaWYgKF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fcmVxdWVzdChtc2diLCAmcmVzdWx0KSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwljYiA9IF9maW5kX3NzbihyZXN1bHQuY2FsbGVkLnNzbik7CisJaWYgKCFjYiB8fCAhY2ItPmFjY2VwdF9jYikgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAiTm8gcm91dGluZyBmb3IgQ1IgZm9yIGNhbGxlZCBTU046ICV1XG4iLCByZXN1bHQuY2FsbGVkLnNzbik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBjaGVjayBpZiB0aGUgc3lzdGVtIHdhbnRzIHRoaXMgY29ubmVjdGlvbiAqLworCWNvbm5lY3Rpb24gPSB0YWxsb2NfemVybyh0YWxsX3NjY3BfY3R4LCBzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uKTsKKwlpZiAoIWNvbm5lY3Rpb24pIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIkFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qCisJICogc2FuaXR5IGNoZWNrczoKKwkgKgktIElzIHRoZSBzb3VyY2VfbG9jYWxfcmVmZXJlbmNlIGluIGFueSBvdGhlciBjb25uZWN0aW9uPworCSAqIHRoZW4gd2lsbCBjYWxsIGFjY2VwdCwgYXNzaWduIGEgImRlc3RpbmF0aW9uIiBsb2NhbCByZWZlcmVuY2UKKwkgKiBhbmQgc2VuZCBhIGNvbm5lY3Rpb24gY29uZmlybSwgb3RoZXJ3aXNlIHdlIHdpbGwgc2VuZCBhIHJlZnVzZWVkCisJICogb25lLi4uLgorCSAqLworCWlmIChkZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2VfaXNfZnJlZShyZXN1bHQuc291cmNlX2xvY2FsX3JlZmVyZW5jZSkgIT0gMCkgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAiTmVlZCB0byByZWplY3QgY29ubmVjdGlvbiB3aXRoIGV4aXN0aW5nIHJlZmVyZW5jZVxuIik7CisJCV9zY2NwX3NlbmRfcmVmdXNlKHJlc3VsdC5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLCBTQ0NQX1JFRlVTQUxfU0NDUF9GQUlMVVJFKTsKKwkJdGFsbG9jX2ZyZWUoY29ubmVjdGlvbik7CisJCXJldHVybiAtMTsKKwl9CisKKwljb25uZWN0aW9uLT5pbmNvbWluZyA9IDE7CisJY29ubmVjdGlvbi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlID0gKnJlc3VsdC5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlOworCisJaWYgKGNiLT5hY2NlcHRfY2IoY29ubmVjdGlvbiwgY2ItPmFjY2VwdF9jb250ZXh0KSAhPSAwKSB7CisJCV9zY2NwX3NlbmRfcmVmdXNlKHJlc3VsdC5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLCBTQ0NQX1JFRlVTQUxfRU5EX1VTRVJfT1JJR0lOQVRFRCk7CisJCV9zY2NwX3NldF9jb25uZWN0aW9uX3N0YXRlKGNvbm5lY3Rpb24sIFNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUZVU0VEKTsKKwkJdGFsbG9jX2ZyZWUoY29ubmVjdGlvbik7CisJCXJldHVybiAwOworCX0KKworCisJbGxpc3RfYWRkX3RhaWwoJmNvbm5lY3Rpb24tPmxpc3QsICZzY2NwX2Nvbm5lY3Rpb25zKTsKKworCWlmIChfc2NjcF9zZW5kX2Nvbm5lY3Rpb25fY29uZmlybShjb25uZWN0aW9uKSAhPSAwKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJTZW5kaW5nIGNvbmZpcm0gZmFpbGVkLi4uIG5vIGF2YWlsYWJsZSBzb3VyY2UgcmVmZXJlbmNlP1xuIik7CisKKwkJX3NjY3Bfc2VuZF9yZWZ1c2UocmVzdWx0LnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsIFNDQ1BfUkVGVVNBTF9TQ0NQX0ZBSUxVUkUpOworCQlfc2NjcF9zZXRfY29ubmVjdGlvbl9zdGF0ZShjb25uZWN0aW9uLCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVGVVNFRCk7CisJCWxsaXN0X2RlbCgmY29ubmVjdGlvbi0+bGlzdCk7CisJCXRhbGxvY19mcmVlKGNvbm5lY3Rpb24pOworCisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIElmIHdlIGhhdmUgZGF0YSBsZXQgdXMgZm9yd2FyZCB0aGluZ3MuCisJICovCisJaWYgKHJlc3VsdC5kYXRhX2xlbiAhPSAwICYmIGNvbm5lY3Rpb24tPmRhdGFfY2IpIHsKKwkJY29ubmVjdGlvbi0+ZGF0YV9jYihjb25uZWN0aW9uLCBtc2diLCByZXN1bHQuZGF0YV9sZW4pOworCX0KKworCXJldHVybiAwOworfQorCisvKiBIYW5kbGUgdGhlIHJlbGVhc2UgY29uZmlybWVkICovCitzdGF0aWMgaW50IF9zY2NwX2hhbmRsZV9jb25uZWN0aW9uX3JlbGVhc2VfY29tcGxldGUoc3RydWN0IG1zZ2IgKm1zZ2IpCit7CisJc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0IHJlc3VsdDsKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uOworCisJaWYgKF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fcmVsZWFzZV9jb21wbGV0ZShtc2diLCAmcmVzdWx0KSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwkvKiBmaW5kIHRoZSBjb25uZWN0aW9uICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoY29ubiwgJnNjY3BfY29ubmVjdGlvbnMsIGxpc3QpIHsKKwkJaWYgKGNvbm4tPmRhdGFfY2IKKwkJICAgICYmIG1lbWNtcCgmY29ubi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkJCSAgICAgIHJlc3VsdC5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsCisJCQkgICAgICBzaXplb2YoY29ubi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSkpID09IDAKKwkJICAgICYmIG1lbWNtcCgmY29ubi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCQkJICAgICAgcmVzdWx0LnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsCisJCQkgICAgICBzaXplb2YoY29ubi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlKSkgPT0gMCkgeworCQkgICAgZ290byBmb3VuZDsKKwkJfQorCX0KKworCisJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIlJlbGVhc2UgY29tcGxldGUgb2YgdW5rbm93biBjb25uZWN0aW9uXG4iKTsKKwlyZXR1cm4gLTE7CisKK2ZvdW5kOgorCWxsaXN0X2RlbCgmY29ubi0+bGlzdCk7CisJX3NjY3Bfc2V0X2Nvbm5lY3Rpb25fc3RhdGUoY29ubiwgU0NDUF9DT05ORUNUSU9OX1NUQVRFX1JFTEVBU0VfQ09NUExFVEUpOworCXJldHVybiAwOworfQorCisvKiBIYW5kbGUgdGhlIERhdGEgRm9ybSAxIG1lc3NhZ2UgKi8KK3N0YXRpYyBpbnQgX3NjY3BfaGFuZGxlX2Nvbm5lY3Rpb25fZHQxKHN0cnVjdCBtc2diICptc2diKQoreworCXN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCByZXN1bHQ7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubjsKKworCWlmIChfc2NjcF9wYXJzZV9jb25uZWN0aW9uX2R0MShtc2diLCAmcmVzdWx0KSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwkvKiBsb29rdXAgaWYgd2UgaGF2ZSBhIGNvbm5lY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gcmVmZXJlbmNlICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoY29ubiwgJnNjY3BfY29ubmVjdGlvbnMsIGxpc3QpIHsKKwkJaWYgKGNvbm4tPmRhdGFfY2IKKwkJICAgICYmIG1lbWNtcCgmY29ubi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkJCSAgICAgIHJlc3VsdC5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsCisJCQkgICAgICBzaXplb2YoY29ubi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSkpID09IDApIHsKKwkJCWdvdG8gZm91bmQ7CisJCX0KKwl9CisKKwlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAiTm8gY29ubmVjdGlvbiBmb3VuZCBmb3IgZHQxIGRhdGFcbiIpOworCXJldHVybiAtMTsKKworZm91bmQ6CisJY29ubi0+ZGF0YV9jYihjb25uLCBtc2diLCByZXN1bHQuZGF0YV9sZW4pOworCXJldHVybiAwOworfQorCisvKiBjb25maXJtIGEgY29ubmVjdGlvbiByZWxlYXNlICovCitzdGF0aWMgaW50IF9zY2NwX3NlbmRfY29ubmVjdGlvbl9yZWxlYXNlX2NvbXBsZXRlKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJc3RydWN0IG1zZ2IgKm1zZ2I7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWxlYXNlX2NvbXBsZXRlICpybGM7CisKKwltc2diID0gbXNnYl9hbGxvY19oZWFkcm9vbShTQ0NQX01TR19TSVpFLAorCQkJCSAgIFNDQ1BfTVNHX0hFQURST09NLCAic2NjcCBybGMiKTsKKwltc2diLT5sMmggPSAmbXNnYi0+ZGF0YVswXTsKKworCXJsYyA9IChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlbGVhc2VfY29tcGxldGUgKikgbXNnYl9wdXQobXNnYiwgc2l6ZW9mKCpybGMpKTsKKwlybGMtPnR5cGUgPSBTQ0NQX01TR19UWVBFX1JMQzsKKwltZW1jcHkoJnJsYy0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCSAgICAgICAmY29ubmVjdGlvbi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLCBzaXplb2Yoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSkpOworCW1lbWNweSgmcmxjLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLAorCSAgICAgICAmY29ubmVjdGlvbi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwgc2l6ZW9mKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UpKTsKKworCV9zZW5kX21zZyhtc2diKTsKKworCS8qCisJICogUmVtb3ZlIGZyb20gdGhlIGxpc3Qgb2YgYWN0aXZlIGNvbm5lY3Rpb25zIGFuZCBzZXQgdGhlIHN0YXRlLiBVc2VyIGNvZGUKKwkgKiBzaG91bGQgbm93IGZyZWUgdGhlIGVudHJ5LgorCSAqLworCWxsaXN0X2RlbCgmY29ubmVjdGlvbi0+bGlzdCk7CisJX3NjY3Bfc2V0X2Nvbm5lY3Rpb25fc3RhdGUoY29ubmVjdGlvbiwgU0NDUF9DT05ORUNUSU9OX1NUQVRFX1JFTEVBU0VfQ09NUExFVEUpOworCXJldHVybiAwOworfQorCisvKiBjb25uZWN0aW9uIHJlbGVhc2VkLCBzZW5kIGEgcmVsZWFzZWQgY29uZmlybSAqLworc3RhdGljIGludCBfc2NjcF9oYW5kbGVfY29ubmVjdGlvbl9yZWxlYXNlZChzdHJ1Y3QgbXNnYiAqbXNnYikKK3sKKwlzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgcmVzdWx0OworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm47CisKKwlpZiAoX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9yZWxlYXNlZChtc2diLCAmcmVzdWx0KSA9PSAtMSkKKwkJcmV0dXJuIC0xOworCisJLyogbG9va3VwIGlmIHdlIGhhdmUgYSBjb25uZWN0aW9uIHdpdGggdGhlIGdpdmVuIHJlZmVyZW5jZSAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm4sICZzY2NwX2Nvbm5lY3Rpb25zLCBsaXN0KSB7CisJCWlmIChjb25uLT5kYXRhX2NiCisJCSAgICAmJiBtZW1jbXAoJmNvbm4tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsCisJCQkgICAgICByZXN1bHQuZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCQkJICAgICAgc2l6ZW9mKGNvbm4tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UpKSA9PSAwCisJCSAgICAmJiBtZW1jbXAoJmNvbm4tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwKKwkJCSAgICAgIHJlc3VsdC5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLAorCQkJICAgICAgc2l6ZW9mKGNvbm4tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSkpID09IDApIHsKKwkJICAgIGdvdG8gZm91bmQ7CisJCX0KKwl9CisKKworCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJVbmtub3duIGNvbm5lY3Rpb24gd2FzIHJlbGVhc2VkLlxuIik7CisJcmV0dXJuIC0xOworCisJLyogd2UgaGF2ZSBmb3VuZCBhIGNvbm5lY3Rpb24gKi8KK2ZvdW5kOgorCS8qIG9wdGlvbmFsIGRhdGEgKi8KKwlpZiAocmVzdWx0LmRhdGFfbGVuICE9IDAgJiYgY29ubi0+ZGF0YV9jYikgeworCQljb25uLT5kYXRhX2NiKGNvbm4sIG1zZ2IsIHJlc3VsdC5kYXRhX2xlbik7CisJfQorCisJLyogZ2VuZXJhdGUgYSByZXNwb25zZSAqLworCWlmIChfc2NjcF9zZW5kX2Nvbm5lY3Rpb25fcmVsZWFzZV9jb21wbGV0ZShjb25uKSAhPSAwKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJTZW5kaW5nIHJlbGVhc2UgY29uZmlybWVkIGZhaWxlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfc2NjcF9oYW5kbGVfY29ubmVjdGlvbl9yZWZ1c2VkKHN0cnVjdCBtc2diICptc2diKQoreworCXN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCByZXN1bHQ7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubjsKKworCWlmIChfc2NjcF9wYXJzZV9jb25uZWN0aW9uX3JlZnVzZWQobXNnYiwgJnJlc3VsdCkgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJLyogbG9va3VwIGlmIHdlIGhhdmUgYSBjb25uZWN0aW9uIHdpdGggdGhlIGdpdmVuIHJlZmVyZW5jZSAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm4sICZzY2NwX2Nvbm5lY3Rpb25zLCBsaXN0KSB7CisJCWlmIChjb25uLT5pbmNvbWluZyA9PSAwICYmIGNvbm4tPmRhdGFfY2IKKwkJICAgICYmIG1lbWNtcCgmY29ubi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkJCSAgICAgIHJlc3VsdC5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsCisJCQkgICAgICBzaXplb2YoY29ubi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSkpID09IDApIHsKKwkJICAgIGdvdG8gZm91bmQ7CisJCX0KKwl9CisKKwlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAiUmVmdXNlZCBidXQgbm8gY29ubmVjdGlvbiBmb3VuZFxuIik7CisJcmV0dXJuIC0xOworCitmb3VuZDoKKwkvKiBvcHRpb25hbCBkYXRhICovCisJaWYgKHJlc3VsdC5kYXRhX2xlbiAhPSAwICYmIGNvbm4tPmRhdGFfY2IpIHsKKwkJY29ubi0+ZGF0YV9jYihjb25uLCBtc2diLCByZXN1bHQuZGF0YV9sZW4pOworCX0KKworCisJbGxpc3RfZGVsKCZjb25uLT5saXN0KTsKKwlfc2NjcF9zZXRfY29ubmVjdGlvbl9zdGF0ZShjb25uLCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVGVVNFRCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX3NjY3BfaGFuZGxlX2Nvbm5lY3Rpb25fY29uZmlybShzdHJ1Y3QgbXNnYiAqbXNnYikKK3sKKwlzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgcmVzdWx0OworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm47CisKKwlpZiAoX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9jb25maXJtKG1zZ2IsICZyZXN1bHQpICE9IDApCisJCXJldHVybiAtMTsKKworCS8qIGxvb2t1cCBpZiB3ZSBoYXZlIGEgY29ubmVjdGlvbiB3aXRoIHRoZSBnaXZlbiByZWZlcmVuY2UgKi8KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uLCAmc2NjcF9jb25uZWN0aW9ucywgbGlzdCkgeworCQlpZiAoY29ubi0+aW5jb21pbmcgPT0gMCAmJiBjb25uLT5kYXRhX2NiCisJCSAgICAmJiBtZW1jbXAoJmNvbm4tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsCisJCQkgICAgICByZXN1bHQuZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCQkJICAgICAgc2l6ZW9mKGNvbm4tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UpKSA9PSAwKSB7CisJCSAgICBnb3RvIGZvdW5kOworCQl9CisJfQorCisJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIkNvbmZpcm1lZCBidXQgbm8gY29ubmVjdGlvbiBmb3VuZFxuIik7CisJcmV0dXJuIC0xOworCitmb3VuZDoKKwkvKiBjb3B5IHRoZSBhZGRyZXNzZXMgb2YgdGhlIGNvbm5lY3Rpb24gKi8KKwljb25uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UgPSAqcmVzdWx0LnNvdXJjZV9sb2NhbF9yZWZlcmVuY2U7CisJX3NjY3Bfc2V0X2Nvbm5lY3Rpb25fc3RhdGUoY29ubiwgU0NDUF9DT05ORUNUSU9OX1NUQVRFX0VTVEFCTElTSEVEKTsKKworCS8qIG9wdGlvbmFsIGRhdGEgKi8KKwlpZiAocmVzdWx0LmRhdGFfbGVuICE9IDAgJiYgY29ubi0+ZGF0YV9jYikgeworCQljb25uLT5kYXRhX2NiKGNvbm4sIG1zZ2IsIHJlc3VsdC5kYXRhX2xlbik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworaW50IHNjY3Bfc3lzdGVtX2luaXQodm9pZCAoKm91dGdvaW5nKShzdHJ1Y3QgbXNnYiAqZGF0YSwgdm9pZCAqY3R4KSwgdm9pZCAqY3R4KQoreworCXNjY3Bfc3lzdGVtLndyaXRlX2RhdGEgPSBvdXRnb2luZzsKKwlzY2NwX3N5c3RlbS53cml0ZV9jb250ZXh0ID0gY3R4OworCisJcmV0dXJuIDA7Cit9CisKKy8qIG9oIG15IGdvZCBhIHJlYWwgU0NDUCBwYWNrZXQuIG5lZWQgdG8gZGlzcGF0Y2ggaXQgbm93ICovCitpbnQgc2NjcF9zeXN0ZW1faW5jb21pbmcoc3RydWN0IG1zZ2IgKm1zZ2IpCit7CisJaWYgKG1zZ2JfbDJsZW4obXNnYikgPCAxICkgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAiVG9vIHNob3J0IHBhY2tldFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpbnQgdHlwZSA9IG1zZ2ItPmwyaFswXTsKKworCXN3aXRjaCh0eXBlKSB7CisJY2FzZSBTQ0NQX01TR19UWVBFX0NSOgorCQlyZXR1cm4gX3NjY3BfaGFuZGxlX2Nvbm5lY3Rpb25fcmVxdWVzdChtc2diKTsKKwkJYnJlYWs7CisJY2FzZSBTQ0NQX01TR19UWVBFX1JMU0Q6CisJCXJldHVybiBfc2NjcF9oYW5kbGVfY29ubmVjdGlvbl9yZWxlYXNlZChtc2diKTsKKwkJYnJlYWs7CisJY2FzZSBTQ0NQX01TR19UWVBFX0NSRUY6CisJCXJldHVybiBfc2NjcF9oYW5kbGVfY29ubmVjdGlvbl9yZWZ1c2VkKG1zZ2IpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfQ0M6CisJCXJldHVybiBfc2NjcF9oYW5kbGVfY29ubmVjdGlvbl9jb25maXJtKG1zZ2IpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfUkxDOgorCQlyZXR1cm4gX3NjY3BfaGFuZGxlX2Nvbm5lY3Rpb25fcmVsZWFzZV9jb21wbGV0ZShtc2diKTsKKwkJYnJlYWs7CisJY2FzZSBTQ0NQX01TR19UWVBFX0RUMToKKwkJcmV0dXJuIF9zY2NwX2hhbmRsZV9jb25uZWN0aW9uX2R0MShtc2diKTsKKwkJYnJlYWs7CisJY2FzZSBTQ0NQX01TR19UWVBFX1VEVDoKKwkJcmV0dXJuIF9zY2NwX2hhbmRsZV9yZWFkKG1zZ2IpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAidW5pbXBsZW1lbnRlZCBtc2cgdHlwZTogJWRcbiIsIHR5cGUpOworCX07CisKKwlyZXR1cm4gLTE7Cit9CisKKy8qIGNyZWF0ZSBhIHBhY2tldCBmcm9tIHRoZSBkYXRhICovCitpbnQgc2NjcF9jb25uZWN0aW9uX3dyaXRlKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBtc2diICpkYXRhKQoreworCWlmIChjb25uZWN0aW9uLT5jb25uZWN0aW9uX3N0YXRlIDwgU0NDUF9DT05ORUNUSU9OX1NUQVRFX0NPTkZJUk0KKwkgICAgfHwgY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZSA+IFNDQ1BfQ09OTkVDVElPTl9TVEFURV9FU1RBQkxJU0hFRCkgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAic2NjcF9jb25uZWN0aW9uX3dyaXRlOiBXcm9uZyBjb25uZWN0aW9uIHN0YXRlOiAlcCAlZFxuIiwKKwkJICAgICAgIGNvbm5lY3Rpb24sIGNvbm5lY3Rpb24tPmNvbm5lY3Rpb25fc3RhdGUpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIF9zY2NwX3NlbmRfY29ubmVjdGlvbl9kYXRhKGNvbm5lY3Rpb24sIGRhdGEpOworfQorCisvKgorICogU2VuZCBhIEluYWN0aXZpdHkgVGVzdCBtZXNzYWdlLiBUaGUgb3duZXIgb2YgdGhlIGNvbm5lY3Rpb24KKyAqIHNob3VsZCBzdGFydCBhIHRpbWVyIGFuZCBjYWxsIHRoaXMgbWV0aG9kIHJlZ3VsYXJpbHkuIENhbGxpbmcKKyAqIHRoaXMgZXZlcnkgNjAgc2Vjb25kcyBzaG91bGQgYmUgZ29vZCBlbm91Z2guCisgKi8KK2ludCBzY2NwX2Nvbm5lY3Rpb25fc2VuZF9pdChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCWlmIChjb25uZWN0aW9uLT5jb25uZWN0aW9uX3N0YXRlIDwgU0NDUF9DT05ORUNUSU9OX1NUQVRFX0NPTkZJUk0KKwkgICAgfHwgY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZSA+IFNDQ1BfQ09OTkVDVElPTl9TVEFURV9FU1RBQkxJU0hFRCkgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAic2NjcF9jb25uZWN0aW9uX3dyaXRlOiBXcm9uZyBjb25uZWN0aW9uIHN0YXRlOiAlcCAlZFxuIiwKKwkJICAgICAgIGNvbm5lY3Rpb24sIGNvbm5lY3Rpb24tPmNvbm5lY3Rpb25fc3RhdGUpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIF9zY2NwX3NlbmRfY29ubmVjdGlvbl9pdChjb25uZWN0aW9uKTsKK30KKworLyogc2VuZCBhIGNvbm5lY3Rpb24gcmVsZWFzZSBhbmQgd2FpdCBmb3IgdGhlIGNvbm5lY3Rpb24gcmVsZWFzZWQgKi8KK2ludCBzY2NwX2Nvbm5lY3Rpb25fY2xvc2Uoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgaW50IGNhdXNlKQoreworCWlmIChjb25uZWN0aW9uLT5jb25uZWN0aW9uX3N0YXRlIDwgU0NDUF9DT05ORUNUSU9OX1NUQVRFX0NPTkZJUk0KKwkgICAgfHwgY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZSA+IFNDQ1BfQ09OTkVDVElPTl9TVEFURV9FU1RBQkxJU0hFRCkgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAiQ2FuIG5vdCBjbG9zZSB0aGUgY29ubmVjdGlvbi4gSXQgd2FzIG5ldmVyIG9wZW5lZDogJXAgJWRcbiIsCisJCQljb25uZWN0aW9uLCBjb25uZWN0aW9uLT5jb25uZWN0aW9uX3N0YXRlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiBfc2NjcF9zZW5kX2Nvbm5lY3Rpb25fcmVsZWFzZWQoY29ubmVjdGlvbiwgY2F1c2UpOworfQorCitpbnQgc2NjcF9jb25uZWN0aW9uX2ZyZWUoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlpZiAoY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZSA+IFNDQ1BfQ09OTkVDVElPTl9TVEFURV9OT05FCisJICAgICYmIGNvbm5lY3Rpb24tPmNvbm5lY3Rpb25fc3RhdGUgPCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVMRUFTRV9DT01QTEVURSkgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAiVGhlIGNvbm5lY3Rpb24gbmVlZHMgdG8gYmUgcmVsZWFzZWQgYmVmb3JlIGl0IGlzIGZyZWVkIik7CisJCXJldHVybiAtMTsKKwl9CisKKwl0YWxsb2NfZnJlZShjb25uZWN0aW9uKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHNjY3BfY29ubmVjdGlvbl9mb3JjZV9mcmVlKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbikKK3sKKwlpZiAoY29uLT5jb25uZWN0aW9uX3N0YXRlID4gU0NDUF9DT05ORUNUSU9OX1NUQVRFX05PTkUgJiYKKwkgICAgY29uLT5jb25uZWN0aW9uX3N0YXRlIDwgU0NDUF9DT05ORUNUSU9OX1NUQVRFX1JFTEVBU0VfQ09NUExFVEUpCisJCWxsaXN0X2RlbCgmY29uLT5saXN0KTsKKworCWNvbi0+Y29ubmVjdGlvbl9zdGF0ZSA9IFNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUZVU0VEOworCXNjY3BfY29ubmVjdGlvbl9mcmVlKGNvbik7CisgICAgICAgIHJldHVybiAwOworfQorCitzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpzY2NwX2Nvbm5lY3Rpb25fc29ja2V0KHZvaWQpCit7CisJcmV0dXJuIHRhbGxvY196ZXJvKHRhbGxfc2NjcF9jdHgsIHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24pOworfQorCitpbnQgc2NjcF9jb25uZWN0aW9uX2Nvbm5lY3Qoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubiwKKwkJCSAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCAqbG9jYWwsCisJCQkgICAgc3RydWN0IG1zZ2IgKmRhdGEpCit7CisJcmV0dXJuIF9zY2NwX3NlbmRfY29ubmVjdGlvbl9yZXF1ZXN0KGNvbm4sIGxvY2FsLCBkYXRhKTsKK30KKworaW50IHNjY3BfY29ubmVjdGlvbl9zZXRfaW5jb21pbmcoY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3AgKnNvY2ssCisJCQkJIGludCAoKmFjY2VwdF9jYikoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqLCB2b2lkICopLCB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBzY2NwX2RhdGFfY2FsbGJhY2sgKmNiOworCisJaWYgKCFzb2NrKQorCQlyZXR1cm4gLTI7CisKKwljYiA9IF9maW5kX3Nzbihzb2NrLT5zY2NwX3Nzbik7CisJaWYgKCFjYikKKwkJcmV0dXJuIC0xOworCisJY2ItPmFjY2VwdF9jYiA9IGFjY2VwdF9jYjsKKwljYi0+YWNjZXB0X2NvbnRleHQgPSBjb250ZXh0OworCXJldHVybiAwOworfQorCitpbnQgc2NjcF93cml0ZShzdHJ1Y3QgbXNnYiAqZGF0YSwgY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3AgKmluLAorCSAgICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCAqb3V0LCBpbnQgY2xhc3MpCit7CisJcmV0dXJuIF9zY2NwX3NlbmRfZGF0YShjbGFzcywgaW4sIG91dCwgZGF0YSk7Cit9CisKK2ludCBzY2NwX3NldF9yZWFkKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwICpzb2NrLAorCQkgIGludCAoKnJlYWRfY2IpKHN0cnVjdCBtc2diICosIHVuc2lnbmVkIGludCwgdm9pZCAqKSwgdm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3Qgc2NjcF9kYXRhX2NhbGxiYWNrICpjYjsKKworCWlmICghc29jaykKKwkJcmV0dXJuIC0yOworCisJY2IgID0gX2ZpbmRfc3NuKHNvY2stPnNjY3Bfc3NuKTsKKwlpZiAoIWNiKQorCQlyZXR1cm4gLTE7CisKKwljYi0+cmVhZF9jYiA9IHJlYWRfY2I7CisJY2ItPnJlYWRfY29udGV4dCA9IGNvbnRleHQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UpIDw9IHNpemVvZih1X2ludDMyX3QpLCBlbm91Z2hfc3BhY2UpOworCit1X2ludDMyX3Qgc2NjcF9zcmNfcmVmX3RvX2ludChzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlICpyZWYpCit7CisJdV9pbnQzMl90IHNyY19yZWYgPSAwOworCW1lbWNweSgmc3JjX3JlZiwgcmVmLCBzaXplb2YoKnJlZikpOworCXJldHVybiBzcmNfcmVmOworfQorCitzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlIHNjY3Bfc3JjX3JlZl9mcm9tX2ludCh1X2ludDMyX3QgaW50X3JlZikKK3sKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlIHJlZjsKKwltZW1jcHkoJnJlZiwgJmludF9yZWYsIHNpemVvZihyZWYpKTsKKwlyZXR1cm4gcmVmOworfQorCitpbnQgc2NjcF9kZXRlcm1pbmVfbXNnX3R5cGUoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlpZiAobXNnYl9sMmxlbihtc2cpIDwgMSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIG1zZy0+bDJoWzBdOworfQorCitpbnQgc2NjcF9wYXJzZV9oZWFkZXIoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0ICpyZXN1bHQpCit7CisJaW50IHR5cGU7CisKKwlpZiAobXNnYl9sMmxlbihtc2cpIDwgMSkKKwkJcmV0dXJuIC0xOworCisJdHlwZSA9IG1zZy0+bDJoWzBdOworCXN3aXRjaCh0eXBlKSB7CisJY2FzZSBTQ0NQX01TR19UWVBFX0NSOgorCQlyZXR1cm4gX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9yZXF1ZXN0KG1zZywgcmVzdWx0KTsKKwkJYnJlYWs7CisJY2FzZSBTQ0NQX01TR19UWVBFX1JMU0Q6CisJCXJldHVybiBfc2NjcF9wYXJzZV9jb25uZWN0aW9uX3JlbGVhc2VkKG1zZywgcmVzdWx0KTsKKwkJYnJlYWs7CisJY2FzZSBTQ0NQX01TR19UWVBFX0NSRUY6CisJCXJldHVybiBfc2NjcF9wYXJzZV9jb25uZWN0aW9uX3JlZnVzZWQobXNnLCByZXN1bHQpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfQ0M6CisJCXJldHVybiBfc2NjcF9wYXJzZV9jb25uZWN0aW9uX2NvbmZpcm0obXNnLCByZXN1bHQpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfUkxDOgorCQlyZXR1cm4gX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9yZWxlYXNlX2NvbXBsZXRlKG1zZywgcmVzdWx0KTsKKwkJYnJlYWs7CisJY2FzZSBTQ0NQX01TR19UWVBFX0RUMToKKwkJcmV0dXJuIF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fZHQxKG1zZywgcmVzdWx0KTsKKwkJYnJlYWs7CisJY2FzZSBTQ0NQX01TR19UWVBFX1VEVDoKKwkJcmV0dXJuIF9zY2NwX3BhcnNlX3VkdChtc2csIHJlc3VsdCk7CisJCWJyZWFrOworCWNhc2UgU0NDUF9NU0dfVFlQRV9JVDoKKwkJcmV0dXJuIF9zY2NwX3BhcnNlX2l0KG1zZywgcmVzdWx0KTsKKwkJYnJlYWs7CisJY2FzZSBTQ0NQX01TR19UWVBFX0VSUjoKKwkJcmV0dXJuIF9zY2NwX3BhcnNlX2Vycihtc2csIHJlc3VsdCk7CisJCWJyZWFrOworCX07CisKKwlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAiVW5pbXBsZW1lbnRlZCBNU0cgVHlwZTogMHgleFxuIiwgdHlwZSk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKSB2b2lkIG9uX2Rzb19sb2FkKHZvaWQpCit7CisJdGFsbF9zY2NwX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdChOVUxMLCAxLCAic2NjcCIpOworfQorCitzdGF0aWMgX19hdHRyaWJ1dGVfXygoZGVzdHJ1Y3RvcikpIHZvaWQgb25fZHNvX3VubG9hZCh2b2lkKQoreworCXRhbGxvY19yZXBvcnRfZnVsbCh0YWxsX3NjY3BfY3R4LCBzdGRlcnIpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvc2lsZW50X2NhbGwuYyBiL29wZW5ic2Mvc3JjL3NpbGVudF9jYWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJkNTM0MQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3NpbGVudF9jYWxsLmMKQEAgLTAsMCArMSwxNDYgQEAKKy8qIEdTTSBzaWxlbnQgY2FsbCBmZWF0dXJlICovCisKKy8qCisgKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3BhZ2luZy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvY2hhbl9hbGxvYy5oPgorCisvKiBwYWdpbmcgb2YgdGhlIHJlcXVlc3RlZCBzdWJzY3JpYmVyIGhhcyBjb21wbGV0ZWQgKi8KK3N0YXRpYyBpbnQgcGFnaW5nX2NiX3NpbGVudCh1bnNpZ25lZCBpbnQgaG9va251bSwgdW5zaWduZWQgaW50IGV2ZW50LAorCQkJICAgIHN0cnVjdCBtc2diICptc2csIHZvaWQgKl9sY2hhbiwgdm9pZCAqX2RhdGEpCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm47CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBfbGNoYW47CisJc3RydWN0IHNjYWxsX3NpZ25hbF9kYXRhIHNpZ2RhdGE7CisJaW50IHJjOworCisJaWYgKGhvb2tudW0gIT0gR1NNX0hPT0tfUlJfUEFHSU5HKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCURFQlVHUChEU01TLCAicGFnaW5nX2NiX3NpbGVudDogIik7CisKKwljb25uID0gJmxjaGFuLT5jb25uOworCisJc2lnZGF0YS5sY2hhbiA9IGxjaGFuOworCXNpZ2RhdGEuZGF0YSA9IF9kYXRhOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgR1NNX1BBR0lOR19TVUNDRUVERUQ6CisJCURFQlVHUEMoRFNNUywgInN1Y2Nlc3MsIHVzaW5nIFRpbWVzbG90ICV1IG9uIEFSRkNOICV1XG4iLAorCQkJbGNoYW4tPnRzLT5uciwgbGNoYW4tPnRzLT50cngtPmFyZmNuKTsKKwkJY29ubi0+c2lsZW50X2NhbGwgPSAxOworCQkvKiBpbmNyZW1lbnQgbGNoYW4gcmVmZXJlbmNlIGNvdW50ICovCisJCWRpc3BhdGNoX3NpZ25hbChTU19TQ0FMTCwgU19TQ0FMTF9TVUNDRVNTLCAmc2lnZGF0YSk7CisJCXVzZV9zdWJzY3JfY29uKGNvbm4pOworCQlicmVhazsKKwljYXNlIEdTTV9QQUdJTkdfRVhQSVJFRDoKKwkJREVCVUdQKERTTVMsICJleHBpcmVkXG4iKTsKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX1NDQUxMLCBTX1NDQUxMX0VYUElSRUQsICZzaWdkYXRhKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIHJlY2VpdmUgYSBsYXllciAzIG1lc3NhZ2UgZnJvbSBhIHNpbGVudCBjYWxsICovCitpbnQgc2lsZW50X2NhbGxfcngoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwkvKiBGSVhNRTogZG8gc29tZXRoaW5nIGxpa2Ugc2VuZGluZyBpdCB0aHJvdWdoIGEgVURQIHBvcnQgKi8KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IG1zZ19tYXRjaCB7CisJdV9pbnQ4X3QgcGRpc2M7CisJdV9pbnQ4X3QgbXNnX3R5cGU7Cit9OworCisvKiBsaXN0IG9mIG1lc3NhZ2VzIHRoYXQgYXJlIGhhbmRsZWQgaW5zaWRlIE9wZW5CU0MsIGV2ZW4gaW4gYSBzaWxlbnQgY2FsbCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBtc2dfbWF0Y2ggc2lsZW50X2NhbGxfYWNjZXB0W10gPSB7CisJeyBHU000OF9QRElTQ19NTSwgR1NNNDhfTVRfTU1fTE9DX1VQRF9SRVFVRVNUIH0sCisJeyBHU000OF9QRElTQ19NTSwgR1NNNDhfTVRfTU1fQ01fU0VSVl9SRVEgfSwKK307CisKKy8qIGRlY2lkZSBpZiB3ZSBuZWVkIHRvIHJlcm91dGUgYSBtZXNzYWdlIGFzIHBhcnQgb2YgYSBzaWxlbnQgY2FsbCAqLworaW50IHNpbGVudF9jYWxsX3Jlcm91dGUoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1X2ludDhfdCBwZGlzYyA9IGdoLT5wcm90b19kaXNjciAmIDB4MGY7CisJaW50IGk7CisKKwkvKiBpZiB3ZSdyZSBub3QgcGFydCBvZiBhIHNpbGVudCBjYWxsLCBuZXZlciByZXJvdXRlICovCisJaWYgKCFtc2ctPmxjaGFuLT5jb25uLnNpbGVudF9jYWxsKQorCQlyZXR1cm4gMDsKKworCS8qIGNoZWNrIGlmIHdlIGFyZSBhIHNwZWNpYWwgbWVzc2FnZSB0aGF0IGlzIGhhbmRsZWQgaW4gb3BlbmJzYyAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNpbGVudF9jYWxsX2FjY2VwdCk7IGkrKykgeworCQlpZiAoc2lsZW50X2NhbGxfYWNjZXB0W2ldLnBkaXNjID09IHBkaXNjICYmCisJCSAgICBzaWxlbnRfY2FsbF9hY2NlcHRbaV0ubXNnX3R5cGUgPT0gZ2gtPm1zZ190eXBlKQorCQkJcmV0dXJuIDA7CisJfQorCisJLyogb3RoZXJ3aXNlLCByZXJvdXRlICovCisJcmV0dXJuIDE7Cit9CisKKworLyogaW5pdGlhdGUgYSBzaWxlbnQgY2FsbCB3aXRoIGEgZ2l2ZW4gc3Vic2NyaWJlciAqLworaW50IGdzbV9zaWxlbnRfY2FsbF9zdGFydChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwgdm9pZCAqZGF0YSwgaW50IHR5cGUpCit7CisJaW50IHJjOworCisJcmMgPSBwYWdpbmdfcmVxdWVzdChzdWJzY3ItPm5ldCwgc3Vic2NyLCB0eXBlLAorCQkJICAgIHBhZ2luZ19jYl9zaWxlbnQsIGRhdGEpOworCXJldHVybiByYzsKK30KKworLyogZW5kIGEgc2lsZW50IGNhbGwgd2l0aCBhIGdpdmVuIHN1YnNjcmliZXIgKi8KK2ludCBnc21fc2lsZW50X2NhbGxfc3RvcChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubjsKKworCWxjaGFuID0gbGNoYW5fZm9yX3N1YnNjcihzdWJzY3IpOworCWlmICghbGNoYW4pCisJCXJldHVybiAtRUlOVkFMOworCisJLyogZGlkIHdlIGFjdHVhbGx5IGVzdGFibGlzaCBhIHNpbGVudCBjYWxsIGZvciB0aGlzIGd1eT8gKi8KKwljb25uID0gJmxjaGFuLT5jb25uOworCWlmICghY29ubi0+c2lsZW50X2NhbGwpCisJCXJldHVybiAtRUlOVkFMOworCisJcHV0X3N1YnNjcl9jb24oY29ubik7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3NvY2tldC5jIGIvb3BlbmJzYy9zcmMvc29ja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VkNGQ0MgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3NvY2tldC5jCkBAIC0wLDAgKzEsOTQgQEAKKy8qIE9wZW5CU0Mgc29rY2V0IGNvZGUsIHRha2VuIGZyb20gQWJpcyBpbnB1dCBkcml2ZXIgZm9yIGlwLmFjY2VzcyAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKKyAqIChDKSAyMDEwIGJ5IE9uLVdhdmVzCisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy9mY250bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCitpbnQgbWFrZV9zb2NrKHN0cnVjdCBic2NfZmQgKmJmZCwgaW50IHByb3RvLCB1X2ludDE2X3QgcG9ydCwKKwkgICAgICBpbnQgKCpjYikoc3RydWN0IGJzY19mZCAqZmQsIHVuc2lnbmVkIGludCB3aGF0KSkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKwlpbnQgcmV0LCBvbiA9IDE7CisJaW50IHR5cGUgPSBTT0NLX1NUUkVBTTsKKworCWlmIChwcm90byA9PSBJUFBST1RPX1VEUCkKKwkJdHlwZSA9IFNPQ0tfREdSQU07CisKKwliZmQtPmZkID0gc29ja2V0KEFGX0lORVQsIHR5cGUsIHByb3RvKTsKKwliZmQtPmNiID0gY2I7CisJYmZkLT53aGVuID0gQlNDX0ZEX1JFQUQ7CisJLy9iZmQtPmRhdGEgPSBsaW5lOworCisJaWYgKGJmZC0+ZmQgPCAwKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgImNvdWxkIG5vdCBjcmVhdGUgVENQIHNvY2tldC5cbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwltZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisJYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisJYWRkci5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOworCisJc2V0c29ja29wdChiZmQtPmZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZvbiwgc2l6ZW9mKG9uKSk7CisKKwlyZXQgPSBiaW5kKGJmZC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsIHNpemVvZihhZGRyKSk7CisJaWYgKHJldCA8IDApIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiY291bGQgbm90IGJpbmQgbDIgc29ja2V0ICVzXG4iLAorCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJY2xvc2UoYmZkLT5mZCk7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmIChwcm90byAhPSBJUFBST1RPX1VEUCkgeworCQlyZXQgPSBsaXN0ZW4oYmZkLT5mZCwgMSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwZXJyb3IoImxpc3RlbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldCA9IGJzY19yZWdpc3Rlcl9mZChiZmQpOworCWlmIChyZXQgPCAwKSB7CisJCXBlcnJvcigicmVnaXN0ZXJfbGlzdGVuX2ZkIik7CisJCWNsb3NlKGJmZC0+ZmQpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3N1YmNoYW5fZGVtdXguYyBiL29wZW5ic2Mvc3JjL3N1YmNoYW5fZGVtdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDZjMWZlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvc3ViY2hhbl9kZW11eC5jCkBAIC0wLDAgKzEsMzIyIEBACisvKiBBIEUxIHN1Yi1jaGFubmVsIChkZSltdWx0aXBsZXhlciB3aXRoIFRSQVUgZnJhbWUgc3luYyAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL3N1YmNoYW5fZGVtdXguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RyYXVfZnJhbWUuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorCit2b2lkICp0YWxsX3RxZV9jdHg7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcHBlbmRfYml0KHN0cnVjdCBkZW11eF9zdWJjaCAqc2NoLCB1X2ludDhfdCBiaXQpCit7CisJc2NoLT5vdXRfYml0YnVmW3NjaC0+b3V0X2lkeCsrXSA9IGJpdDsKK30KKworI2RlZmluZSBTWU5DX0hEUl9CSVRTCTE2CitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgbnVsbGJ5dGVzW1NZTkNfSERSX0JJVFNdOworCisvKiBjaGVjayBpZiB3ZSBoYXZlIGp1c3QgY29tcGxldGVkIHRoZSAxNiBiaXQgemVybyBzeW5jIGhlYWRlciwKKyAqIGluIGFjY29yZGFuY2Ugd2l0aCBHU00gVFMgMDguNjAgQ2hhcHRlciA0LjguMSAqLworc3RhdGljIGludCBzeW5jX2hkcl9jb21wbGV0ZShzdHJ1Y3QgZGVtdXhfc3ViY2ggKnNjaCwgdV9pbnQ4X3QgYml0KQoreworCWlmIChiaXQgPT0gMCkKKwkJc2NoLT5jb25zZWN1dGl2ZV96ZXJvcysrOworCWVsc2UKKwkJc2NoLT5jb25zZWN1dGl2ZV96ZXJvcyA9IDA7CisKKwlpZiAoc2NoLT5jb25zZWN1dGl2ZV96ZXJvcyA+PSBTWU5DX0hEUl9CSVRTKSB7CisJCXNjaC0+Y29uc2VjdXRpdmVfemVyb3MgPSAwOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogcmVzeW5jaHJvbml6ZSB0byBjdXJyZW50IGxvY2F0aW9uICovCitzdGF0aWMgdm9pZCByZXN5bmNfdG9faGVyZShzdHJ1Y3QgZGVtdXhfc3ViY2ggKnNjaCkKK3sKKwltZW1zZXQoc2NoLT5vdXRfYml0YnVmLCAwLCBTWU5DX0hEUl9CSVRTKTsKKworCS8qIHNldCBpbmRleCBpbiBhIHdheSB0aGF0IHdlIGNhbiBjb250aW51ZSByZWNlaXZpbmcgYml0cyBhZnRlcgorCSAqIHRoZSBlbmQgb2YgdGhlIFNZTkMgaGVhZGVyICovCisJc2NoLT5vdXRfaWR4ID0gU1lOQ19IRFJfQklUUzsKKwlzY2gtPmluX3N5bmMgPSAxOworfQorCitpbnQgc3ViY2hfZGVtdXhfaW5pdChzdHJ1Y3Qgc3ViY2hfZGVtdXggKmRteCkKK3sKKwlpbnQgaTsKKworCWRteC0+Y2hhbl9hY3RpdiA9IDA7CisJZm9yIChpID0gMDsgaSA8IE5SX1NVQkNIOyBpKyspIHsKKwkJc3RydWN0IGRlbXV4X3N1YmNoICpzY2ggPSAmZG14LT5zdWJjaFtpXTsKKwkJc2NoLT5vdXRfaWR4ID0gMDsKKwkJbWVtc2V0KHNjaC0+b3V0X2JpdGJ1ZiwgMHhmZiwgc2l6ZW9mKHNjaC0+b3V0X2JpdGJ1ZikpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogaW5wdXQgc29tZSBhcmJpdHJhcnkgKG1vZHVsbyA0KSBudW1iZXIgb2YgYnl0ZXMgb2YgYSA2NGsgRTEgY2hhbm5lbCwKKyAqIHNwbGl0IGl0IGludG8gdGhlIDE2ayBzdWJjaGFubmVscyAqLworaW50IHN1YmNoX2RlbXV4X2luKHN0cnVjdCBzdWJjaF9kZW11eCAqZG14LCB1X2ludDhfdCAqZGF0YSwgaW50IGxlbikKK3sKKwlpbnQgaSwgYzsKKworCS8qIHdlIGF2b2lkIHBhcnRpYWxseSBmaWxsZWQgYnl0ZXMgaW4gb3V0YnVmICovCisJaWYgKGxlbiAlIDQpCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCXVfaW50OF90IGluYnl0ZSA9IGRhdGFbaV07CisKKwkJZm9yIChjID0gMDsgYyA8IE5SX1NVQkNIOyBjKyspIHsKKwkJCXN0cnVjdCBkZW11eF9zdWJjaCAqc2NoID0gJmRteC0+c3ViY2hbY107CisJCQl1X2ludDhfdCBpbmJpdHM7CisJCQl1X2ludDhfdCBiaXQ7CisKKwkJCS8qIGlnbm9yZSBpbmFjdGl2ZSBzdWJjaGFubmVscyAqLworCQkJaWYgKCEoZG14LT5jaGFuX2FjdGl2ICYgKDEgPDwgYykpKQorCQkJCWNvbnRpbnVlOworCisJCQlpbmJpdHMgPSBpbmJ5dGUgPj4gKGMgPDwgMSk7CisKKwkJCS8qIHR3byBiaXRzIGZvciBlYWNoIHN1YmNoYW5uZWwgKi8KKwkJCWlmIChpbmJpdHMgJiAweDAxKQorCQkJCWJpdCA9IDE7CisJCQllbHNlCisJCQkJYml0ID0gMDsKKwkJCWFwcGVuZF9iaXQoc2NoLCBiaXQpOworCisJCQlpZiAoc3luY19oZHJfY29tcGxldGUoc2NoLCBiaXQpKQorCQkJCXJlc3luY190b19oZXJlKHNjaCk7CisKKwkJCWlmIChpbmJpdHMgJiAweDAyKQorCQkJCWJpdCA9IDE7CisJCQllbHNlCisJCQkJYml0ID0gMDsKKwkJCWFwcGVuZF9iaXQoc2NoLCBiaXQpOworCisJCQlpZiAoc3luY19oZHJfY29tcGxldGUoc2NoLCBiaXQpKQorCQkJCXJlc3luY190b19oZXJlKHNjaCk7CisKKwkJCS8qIEZJWE1FOiB2ZXJpZnkgdGhlIGZpcnN0IGJpdCBpbiBvY3RldCAyLCA0LCA2LCAuLi4KKwkJCSAqIGFjY29yZGluZyB0byBUUyAwOC42MCA0LjguMSAqLworCisJCQkvKiBvbmNlIHdlIGhhdmUgcmVhY2hlZCBUUkFVX0ZSQU1FX0JJVFMsIGNhbGwKKwkJCSAqIHRoZSBUUkFVIGZyYW1lIGhhbmRsZXIgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKwkJCWlmIChzY2gtPm91dF9pZHggPj0gVFJBVV9GUkFNRV9CSVRTKSB7CisJCQkJaWYgKHNjaC0+aW5fc3luYykgeworCQkJCQlkbXgtPm91dF9jYihkbXgsIGMsIHNjaC0+b3V0X2JpdGJ1ZiwKKwkJCQkJICAgIHNjaC0+b3V0X2lkeCwgZG14LT5kYXRhKTsKKwkJCQkJc2NoLT5pbl9zeW5jID0gMDsKKwkJCQl9CisJCQkJc2NoLT5vdXRfaWR4ID0gMDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gaTsKK30KKworaW50IHN1YmNoX2RlbXV4X2FjdGl2YXRlKHN0cnVjdCBzdWJjaF9kZW11eCAqZG14LCBpbnQgc3ViY2gpCit7CisJaWYgKHN1YmNoID49IE5SX1NVQkNIKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRteC0+Y2hhbl9hY3RpdiB8PSAoMSA8PCBzdWJjaCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzdWJjaF9kZW11eF9kZWFjdGl2YXRlKHN0cnVjdCBzdWJjaF9kZW11eCAqZG14LCBpbnQgc3ViY2gpCit7CisJaWYgKHN1YmNoID49IE5SX1NVQkNIKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRteC0+Y2hhbl9hY3RpdiAmPSB+KDEgPDwgc3ViY2gpOworCXJldHVybiAwOworfQorCisvKiBNVUxUSVBMRVhFUiAqLworCitzdGF0aWMgaW50IGFsbG9jX2FkZF9pZGxlX2ZyYW1lKHN0cnVjdCBzdWJjaF9tdXggKm14LCBpbnQgc2NoX25yKQoreworCS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHdpdGggaWRsZSBwYXR0ZXJuICovCisJcmV0dXJuIHN1YmNoYW5fbXV4X2VucXVldWUobXgsIHNjaF9uciwgdHJhdV9pZGxlX2ZyYW1lKCksCisJCQkJICAgVFJBVV9GUkFNRV9CSVRTKTsKK30KKworLyogcmV0dXJuIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIGJpdHMgZnJvbSB0aGUgc3BlY2lmaWVkIHN1YmNoYW5uZWwgKi8KK3N0YXRpYyBpbnQgZ2V0X3N1YmNoX2JpdHMoc3RydWN0IHN1YmNoX211eCAqbXgsIGludCBzdWJjaCwKKwkJCSAgdV9pbnQ4X3QgKmJpdHMsIGludCBudW1fcmVxdWVzdGVkKQoreworCXN0cnVjdCBtdXhfc3ViY2ggKnNjaCA9ICZteC0+c3ViY2hbc3ViY2hdOworCWludCBudW1fYml0cyA9IDA7CisKKwl3aGlsZSAobnVtX2JpdHMgPCBudW1fcmVxdWVzdGVkKSB7CisJCXN0cnVjdCBzdWJjaF90eHFfZW50cnkgKnR4ZTsKKwkJaW50IG51bV9iaXRzX2xlZnQ7CisJCWludCBudW1fYml0c190aGlzdGltZTsKKworCQkvKiBtYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbGlkIGVudHJ5IGF0IHRvcCBvZiB0eCBxdWV1ZS4KKwkJICogaWYgbm90LCBhZGQgYW4gaWRsZSBmcmFtZSAqLworCQlpZiAobGxpc3RfZW1wdHkoJnNjaC0+dHhfcXVldWUpKQorCQkJYWxsb2NfYWRkX2lkbGVfZnJhbWUobXgsIHN1YmNoKTsKKwkKKwkJaWYgKGxsaXN0X2VtcHR5KCZzY2gtPnR4X3F1ZXVlKSkKKwkJCXJldHVybiAtRUlPOworCisJCXR4ZSA9IGxsaXN0X2VudHJ5KHNjaC0+dHhfcXVldWUubmV4dCwgc3RydWN0IHN1YmNoX3R4cV9lbnRyeSwgbGlzdCk7CisJCW51bV9iaXRzX2xlZnQgPSB0eGUtPmJpdF9sZW4gLSB0eGUtPm5leHRfYml0OworCisJCWlmIChudW1fYml0c19sZWZ0IDwgbnVtX3JlcXVlc3RlZCkKKwkJCW51bV9iaXRzX3RoaXN0aW1lID0gbnVtX2JpdHNfbGVmdDsKKwkJZWxzZQorCQkJbnVtX2JpdHNfdGhpc3RpbWUgPSBudW1fcmVxdWVzdGVkOworCisJCS8qIHB1bGwgdGhlIGJpdHMgZnJvbSB0aGUgdHhlICovCisJCW1lbWNweShiaXRzICsgbnVtX2JpdHMsIHR4ZS0+Yml0cyArIHR4ZS0+bmV4dF9iaXQsIG51bV9iaXRzX3RoaXN0aW1lKTsKKwkJdHhlLT5uZXh0X2JpdCArPSBudW1fYml0c190aGlzdGltZTsKKworCQkvKiBmcmVlIHRoZSB0eF9xdWV1ZSBlbnRyeSBpZiBpdCBpcyBmdWxseSBjb25zdW1lZCAqLworCQlpZiAodHhlLT5uZXh0X2JpdCA+PSB0eGUtPmJpdF9sZW4pIHsKKwkJCWxsaXN0X2RlbCgmdHhlLT5saXN0KTsKKwkJCXRhbGxvY19mcmVlKHR4ZSk7CisJCX0KKworCQkvKiBpbmNyZW1lbnQgZ2xvYmFsIG51bWJlciBvZiBiaXRzIGRlcXVldWVkICovCisJCW51bV9iaXRzICs9IG51bV9iaXRzX3RoaXN0aW1lOworCX0KKworCXJldHVybiBudW1fcmVxdWVzdGVkOworfQorCisvKiBjb21wYWN0IGFuIGFycmF5IG9mIDggc2luZ2xlLWJpdCBieXRlcyBpbnRvIG9uZSBieXRlIG9mIDggYml0cyAqLworc3RhdGljIHVfaW50OF90IGNvbXBhY3RfYml0cyhjb25zdCB1X2ludDhfdCAqYml0cykKK3sKKwl1X2ludDhfdCByZXQgPSAwOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJcmV0IHw9IChiaXRzW2ldID8gMSA6IDApIDw8IGk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBvYnRhaW4gYSBzaW5nbGUgb3V0cHV0IGJ5dGUgZnJvbSB0aGUgc3ViY2hhbm5lbCBtdXhlciAqLworc3RhdGljIGludCBtdXhfb3V0cHV0X2J5dGUoc3RydWN0IHN1YmNoX211eCAqbXgsIHVfaW50OF90ICpieXRlKQoreworCXVfaW50OF90IGJpdHNbOF07CisJaW50IHJjOworCisJLyogY29tYmluZSB0d28gYml0cyBvZiBldmVyeSBzdWJjaGFuICovCisJcmMgPSBnZXRfc3ViY2hfYml0cyhteCwgMCwgJmJpdHNbMF0sIDIpOworCXJjID0gZ2V0X3N1YmNoX2JpdHMobXgsIDEsICZiaXRzWzJdLCAyKTsKKwlyYyA9IGdldF9zdWJjaF9iaXRzKG14LCAyLCAmYml0c1s0XSwgMik7CisJcmMgPSBnZXRfc3ViY2hfYml0cyhteCwgMywgJmJpdHNbNl0sIDIpOworCisJKmJ5dGUgPSBjb21wYWN0X2JpdHMoYml0cyk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIFJlcXVlc3QgdGhlIG91dHB1dCBvZiBzb21lIG11eGVkIGJ5dGVzIGZyb20gdGhlIHN1YmNoYW4gbXV4ZXIgKi8KK2ludCBzdWJjaGFuX211eF9vdXQoc3RydWN0IHN1YmNoX211eCAqbXgsIHVfaW50OF90ICpkYXRhLCBpbnQgbGVuKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWludCByYzsKKwkJcmMgPSBtdXhfb3V0cHV0X2J5dGUobXgsICZkYXRhW2ldKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBsbGlzdF9sZW4oc3RydWN0IGxsaXN0X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IGxsaXN0X2hlYWQgKmVudHJ5OworCWludCBpID0gMDsKKworCWxsaXN0X2Zvcl9lYWNoKGVudHJ5LCBoZWFkKQorCQlpKys7CisKKwlyZXR1cm4gaTsKK30KKworLyogZXZpY3QgdGhlICdudW1fZXZpY3QnIG51bWJlciBvZiBvbGRlc3QgZW50cmllcyBpbiB0aGUgcXVldWUgKi8KK3N0YXRpYyB2b2lkIHR4X3F1ZXVlX2V2aWN0KHN0cnVjdCBtdXhfc3ViY2ggKnNjaCwgaW50IG51bV9ldmljdCkKK3sKKwlzdHJ1Y3Qgc3ViY2hfdHhxX2VudHJ5ICp0cWU7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2V2aWN0OyBpKyspIHsKKwkJaWYgKGxsaXN0X2VtcHR5KCZzY2gtPnR4X3F1ZXVlKSkKKwkJCXJldHVybjsKKworCQl0cWUgPSBsbGlzdF9lbnRyeShzY2gtPnR4X3F1ZXVlLm5leHQsIHN0cnVjdCBzdWJjaF90eHFfZW50cnksIGxpc3QpOworCQlsbGlzdF9kZWwoJnRxZS0+bGlzdCk7CisJCXRhbGxvY19mcmVlKHRxZSk7CisJfQorfQorCisvKiBlbnF1ZXVlIHNvbWUgZGF0YSBpbnRvIHRoZSB0eF9xdWV1ZSBvZiBhIGdpdmVuIHN1YmNoYW5uZWwgKi8KK2ludCBzdWJjaGFuX211eF9lbnF1ZXVlKHN0cnVjdCBzdWJjaF9tdXggKm14LCBpbnQgc19uciwgY29uc3QgdV9pbnQ4X3QgKmRhdGEsCisJCQlpbnQgbGVuKQoreworCXN0cnVjdCBtdXhfc3ViY2ggKnNjaCA9ICZteC0+c3ViY2hbc19ucl07CisJaW50IGxpc3RfbGVuID0gbGxpc3RfbGVuKCZzY2gtPnR4X3F1ZXVlKTsKKwlzdHJ1Y3Qgc3ViY2hfdHhxX2VudHJ5ICp0cWUgPSB0YWxsb2NfemVyb19zaXplKHRhbGxfdHFlX2N0eCwKKwkJCQkJCQlzaXplb2YoKnRxZSkgKyBsZW4pOworCWlmICghdHFlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXRxZS0+Yml0X2xlbiA9IGxlbjsKKwltZW1jcHkodHFlLT5iaXRzLCBkYXRhLCBsZW4pOworCisJaWYgKGxpc3RfbGVuID4gMikKKwkJdHhfcXVldWVfZXZpY3Qoc2NoLCBsaXN0X2xlbi0yKTsKKworCWxsaXN0X2FkZF90YWlsKCZ0cWUtPmxpc3QsICZzY2gtPnR4X3F1ZXVlKTsKKworCXJldHVybiAwOworfQorCisvKiBpbml0aWFsaXplIG9uZSBzdWJjaGFubmVsIG11eGVyIGluc3RhbmNlICovCitpbnQgc3ViY2hhbl9tdXhfaW5pdChzdHJ1Y3Qgc3ViY2hfbXV4ICpteCkKK3sKKwlpbnQgaTsKKworCW1lbXNldChteCwgMCwgc2l6ZW9mKCpteCkpOworCWZvciAoaSA9IDA7IGkgPCBOUl9TVUJDSDsgaSsrKSB7CisJCXN0cnVjdCBtdXhfc3ViY2ggKnNjaCA9ICZteC0+c3ViY2hbaV07CisJCUlOSVRfTExJU1RfSEVBRCgmc2NoLT50eF9xdWV1ZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9zeXN0ZW1faW5mb3JtYXRpb24uYyBiL29wZW5ic2Mvc3JjL3N5c3RlbV9pbmZvcm1hdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZDgzM2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9zeXN0ZW1faW5mb3JtYXRpb24uYwpAQCAtMCwwICsxLDQ5NCBAQAorLyogR1NNIDA0LjA4IFN5c3RlbSBJbmZvcm1hdGlvbiAoU0kpIGVuY29kaW5nIGFuZCBkZWNvZGluZworICogM0dQUCBUUyAwNC4wOCB2ZXJzaW9uIDcuMjEuMCBSZWxlYXNlIDE5OTggLyBFVFNJIFRTIDEwMCA5NDAgVjcuMjEuMCAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcmVzdF9vY3RldHMuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9iaXR2ZWMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisKKyNkZWZpbmUgR1NNNDhfQ0VMTF9DSEFOX0RFU0NfU0laRQkxNgorI2RlZmluZSBHU01fTUFDQkxPQ0tfTEVOIAkJMjMKKyNkZWZpbmUgR1NNX01BQ0JMT0NLX1BBRERJTkcJCTB4MmIKKworLyogdmVyaWZ5IHRoZSBzaXplcyBvZiB0aGUgc3lzdGVtIGluZm9ybWF0aW9uIHR5cGUgc3RydWN0cyAqLworCisvKiByZXN0IG9jdGV0cyBhcmUgbm90IHBhcnQgb2YgdGhlIHN0cnVjdCAqLworc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlX2hlYWRlcikgPT0gMywgX3NpX2hlYWRlcl9zaXplKTsKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBnc200OF9yYWNoX2NvbnRyb2wpID09IDMsIF9zaV9yYWNoX2NvbnRyb2wpOworc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzEpID09IDIyLCBfc2kxX3NpemUpOworc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzIpID09IDIzLCBfc2kyX3NpemUpOworc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzMpID09IDE5LCBfc2kzX3NpemUpOworc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzQpID09IDEzLCBfc2k0X3NpemUpOworCisvKiBiczExIGZvcmdvdCB0aGUgbDIgbGVuLCAwLTYgcmVzdCBvY3RldHMgKi8KK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV81KSA9PSAxOCwgX3NpNV9zaXplKTsKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV82KSA9PSAxMSwgX3NpNl9zaXplKTsKKworc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzEzKSA9PSAzLCBfc2kxM19zaXplKTsKKworLyogRnJlcXVlbmN5IExpc3RzIGFzIHBlciBUUyAwNC4wOCAxMC41LjIuMTMgKi8KKworLyogMTAuNS4yLjEzLjI6IEJpdCBtYXAgMCBmb3JtYXQgKi8KK3N0YXRpYyBpbnQgZnJlcV9saXN0X2JtMF9zZXRfYXJmY24odV9pbnQ4X3QgKmNoYW5fbGlzdCwgdW5zaWduZWQgaW50IGFyZmNuKQoreworCXVuc2lnbmVkIGludCBieXRlLCBiaXQ7CisKKwlpZiAoYXJmY24gPiAxMjQgfHwgYXJmY24gPCAxKSB7CisJCUxPR1AoRFJSLCBMT0dMX0VSUk9SLCAiQml0bWFwIDAgb25seSBzdXBwb3J0cyBBUkZDTiAxLi4uMTI0XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogdGhlIGJpdG1hc2sgaXMgZnJvbSAxLi4xMjQsIG5vdCBmcm9tIDAuLjEyMyAqLworCWFyZmNuLS07CisKKwlieXRlID0gYXJmY24gLyA4OworCWJpdCA9IGFyZmNuICUgODsKKworCWNoYW5fbGlzdFtHU000OF9DRUxMX0NIQU5fREVTQ19TSVpFLTEtYnl0ZV0gfD0gKDEgPDwgYml0KTsKKworCXJldHVybiAwOworfQorCisvKiAxMC41LjIuMTMuNzogVmFyaWFibGUgYml0IG1hcCBmb3JtYXQgKi8KK3N0YXRpYyBpbnQgZnJlcV9saXN0X2JtcmVsX3NldF9hcmZjbih1X2ludDhfdCAqY2hhbl9saXN0LCB1bnNpZ25lZCBpbnQgYXJmY24pCit7CisJdW5zaWduZWQgaW50IGJ5dGUsIGJpdDsKKwl1bnNpZ25lZCBpbnQgbWluX2FyZmNuOworCXVuc2lnbmVkIGludCBiaXRubzsKKworCW1pbl9hcmZjbiA9IChjaGFuX2xpc3RbMF0gJiAxKSA8PCA5OworCW1pbl9hcmZjbiB8PSBjaGFuX2xpc3RbMV0gPDwgMTsKKwltaW5fYXJmY24gfD0gKGNoYW5fbGlzdFsyXSA+PiA3KSAmIDE7CisKKwkvKiBUaGUgbG93ZXIgZW5kIG9mIG91ciBiaXRtYWtzIGlzIGFsd2F5cyBpbXBsaWNpdGx5IGluY2x1ZGVkICovCisJaWYgKGFyZmNuID09IG1pbl9hcmZjbikKKwkJcmV0dXJuIDA7CisKKwlpZiAoYXJmY24gPCBtaW5fYXJmY24pIHsKKwkJTE9HUChEUlIsIExPR0xfRVJST1IsICJhcmZjbigldSkgPCBtaW4oJXUpXG4iLCBhcmZjbiwgbWluX2FyZmNuKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChhcmZjbiA+IG1pbl9hcmZjbiArIDExMSkgeworCQlMT0dQKERSUiwgTE9HTF9FUlJPUiwgImFyZmNuKCV1KSA+IG1pbigldSkgKyAxMTFcbiIsIGFyZmNuLCBtaW5fYXJmY24pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwliaXRubyA9IChhcmZjbiAtIG1pbl9hcmZjbik7CisJYnl0ZSA9IGJpdG5vIC8gODsKKwliaXQgPSBiaXRubyAlIDg7CisKKwljaGFuX2xpc3RbMiArIGJ5dGVdIHw9IDEgPDwgKDcgLSBiaXQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGdlbmVyYXRlIGEgY2VsbCBjaGFubmVsIGxpc3QgYXMgcGVyIFNlY3Rpb24gMTAuNS4yLjFiIG9mIDA0LjA4ICovCitzdGF0aWMgaW50IGJpdHZlYzJmcmVxX2xpc3QodV9pbnQ4X3QgKmNoYW5fbGlzdCwgc3RydWN0IGJpdHZlYyAqYnYsCisJCQkgICAgY29uc3Qgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlpbnQgaSwgcmMsIG1pbiA9IDEwMjQsIG1heCA9IC0xOworCisJbWVtc2V0KGNoYW5fbGlzdCwgMCwgMTYpOworCisJLyogR1NNOTAwLW9ubHkgaGFuZHNldHMgb25seSBzdXBwb3J0ICdiaXQgbWFwIDAgZm9ybWF0JyAqLworCWlmIChidHMtPmJhbmQgPT0gR1NNX0JBTkRfOTAwKSB7CisJCWNoYW5fbGlzdFswXSA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IGJ2LT5kYXRhX2xlbio4OyBpKyspIHsKKwkJCWlmIChiaXR2ZWNfZ2V0X2JpdF9wb3MoYnYsIGkpKSB7CisJCQkJcmMgPSBmcmVxX2xpc3RfYm0wX3NldF9hcmZjbihjaGFuX2xpc3QsIGkpOworCQkJCWlmIChyYyA8IDApCisJCQkJCXJldHVybiByYzsKKwkJCX0KKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBXZSBjdXJyZW50bHkgb25seSBzdXBwb3J0IHRoZSAnVmFyaWFibGUgYml0bWFwIGZvcm1hdCcgKi8KKwljaGFuX2xpc3RbMF0gPSAweDhlOworCisJZm9yIChpID0gMDsgaSA8IGJ2LT5kYXRhX2xlbio4OyBpKyspIHsKKwkJaWYgKGJpdHZlY19nZXRfYml0X3BvcyhidiwgaSkpIHsKKwkJCWlmIChpIDwgbWluKQorCQkJCW1pbiA9IGk7CisJCQlpZiAoaSA+IG1heCkKKwkJCQltYXggPSBpOworCQl9CisJfQorCisJaWYgKG1heCA9PSAtMSkgeworCQkvKiBFbXB0eSBzZXQsIHVzZSAnYml0IG1hcCAwIGZvcm1hdCcgKi8KKwkJY2hhbl9saXN0WzBdID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKChtYXggLSBtaW4pID4gMTExKSB7CisJCUxPR1AoRFJSLCBMT0dMX0VSUk9SLCAibWluX2FyZmNuPSV1LCBtYXhfYXJmY249JXUsICIKKwkJCSJkaXN0YW5jZSA+IDExMVxuIiwgbWluLCBtYXgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljaGFuX2xpc3RbMF0gfD0gKG1pbiA+PiA5KSAmIDE7CisJY2hhbl9saXN0WzFdID0gKG1pbiA+PiAxKTsKKwljaGFuX2xpc3RbMl0gPSAobWluICYgMSkgPDwgNzsKKworCWZvciAoaSA9IDA7IGkgPCBidi0+ZGF0YV9sZW4qODsgaSsrKSB7CisJCWlmIChiaXR2ZWNfZ2V0X2JpdF9wb3MoYnYsIGkpKSB7CisJCQlyYyA9IGZyZXFfbGlzdF9ibXJlbF9zZXRfYXJmY24oY2hhbl9saXN0LCBpKTsKKwkJCWlmIChyYyA8IDApCisJCQkJcmV0dXJuIHJjOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIGdlbmVyYXRlIGEgY2VsbCBjaGFubmVsIGxpc3QgYXMgcGVyIFNlY3Rpb24gMTAuNS4yLjFiIG9mIDA0LjA4ICovCitzdGF0aWMgaW50IGdlbmVyYXRlX2NlbGxfY2hhbl9saXN0KHVfaW50OF90ICpjaGFuX2xpc3QsIHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisJc3RydWN0IGJpdHZlYyAqYnYgPSAmYnRzLT5zaV9jb21tb24uY2VsbF9hbGxvYzsKKworCS8qIGZpcnN0IHdlIGdlbmVyYXRlIGEgYml0dmVjIG9mIGFsbCBUUlggQVJGQ04ncyBpbiBvdXIgQlRTICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJ4LCAmYnRzLT50cnhfbGlzdCwgbGlzdCkKKwkJYml0dmVjX3NldF9iaXRfcG9zKGJ2LCB0cngtPmFyZmNuLCAxKTsKKworCS8qIHRoZW4gd2UgZ2VuZXJhdGUgYSBHU00gMDQuMDggZnJlcXVlbmN5IGxpc3QgZnJvbSB0aGUgYml0dmVjICovCisJcmV0dXJuIGJpdHZlYzJmcmVxX2xpc3QoY2hhbl9saXN0LCBidiwgYnRzKTsKK30KKworLyogZ2VuZXJhdGUgYSBjZWxsIGNoYW5uZWwgbGlzdCBhcyBwZXIgU2VjdGlvbiAxMC41LjIuMWIgb2YgMDQuMDggKi8KK3N0YXRpYyBpbnQgZ2VuZXJhdGVfYmNjaF9jaGFuX2xpc3QodV9pbnQ4X3QgKmNoYW5fbGlzdCwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqY3VyX2J0czsKKwlzdHJ1Y3QgYml0dmVjICpidiA9ICZidHMtPnNpX2NvbW1vbi5uZWlnaF9saXN0OworCisJLyogZmlyc3Qgd2UgZ2VuZXJhdGUgYSBiaXR2ZWMgb2YgdGhlIEJDQ0ggQVJGQ04ncyBpbiBvdXIgQlNDICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoY3VyX2J0cywgJmJ0cy0+bmV0d29yay0+YnRzX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGN1cl9idHMgPT0gYnRzKQorCQkJY29udGludWU7CisJCWJpdHZlY19zZXRfYml0X3BvcyhidiwgY3VyX2J0cy0+YzAtPmFyZmNuLCAxKTsKKwl9CisKKwkvKiB0aGVuIHdlIGdlbmVyYXRlIGEgR1NNIDA0LjA4IGZyZXF1ZW5jeSBsaXN0IGZyb20gdGhlIGJpdHZlYyAqLworCXJldHVybiBiaXR2ZWMyZnJlcV9saXN0KGNoYW5fbGlzdCwgYnYsIGJ0cyk7Cit9CisKK3N0YXRpYyBpbnQgZ2VuZXJhdGVfc2kxKHVfaW50OF90ICpvdXRwdXQsIHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJaW50IHJjOworCXN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV8xICpzaTEgPQorCQkoc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzEgKikgb3V0cHV0OworCisJbWVtc2V0KHNpMSwgR1NNX01BQ0JMT0NLX1BBRERJTkcsIEdTTV9NQUNCTE9DS19MRU4pOworCisJc2kxLT5oZWFkZXIubDJfcGxlbiA9ICgyMSA8PCAyKSB8IDE7CisJc2kxLT5oZWFkZXIucnJfcHJvdG9jb2xfZGlzY3JpbWluYXRvciA9IEdTTTQ4X1BESVNDX1JSOworCXNpMS0+aGVhZGVyLnNraXBfaW5kaWNhdG9yID0gMDsKKwlzaTEtPmhlYWRlci5zeXN0ZW1faW5mb3JtYXRpb24gPSBHU000OF9NVF9SUl9TWVNJTkZPXzE7CisKKwlyYyA9IGdlbmVyYXRlX2NlbGxfY2hhbl9saXN0KHNpMS0+Y2VsbF9jaGFubmVsX2Rlc2NyaXB0aW9uLCBidHMpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXNpMS0+cmFjaF9jb250cm9sID0gYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sOworCisJLyogU0kxIFJlc3QgT2N0ZXRzICgxMC41LjIuMzIpLCBjb250YWlucyBOQ0ggcG9zaXRpb24gKi8KKwlyYyA9IHJlc3Rfb2N0ZXRzX3NpMShzaTEtPnJlc3Rfb2N0ZXRzLCBOVUxMKTsKKwlyZXR1cm4gc2l6ZW9mKCpzaTEpICsgcmM7Cit9CisKK3N0YXRpYyBpbnQgZ2VuZXJhdGVfc2kyKHVfaW50OF90ICpvdXRwdXQsIHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJaW50IHJjOworCXN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV8yICpzaTIgPQorCQkoc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzIgKikgb3V0cHV0OworCisJbWVtc2V0KHNpMiwgR1NNX01BQ0JMT0NLX1BBRERJTkcsIEdTTV9NQUNCTE9DS19MRU4pOworCisJc2kyLT5oZWFkZXIubDJfcGxlbiA9ICgyMiA8PCAyKSB8IDE7CisJc2kyLT5oZWFkZXIucnJfcHJvdG9jb2xfZGlzY3JpbWluYXRvciA9IEdTTTQ4X1BESVNDX1JSOworCXNpMi0+aGVhZGVyLnNraXBfaW5kaWNhdG9yID0gMDsKKwlzaTItPmhlYWRlci5zeXN0ZW1faW5mb3JtYXRpb24gPSBHU000OF9NVF9SUl9TWVNJTkZPXzI7CisKKwlyYyA9IGdlbmVyYXRlX2JjY2hfY2hhbl9saXN0KHNpMi0+YmNjaF9mcmVxdWVuY3lfbGlzdCwgYnRzKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlzaTItPm5jY19wZXJtaXR0ZWQgPSBidHMtPnNpX2NvbW1vbi5uY2NfcGVybWl0dGVkOworCXNpMi0+cmFjaF9jb250cm9sID0gYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sOworCisJcmV0dXJuIHNpemVvZigqc2kyKTsKK30KKworc3RhdGljIHN0cnVjdCBnc200OF9zaV9yb19pbmZvIHNpX2luZm8gPSB7CisJLnNlbGVjdGlvbl9wYXJhbXMgPSB7CisJCS5wcmVzZW50ID0gMCwKKwl9LAorCS5wb3dlcl9vZmZzZXQgPSB7CisJCS5wcmVzZW50ID0gMCwKKwl9LAorCS5zaTJ0ZXJfaW5kaWNhdG9yID0gMCwKKwkuZWFybHlfY21fY3RybCA9IDEsCisJLnNjaGVkdWxpbmcgPSB7CisJCS5wcmVzZW50ID0gMCwKKwl9LAorCS5ncHJzX2luZCA9IHsKKwkJLnNpMTNfcG9zaXRpb24gPSAwLAorCQkucmFfY29sb3VyID0gMCwKKwkJLnByZXNlbnQgPSAxLAorCX0sCisJLmxzYV9wYXJhbXMgPSB7CisJCS5wcmVzZW50ID0gMCwKKwl9LAorCS5jZWxsX2lkID0gMCwJLyogRklYTUU6IGRvZXNuJ3QgdGhlIGJ0cyBoYXZlIHRoaXM/ICovCisJLmJyZWFrX2luZCA9IDAsCit9OworCitzdGF0aWMgaW50IGdlbmVyYXRlX3NpMyh1X2ludDhfdCAqb3V0cHV0LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCWludCByYzsKKwlzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfMyAqc2kzID0KKwkJKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV8zICopIG91dHB1dDsKKworCW1lbXNldChzaTMsIEdTTV9NQUNCTE9DS19QQURESU5HLCBHU01fTUFDQkxPQ0tfTEVOKTsKKworCXNpMy0+aGVhZGVyLmwyX3BsZW4gPSAoMTggPDwgMikgfCAxOworCXNpMy0+aGVhZGVyLnJyX3Byb3RvY29sX2Rpc2NyaW1pbmF0b3IgPSBHU000OF9QRElTQ19SUjsKKwlzaTMtPmhlYWRlci5za2lwX2luZGljYXRvciA9IDA7CisJc2kzLT5oZWFkZXIuc3lzdGVtX2luZm9ybWF0aW9uID0gR1NNNDhfTVRfUlJfU1lTSU5GT18zOworCisJc2kzLT5jZWxsX2lkZW50aXR5ID0gaHRvbnMoYnRzLT5jZWxsX2lkZW50aXR5KTsKKwlnc200OF9nZW5lcmF0ZV9sYWkoJnNpMy0+bGFpLCBidHMtPm5ldHdvcmstPmNvdW50cnlfY29kZSwKKwkJCSAgIGJ0cy0+bmV0d29yay0+bmV0d29ya19jb2RlLAorCQkJICAgYnRzLT5sb2NhdGlvbl9hcmVhX2NvZGUpOworCXNpMy0+Y29udHJvbF9jaGFubmVsX2Rlc2MgPSBidHMtPnNpX2NvbW1vbi5jaGFuX2Rlc2M7CisJc2kzLT5jZWxsX29wdGlvbnMgPSBidHMtPnNpX2NvbW1vbi5jZWxsX29wdGlvbnM7CisJc2kzLT5jZWxsX3NlbF9wYXIgPSBidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXI7CisJc2kzLT5yYWNoX2NvbnRyb2wgPSBidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2w7CisKKwkvKiBTSTMgUmVzdCBPY3RldHMgKDEwLjUuMi4zNCksIGNvbnRhaW5pbmcKKwkJQ0JRLCBDRUxMX1JFU0VMRUNUX09GRlNFVCwgVEVNUE9SQVJZX09GRlNFVCwgUEVOQUxUWV9USU1FCisJCVBvd2VyIE9mZnNldCwgMnRlciBJbmRpY2F0b3IsIEVhcmx5IENsYXNzbWFyayBTZW5kaW5nLAorCQlTY2hlZHVsaW5nIGlmIGFuZCBXSEVSRSwgR1BSUyBJbmRpY2F0b3IsIFNJMTMgcG9zaXRpb24gKi8KKwlyYyA9IHJlc3Rfb2N0ZXRzX3NpMyhzaTMtPnJlc3Rfb2N0ZXRzLCAmc2lfaW5mbyk7CisKKwlyZXR1cm4gc2l6ZW9mKCpzaTMpICsgcmM7Cit9CisKK3N0YXRpYyBpbnQgZ2VuZXJhdGVfc2k0KHVfaW50OF90ICpvdXRwdXQsIHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJaW50IHJjOworCXN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV80ICpzaTQgPQorCQkoc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzQgKikgb3V0cHV0OworCisJLyogbGVuZ3RoIG9mIGFsbCBJRXMgcHJlc2VudCBleGNlcHQgU0k0IHJlc3Qgb2N0ZXRzIGFuZCBsMl9wbGVuICovCisJaW50IGwyX3BsZW4gPSBzaXplb2YoKnNpNCkgLSAxOworCisJbWVtc2V0KHNpNCwgR1NNX01BQ0JMT0NLX1BBRERJTkcsIEdTTV9NQUNCTE9DS19MRU4pOworCisJc2k0LT5oZWFkZXIucnJfcHJvdG9jb2xfZGlzY3JpbWluYXRvciA9IEdTTTQ4X1BESVNDX1JSOworCXNpNC0+aGVhZGVyLnNraXBfaW5kaWNhdG9yID0gMDsKKwlzaTQtPmhlYWRlci5zeXN0ZW1faW5mb3JtYXRpb24gPSBHU000OF9NVF9SUl9TWVNJTkZPXzQ7CisKKwlnc200OF9nZW5lcmF0ZV9sYWkoJnNpNC0+bGFpLCBidHMtPm5ldHdvcmstPmNvdW50cnlfY29kZSwKKwkJCSAgIGJ0cy0+bmV0d29yay0+bmV0d29ya19jb2RlLAorCQkJICAgYnRzLT5sb2NhdGlvbl9hcmVhX2NvZGUpOworCXNpNC0+Y2VsbF9zZWxfcGFyID0gYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyOworCXNpNC0+cmFjaF9jb250cm9sID0gYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sOworCisJLyogT3B0aW9uYWw6IENCQ0ggQ2hhbm5lbCBEZXNjcmlwdGlvbiArIENCQ0ggTW9iaWxlIEFsbG9jYXRpb24gKi8KKworCXNpNC0+aGVhZGVyLmwyX3BsZW4gPSAobDJfcGxlbiA8PCAyKSB8IDE7CisKKwkvKiBTSTQgUmVzdCBPY3RldHMgKDEwLjUuMi4zNSksIGNvbnRhaW5pbmcKKwkJT3B0aW9uYWwgUG93ZXIgb2Zmc2V0LCBHUFJTIEluZGljYXRvciwKKwkJQ2VsbCBJZGVudGl0eSwgTFNBIElELCBTZWxlY3Rpb24gUGFyYW1ldGVyICovCisJcmMgPSByZXN0X29jdGV0c19zaTQoc2k0LT5kYXRhLCAmc2lfaW5mbyk7CisKKwlyZXR1cm4gc2l6ZW9mKCpzaTQpICsgcmM7Cit9CisKK3N0YXRpYyBpbnQgZ2VuZXJhdGVfc2k1KHVfaW50OF90ICpvdXRwdXQsIHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzUgKnNpNTsKKwlpbnQgcmMsIGwyX3BsZW4gPSAxODsKKworCW1lbXNldChvdXRwdXQsIEdTTV9NQUNCTE9DS19QQURESU5HLCBHU01fTUFDQkxPQ0tfTEVOKTsKKworCS8qIGlwLmFjY2VzcyBuYW5vQlRTIG5lZWRzIGwyX3BsZW4hISAqLworCWlmIChpc19pcGFjY2Vzc19idHMoYnRzKSkgeworCQkqb3V0cHV0KysgPSAobDJfcGxlbiA8PCAyKSB8IDE7CisJCWwyX3BsZW4rKzsKKwl9CisKKwlzaTUgPSAoc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzUgKikgb3V0cHV0OworCisJLyogbDIgcHNldWRvIGxlbmd0aCwgbm90IHBhcnQgb2YgbXNnOiAxOCAqLworCXNpNS0+cnJfcHJvdG9jb2xfZGlzY3JpbWluYXRvciA9IEdTTTQ4X1BESVNDX1JSOworCXNpNS0+c2tpcF9pbmRpY2F0b3IgPSAwOworCXNpNS0+c3lzdGVtX2luZm9ybWF0aW9uID0gR1NNNDhfTVRfUlJfU1lTSU5GT181OworCXJjID0gZ2VuZXJhdGVfYmNjaF9jaGFuX2xpc3Qoc2k1LT5iY2NoX2ZyZXF1ZW5jeV9saXN0LCBidHMpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCS8qIDA0LjA4IDkuMS4zNzogTDIgUHNldWRvIExlbmd0aCBvZiAxOCAqLworCXJldHVybiBsMl9wbGVuOworfQorCitzdGF0aWMgaW50IGdlbmVyYXRlX3NpNih1X2ludDhfdCAqb3V0cHV0LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV82ICpzaTY7CisJaW50IGwyX3BsZW4gPSAxMTsKKworCW1lbXNldChvdXRwdXQsIEdTTV9NQUNCTE9DS19QQURESU5HLCBHU01fTUFDQkxPQ0tfTEVOKTsKKworCS8qIGlwLmFjY2VzcyBuYW5vQlRTIG5lZWRzIGwyX3BsZW4hISAqLworCWlmIChpc19pcGFjY2Vzc19idHMoYnRzKSkgeworCQkqb3V0cHV0KysgPSAobDJfcGxlbiA8PCAyKSB8IDE7CisJCWwyX3BsZW4rKzsKKwl9CisKKwlzaTYgPSAoc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzYgKikgb3V0cHV0OworCisJLyogbDIgcHNldWRvIGxlbmd0aCwgbm90IHBhcnQgb2YgbXNnOiAxMSAqLworCXNpNi0+cnJfcHJvdG9jb2xfZGlzY3JpbWluYXRvciA9IEdTTTQ4X1BESVNDX1JSOworCXNpNi0+c2tpcF9pbmRpY2F0b3IgPSAwOworCXNpNi0+c3lzdGVtX2luZm9ybWF0aW9uID0gR1NNNDhfTVRfUlJfU1lTSU5GT182OworCXNpNi0+Y2VsbF9pZGVudGl0eSA9IGh0b25zKGJ0cy0+Y2VsbF9pZGVudGl0eSk7CisJZ3NtNDhfZ2VuZXJhdGVfbGFpKCZzaTYtPmxhaSwgYnRzLT5uZXR3b3JrLT5jb3VudHJ5X2NvZGUsCisJCQkgICBidHMtPm5ldHdvcmstPm5ldHdvcmtfY29kZSwKKwkJCSAgIGJ0cy0+bG9jYXRpb25fYXJlYV9jb2RlKTsKKwlzaTYtPmNlbGxfb3B0aW9ucyA9IGJ0cy0+c2lfY29tbW9uLmNlbGxfb3B0aW9uczsKKwlzaTYtPm5jY19wZXJtaXR0ZWQgPSBidHMtPnNpX2NvbW1vbi5uY2NfcGVybWl0dGVkOworCisJLyogU0k2IFJlc3QgT2N0ZXRzOiAxMC41LjIuMzVhOiBQQ0ggLyBOQ0ggaW5mbywgVkJTL1ZHQ1Mgb3B0aW9ucyAqLworCisJcmV0dXJuIGwyX3BsZW47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtNDhfc2kxM19pbmZvIHNpMTNfZGVmYXVsdCA9IHsKKwkuY2VsbF9vcHRzID0geworCQkubm1vIAkJPSBHUFJTX05NT19JSUksCisJCS50MzE2OAkJPSAxNTAwLAorCQkudDMxOTIJCT0gNTAwLAorCQkuZHJ4X3RpbWVyX21heAk9IDMsCisJCS5ic19jdl9tYXgJPSAxNSwKKwkJLmV4dF9pbmZvX3ByZXNlbnQgPSAwLAorCQkuZXh0X2luZm8gPSB7CisJCQkvKiBUaGUgdmFsdWVzIGJlbG93IGFyZSBqdXN0IGd1ZXNzZXMgISAqLworCQkJLmVncHJzX3N1cHBvcnRlZCA9IDAsCisJCQkudXNlX2VncHJzX3BfY2hfcmVxID0gMSwKKwkJCS5iZXBfcGVyaW9kID0gNCwKKwkJCS5wZmNfc3VwcG9ydGVkID0gMCwKKwkJCS5kdG1fc3VwcG9ydGVkID0gMCwKKwkJCS5ic3NfcGFnaW5nX2Nvb3JkaW5hdGlvbiA9IDAsCisJCX0sCisJfSwKKwkucHdyX2N0cmxfcGFycyA9IHsKKwkJLmFscGhhCQk9IDEwLAkvKiBhID0gMS4wICovCisJCS50X2F2Z193CT0gMjUsCisJCS50X2F2Z190CT0gMjUsCisJCS5wY19tZWFzX2NoYW4JPSAwLCAJLyogZG93bmxpbmcgbWVhc3VyZWQgb24gQ0NDSCAqLworCQkubl9hdmdfaQk9IDE1LAorCX0sCisJLmJjY2hfY2hhbmdlX21hcmsJPSAxLAorCS5zaV9jaGFuZ2VfZmllbGQJPSAwLAorCS5wYmNjaF9wcmVzZW50CQk9IDAsCisJeworCQkubm9fcGJjY2ggPSB7CisJCQkucmFjCQk9IDAsCS8qIG5lZWRzIHRvIGJlIHBhdGNoZWQgKi8KKwkJCS5zcGdjX2NjY2hfc3VwIAk9IDAsCisJCQkubmV0X2N0cmxfb3JkCT0gMCwKKwkJCS5wcmlvX2FjY190aHIJPSA2LAorCQl9LAorCX0sCit9OworCitzdGF0aWMgaW50IGdlbmVyYXRlX3NpMTModV9pbnQ4X3QgKm91dHB1dCwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfMTMgKnNpMTMgPQorCQkoc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzEzICopIG91dHB1dDsKKwlpbnQgcmV0OworCisJbWVtc2V0KHNpMTMsIEdTTV9NQUNCTE9DS19QQURESU5HLCBHU01fTUFDQkxPQ0tfTEVOKTsKKworCXNpMTMtPmhlYWRlci5ycl9wcm90b2NvbF9kaXNjcmltaW5hdG9yID0gR1NNNDhfUERJU0NfUlI7CisJc2kxMy0+aGVhZGVyLnNraXBfaW5kaWNhdG9yID0gMDsKKwlzaTEzLT5oZWFkZXIuc3lzdGVtX2luZm9ybWF0aW9uID0gR1NNNDhfTVRfUlJfU1lTSU5GT18xMzsKKworCXNpMTNfZGVmYXVsdC5ub19wYmNjaC5yYWMgPSBidHMtPmdwcnMucmFjOworCisJcmV0ID0gcmVzdF9vY3RldHNfc2kxMyhzaTEzLT5yZXN0X29jdGV0cywgJnNpMTNfZGVmYXVsdCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlzaTEzLT5oZWFkZXIubDJfcGxlbiA9IHJldCAmIDB4ZmY7CisKKwlyZXR1cm4gc2l6ZW9mICgqc2kxMykgKyByZXQ7Cit9CisKK2ludCBnc21fZ2VuZXJhdGVfc2kodV9pbnQ4X3QgKm91dHB1dCwgc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IHR5cGUpCit7CisJc3dpdGNoIChidHMtPmdwcnMubW9kZSkgeworCWNhc2UgQlRTX0dQUlNfRUdQUlM6CisJCXNpMTNfZGVmYXVsdC5jZWxsX29wdHMuZXh0X2luZm9fcHJlc2VudCA9IDE7CisJCXNpMTNfZGVmYXVsdC5jZWxsX29wdHMuZXh0X2luZm8uZWdwcnNfc3VwcG9ydGVkID0gMTsKKwkJLyogZmFsbHRocm91Z2ggKi8KKwljYXNlIEJUU19HUFJTX0dQUlM6CisJCXNpX2luZm8uZ3Byc19pbmQucHJlc2VudCA9IDE7CisJCWJyZWFrOworCWNhc2UgQlRTX0dQUlNfTk9ORToKKwkJc2lfaW5mby5ncHJzX2luZC5wcmVzZW50ID0gMDsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBSU0xfU1lTVEVNX0lORk9fMToKKwkJcmV0dXJuIGdlbmVyYXRlX3NpMShvdXRwdXQsIGJ0cyk7CisJY2FzZSBSU0xfU1lTVEVNX0lORk9fMjoKKwkJcmV0dXJuIGdlbmVyYXRlX3NpMihvdXRwdXQsIGJ0cyk7CisJY2FzZSBSU0xfU1lTVEVNX0lORk9fMzoKKwkJcmV0dXJuIGdlbmVyYXRlX3NpMyhvdXRwdXQsIGJ0cyk7CisJY2FzZSBSU0xfU1lTVEVNX0lORk9fNDoKKwkJcmV0dXJuIGdlbmVyYXRlX3NpNChvdXRwdXQsIGJ0cyk7CisJY2FzZSBSU0xfU1lTVEVNX0lORk9fNToKKwkJcmV0dXJuIGdlbmVyYXRlX3NpNShvdXRwdXQsIGJ0cyk7CisJY2FzZSBSU0xfU1lTVEVNX0lORk9fNjoKKwkJcmV0dXJuIGdlbmVyYXRlX3NpNihvdXRwdXQsIGJ0cyk7CisJY2FzZSBSU0xfU1lTVEVNX0lORk9fMTM6CisJCXJldHVybiBnZW5lcmF0ZV9zaTEzKG91dHB1dCwgYnRzKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3RhbGxvY19jdHguYyBiL29wZW5ic2Mvc3JjL3RhbGxvY19jdHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjM3M2I0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvdGFsbG9jX2N0eC5jCkBAIC0wLDAgKzEsMzYgQEAKKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisKK2V4dGVybiB2b2lkICp0YWxsX21zZ2JfY3R4OworZXh0ZXJuIHZvaWQgKnRhbGxfZmxlX2N0eDsKK2V4dGVybiB2b2lkICp0YWxsX2xvY29wX2N0eDsKK2V4dGVybiB2b2lkICp0YWxsX2dzbXNfY3R4OworZXh0ZXJuIHZvaWQgKnRhbGxfc3Vic2NyX2N0eDsKK2V4dGVybiB2b2lkICp0YWxsX3N1Yl9yZXFfY3R4OworZXh0ZXJuIHZvaWQgKnRhbGxfY2FsbF9jdHg7CitleHRlcm4gdm9pZCAqdGFsbF9wYWdpbmdfY3R4OworZXh0ZXJuIHZvaWQgKnRhbGxfc2lnaF9jdHg7CitleHRlcm4gdm9pZCAqdGFsbF90cWVfY3R4OworZXh0ZXJuIHZvaWQgKnRhbGxfdHJhbnNfY3R4OworZXh0ZXJuIHZvaWQgKnRhbGxfbWFwX2N0eDsKK2V4dGVybiB2b2lkICp0YWxsX3VwcV9jdHg7CitleHRlcm4gdm9pZCAqdGFsbF9jdHJfY3R4OworCit2b2lkIHRhbGxvY19jdHhfaW5pdCh2b2lkKQoreworCXRhbGxfbXNnYl9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAwLCAibXNnYiIpOworCXRhbGxfZmxlX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsCisJCQkJCSAgImJzMTFfZmlsZV9saXN0X2VudHJ5Iik7CisJdGFsbF9sb2NvcF9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAwLCAibG9jX3VwZGF0aW5nX29wZXIiKTsKKwl0YWxsX2dzbXNfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgInNtcyIpOworCXRhbGxfc3Vic2NyX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsICJzdWJzY3JpYmVyIik7CisJdGFsbF9zdWJfcmVxX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsICJzdWJzY3JfcmVxdWVzdCIpOworCXRhbGxfY2FsbF9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAwLCAiZ3NtX2NhbGwiKTsKKwl0YWxsX3BhZ2luZ19jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAwLCAicGFnaW5nX3JlcXVlc3QiKTsKKwl0YWxsX3NpZ2hfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgInNpZ25hbF9oYW5kbGVyIik7CisJdGFsbF90cWVfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgInN1YmNoX3R4cV9lbnRyeSIpOworCXRhbGxfdHJhbnNfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgInRyYW5zYWN0aW9uIik7CisJdGFsbF9tYXBfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgInRyYXVfbWFwX2VudHJ5Iik7CisJdGFsbF91cHFfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgInRyYXVfdXBxX2VudHJ5Iik7CisJdGFsbF9jdHJfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgImNvdW50ZXIiKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3RlbG5ldF9pbnRlcmZhY2UuYyBiL29wZW5ic2Mvc3JjL3RlbG5ldF9pbnRlcmZhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2RlMDI2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvdGVsbmV0X2ludGVyZmFjZS5jCkBAIC0wLDAgKzEsMjA5IEBACisvKiBtaW5pbWFsaXN0aWMgdGVsbmV0L25ldHdvcmsgaW50ZXJmYWNlIGl0IG1pZ2h0IHR1cm4gaW50byBhIHdpcmUgaW50ZXJmYWNlICovCisvKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+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+bGNoYW4tPmNvbm4uc3Vic2NyLT5leHRlbnNpb247CisJY2hhciByZXNwb25zZV9zdHJpbmdbR1NNX0VYVEVOU0lPTl9MRU5HVEggKyAyMF07CisKKwkvKiBOZWVkIHRyYWlsaW5nIENSIGFzIEVPVCBjaGFyYWN0ZXIgKi8KKwlzbnByaW50ZihyZXNwb25zZV9zdHJpbmcsIHNpemVvZihyZXNwb25zZV9zdHJpbmcpLCAiWW91ciBleHRlbnNpb24gaXMgJXNcciIsIG93bl9udW1iZXIpOworCXJldHVybiBnc20wNDgwX3NlbmRfdXNzZF9yZXNwb25zZShtc2csIHJlc3BvbnNlX3N0cmluZywgcmVxKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3Z0eS9idWZmZXIuYyBiL29wZW5ic2Mvc3JjL3Z0eS9idWZmZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmMxNzYwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvdnR5L2J1ZmZlci5jCkBAIC0wLDAgKzEsNDYzIEBACisvKgorICogQnVmZmVyaW5nIG9mIG91dHB1dCBhbmQgaW5wdXQuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggS3VuaWhpcm8gSXNoaWd1cm8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgWmVicmEuCisgKgorICogR05VIFplYnJhIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBHTlUgWmVicmEgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEdOVSBaZWJyYTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPHZ0eS9idWZmZXIuaD4KKyNpbmNsdWRlIDx2dHkvdnR5Lmg+CisKKy8qIEJ1ZmZlciBtYXN0ZXIuICovCitzdHJ1Y3QgYnVmZmVyIHsKKwkvKiBEYXRhIGxpc3QuICovCisJc3RydWN0IGJ1ZmZlcl9kYXRhICpoZWFkOworCXN0cnVjdCBidWZmZXJfZGF0YSAqdGFpbDsKKworCS8qIFNpemUgb2YgZWFjaCBidWZmZXJfZGF0YSBjaHVuay4gKi8KKwlzaXplX3Qgc2l6ZTsKK307CisKKy8qIERhdGEgY29udGFpbmVyLiAqLworc3RydWN0IGJ1ZmZlcl9kYXRhIHsKKwlzdHJ1Y3QgYnVmZmVyX2RhdGEgKm5leHQ7CisKKwkvKiBMb2NhdGlvbiB0byBhZGQgbmV3IGRhdGEuICovCisJc2l6ZV90IGNwOworCisJLyogUG9pbnRlciB0byBkYXRhIG5vdCB5ZXQgZmx1c2hlZC4gKi8KKwlzaXplX3Qgc3A7CisKKwkvKiBBY3R1YWwgZGF0YSBzdHJlYW0gKHZhcmlhYmxlIGxlbmd0aCkuICovCisJdW5zaWduZWQgY2hhciBkYXRhWzBdOwkvKiByZWFsIGRpbWVuc2lvbiBpcyBidWZmZXItPnNpemUgKi8KK307CisKKy8qIEl0IHNob3VsZCBhbHdheXMgYmUgdHJ1ZSB0aGF0OiAwIDw9IHNwIDw9IGNwIDw9IHNpemUgKi8KKworLyogRGVmYXVsdCBidWZmZXIgc2l6ZSAodXNlZCBpZiBub25lIHNwZWNpZmllZCkuICBJdCBpcyByb3VuZGVkIHVwIHRvIHRoZQorICAgbmV4dCBwYWdlIGJvdW5kZXJ5LiAqLworI2RlZmluZSBCVUZGRVJfU0laRV9ERUZBVUxUCQk0MDk2CisKKyNkZWZpbmUgQlVGRkVSX0RBVEFfRlJFRShEKSB0YWxsb2NfZnJlZSgoRCkpCisKKy8qIE1ha2UgbmV3IGJ1ZmZlci4gKi8KK3N0cnVjdCBidWZmZXIgKmJ1ZmZlcl9uZXcodm9pZCAqY3R4LCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgYnVmZmVyICpiOworCisJYiA9IHRhbGxvY196ZXJvKGN0eCwgc3RydWN0IGJ1ZmZlcik7CisKKwlpZiAoc2l6ZSkKKwkJYi0+c2l6ZSA9IHNpemU7CisJZWxzZSB7CisJCXN0YXRpYyBzaXplX3QgZGVmYXVsdF9zaXplOworCQlpZiAoIWRlZmF1bHRfc2l6ZSkgeworCQkJbG9uZyBwZ3N6ID0gc3lzY29uZihfU0NfUEFHRVNJWkUpOworCQkJZGVmYXVsdF9zaXplID0KKwkJCSAgICAoKCgoQlVGRkVSX1NJWkVfREVGQVVMVCAtIDEpIC8gcGdzeikgKyAxKSAqIHBnc3opOworCQl9CisJCWItPnNpemUgPSBkZWZhdWx0X3NpemU7CisJfQorCisJcmV0dXJuIGI7Cit9CisKKy8qIEZyZWUgYnVmZmVyLiAqLwordm9pZCBidWZmZXJfZnJlZShzdHJ1Y3QgYnVmZmVyICpiKQoreworCWJ1ZmZlcl9yZXNldChiKTsKKwl0YWxsb2NfZnJlZShiKTsKK30KKworLyogTWFrZSBzdHJpbmcgY2xvbmUuICovCitjaGFyICpidWZmZXJfZ2V0c3RyKHN0cnVjdCBidWZmZXIgKmIpCit7CisJc2l6ZV90IHRvdGxlbiA9IDA7CisJc3RydWN0IGJ1ZmZlcl9kYXRhICpkYXRhOworCWNoYXIgKnM7CisJY2hhciAqcDsKKworCWZvciAoZGF0YSA9IGItPmhlYWQ7IGRhdGE7IGRhdGEgPSBkYXRhLT5uZXh0KQorCQl0b3RsZW4gKz0gZGF0YS0+Y3AgLSBkYXRhLT5zcDsKKwlpZiAoIShzID0gX3RhbGxvY196ZXJvKHRhbGxfdnR5X2N0eCwgKHRvdGxlbiArIDEpLCAiYnVmZmVyX2dldHN0ciIpKSkKKwkJcmV0dXJuIE5VTEw7CisJcCA9IHM7CisJZm9yIChkYXRhID0gYi0+aGVhZDsgZGF0YTsgZGF0YSA9IGRhdGEtPm5leHQpIHsKKwkJbWVtY3B5KHAsIGRhdGEtPmRhdGEgKyBkYXRhLT5zcCwgZGF0YS0+Y3AgLSBkYXRhLT5zcCk7CisJCXAgKz0gZGF0YS0+Y3AgLSBkYXRhLT5zcDsKKwl9CisJKnAgPSAnXDAnOworCXJldHVybiBzOworfQorCisvKiBSZXR1cm4gMSBpZiBidWZmZXIgaXMgZW1wdHkuICovCitpbnQgYnVmZmVyX2VtcHR5KHN0cnVjdCBidWZmZXIgKmIpCit7CisJcmV0dXJuIChiLT5oZWFkID09IE5VTEwpOworfQorCisvKiBDbGVhciBhbmQgZnJlZSBhbGwgYWxsb2NhdGVkIGRhdGEuICovCit2b2lkIGJ1ZmZlcl9yZXNldChzdHJ1Y3QgYnVmZmVyICpiKQoreworCXN0cnVjdCBidWZmZXJfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgYnVmZmVyX2RhdGEgKm5leHQ7CisKKwlmb3IgKGRhdGEgPSBiLT5oZWFkOyBkYXRhOyBkYXRhID0gbmV4dCkgeworCQluZXh0ID0gZGF0YS0+bmV4dDsKKwkJQlVGRkVSX0RBVEFfRlJFRShkYXRhKTsKKwl9CisJYi0+aGVhZCA9IGItPnRhaWwgPSBOVUxMOworfQorCisvKiBBZGQgYnVmZmVyX2RhdGEgdG8gdGhlIGVuZCBvZiBidWZmZXIuICovCitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9kYXRhICpidWZmZXJfYWRkKHN0cnVjdCBidWZmZXIgKmIpCit7CisJc3RydWN0IGJ1ZmZlcl9kYXRhICpkOworCisJZCA9IF90YWxsb2NfemVybyhiLAorCQkJIG9mZnNldG9mKHN0cnVjdCBidWZmZXJfZGF0YSwgZGF0YVtiLT5zaXplXSksCisJCQkgImJ1ZmZlcl9hZGQiKTsKKwlpZiAoIWQpCisJCXJldHVybiBOVUxMOworCWQtPmNwID0gZC0+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/ICBUaGlzIGNvdWxkIGhlbHAgcmVkdWNlIGxhdGVuY3kgaW4gcHVzaGluZyBvdXQgdGhlIGRhdGEgaWYgd2UgYXJlIHN0dWNrIGluIGEgbG9uZy1ydW5uaW5nIHRocmVhZCB0aGF0IGlzIHByZXZlbnRpbmcgdGhlIG1haW4gc2VsZWN0IGxvb3AgZnJvbSBjYWxsaW5nIHRoZSBmbHVzaCB0aHJlYWQuLi4gKi8KKworCWlmIChiLT5oZWFkICYmIChidWZmZXJfZmx1c2hfYXZhaWxhYmxlKGIsIGZkKSA9PSBCVUZGRVJfRVJST1IpKQorCQlyZXR1cm4gQlVGRkVSX0VSUk9SOworI2VuZGlmCisJaWYgKGItPmhlYWQpCisJCS8qIEJ1ZmZlciBpcyBub3QgZW1wdHksIHNvIGRvIG5vdCBhdHRlbXB0IHRvIHdyaXRlIHRoZSBuZXcgZGF0YS4gKi8KKwkJbmJ5dGVzID0gMDsKKwllbHNlIGlmICgobmJ5dGVzID0gd3JpdGUoZmQsIHAsIHNpemUpKSA8IDApIHsKKwkJaWYgKEVSUk5PX0lPX1JFVFJZKGVycm5vKSkKKwkJCW5ieXRlcyA9IDA7CisJCWVsc2UKKwkJCXJldHVybiBCVUZGRVJfRVJST1I7CisJfQorCS8qIEFkZCBhbnkgcmVtYWluaW5nIGRhdGEgdG8gdGhlIGJ1ZmZlci4gKi8KKwl7CisJCXNpemVfdCB3cml0dGVuID0gbmJ5dGVzOworCQlpZiAod3JpdHRlbiA8IHNpemUpCisJCQlidWZmZXJfcHV0KGIsICgoY29uc3QgY2hhciAqKXApICsgd3JpdHRlbiwKKwkJCQkgICBzaXplIC0gd3JpdHRlbik7CisJfQorCXJldHVybiBiLT5oZWFkID8gQlVGRkVSX1BFTkRJTkcgOiBCVUZGRVJfRU1QVFk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy92dHkvY2FyZHNoZWxsLmggYi9vcGVuYnNjL3NyYy92dHkvY2FyZHNoZWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUxNjRkMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3Z0eS9jYXJkc2hlbGwuaApAQCAtMCwwICsxLDYgQEAKKyNpbmNsdWRlICIuLi8uLi9ic2Njb25maWcuaCIKKyNkZWZpbmUgUVVBR0dBX1BST0dOQU1FCVBBQ0tBR0VfTkFNRQorI2RlZmluZSBRVUFHR0FfVkVSU0lPTglQQUNLQUdFX1ZFUlNJT04KKyNkZWZpbmUgUVVBR0dBX0NPUFlSSUdIVCAiSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4iCisjZGVmaW5lIENPTkZJR0ZJTEVfTUFTSyAwMjIKKyNkZWZpbmUgU1lTQ09ORkRJUiAiL3Vzci9sb2NhbC9ldGMiCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy92dHkvY29tbWFuZC5jIGIvb3BlbmJzYy9zcmMvdnR5L2NvbW1hbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2U2ODA0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvdnR5L2NvbW1hbmQuYwpAQCAtMCwwICsxLDM0MTYgQEAKKy8qCisgICAkSWQ6IGNvbW1hbmQuYyx2IDEuNDcgMjAwNS8wNC8yNSAxNjoyNjo0MiBwYXVsIEV4cCAkCisKKyAgIENvbW1hbmQgaW50ZXJwcmV0ZXIgcm91dGluZSBmb3IgdmlydHVhbCB0ZXJtaW5hbCBbYWthIFRlbGV0WXBlXQorICAgQ29weXJpZ2h0IChDKSAxOTk3LCA5OCwgOTkgS3VuaWhpcm8gSXNoaWd1cm8KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIFplYnJhLgorCitHTlUgWmVicmEgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKK2J5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyCitvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitHTlUgWmVicmEgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCBHTlUgWmVicmE7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiY2FyZHNoZWxsLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+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+bm9kZSA9IFZJRVdfTk9ERTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIERvd24gdnR5IG5vZGUgbGV2ZWwuICovCitnREVGVU4oY29uZmlnX2V4aXQsCisgICAgICBjb25maWdfZXhpdF9jbWQsICJleGl0IiwgIkV4aXQgY3VycmVudCBtb2RlIGFuZCBkb3duIHRvIHByZXZpb3VzIG1vZGVcbiIpCit7CisJc3dpdGNoICh2dHktPm5vZGUpIHsKKwljYXNlIEdTTU5FVF9OT0RFOgorCQl2dHktPm5vZGUgPSBDT05GSUdfTk9ERTsKKwkJdnR5LT5pbmRleCA9IE5VTEw7CisJCWJyZWFrOworCWNhc2UgQlRTX05PREU6CisJCXZ0eS0+bm9kZSA9IEdTTU5FVF9OT0RFOworCQl7CisJCQkvKiBzZXQgdnR5LT5pbmRleCBjb3JyZWN0bHkgISAqLworCQkJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJCQl2dHktPmluZGV4ID0gYnRzLT5uZXR3b3JrOworCQl9CisJCWJyZWFrOworCWNhc2UgVFJYX05PREU6CisJCXZ0eS0+bm9kZSA9IEJUU19OT0RFOworCQl7CisJCQkvKiBzZXQgdnR5LT5pbmRleCBjb3JyZWN0bHkgISAqLworCQkJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSB2dHktPmluZGV4OworCQkJdnR5LT5pbmRleCA9IHRyeC0+YnRzOworCQl9CisJCWJyZWFrOworCWNhc2UgVFNfTk9ERToKKwkJdnR5LT5ub2RlID0gVFJYX05PREU7CisJCXsKKwkJCS8qIHNldCB2dHktPmluZGV4IGNvcnJlY3RseSAhICovCisJCQlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzID0gdnR5LT5pbmRleDsKKwkJCXZ0eS0+aW5kZXggPSB0cy0+dHJ4OworCQl9CisJCWJyZWFrOworCWNhc2UgU1VCU0NSX05PREU6CisJCXZ0eS0+bm9kZSA9IFZJRVdfTk9ERTsKKwkJc3Vic2NyX3B1dCh2dHktPmluZGV4KTsKKwkJdnR5LT5pbmRleCA9IE5VTEw7CisJCWJyZWFrOworCWNhc2UgVklFV19OT0RFOgorCWNhc2UgRU5BQkxFX05PREU6CisJCWlmICgwKQkJLy92dHlfc2hlbGwgKHZ0eSkpCisJCQlleGl0KDApOworCQllbHNlCisJCQl2dHktPnN0YXR1cyA9IFZUWV9DTE9TRTsKKwkJYnJlYWs7CisJY2FzZSBDT05GSUdfTk9ERToKKwkJdnR5LT5ub2RlID0gRU5BQkxFX05PREU7CisJCXZ0eV9jb25maWdfdW5sb2NrKHZ0eSk7CisJCWJyZWFrOworCWNhc2UgVlRZX05PREU6CisJCXZ0eS0+bm9kZSA9IENPTkZJR19OT0RFOworCQlicmVhazsKKwljYXNlIE1HQ1BfTk9ERToKKwljYXNlIEdCUFJPWFlfTk9ERToKKwljYXNlIFNHU05fTk9ERToKKwkJdnR5LT5ub2RlID0gQ09ORklHX05PREU7CisJCXZ0eS0+aW5kZXggPSBOVUxMOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIHF1aXQgaXMgYWxpYXMgb2YgZXhpdC4gKi8KK2dBTElBUyhjb25maWdfZXhpdCwKKyAgICAgIGNvbmZpZ19xdWl0X2NtZCwgInF1aXQiLCAiRXhpdCBjdXJyZW50IG1vZGUgYW5kIGRvd24gdG8gcHJldmlvdXMgbW9kZVxuIikKKworLyogRW5kIG9mIGNvbmZpZ3VyYXRpb24uICovCisgICAgZ0RFRlVOKGNvbmZpZ19lbmQsCisgICAgICBjb25maWdfZW5kX2NtZCwgImVuZCIsICJFbmQgY3VycmVudCBtb2RlIGFuZCBjaGFuZ2UgdG8gZW5hYmxlIG1vZGUuIikKK3sKKwlzd2l0Y2ggKHZ0eS0+bm9kZSkgeworCWNhc2UgVklFV19OT0RFOgorCWNhc2UgRU5BQkxFX05PREU6CisJCS8qIE5vdGhpbmcgdG8gZG8uICovCisJCWJyZWFrOworCWNhc2UgQ09ORklHX05PREU6CisJY2FzZSBWVFlfTk9ERToKKwkJdnR5X2NvbmZpZ191bmxvY2sodnR5KTsKKwkJdnR5LT5ub2RlID0gRU5BQkxFX05PREU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIFNob3cgdmVyc2lvbi4gKi8KK0RFRlVOKHNob3dfdmVyc2lvbiwKKyAgICAgIHNob3dfdmVyc2lvbl9jbWQsICJzaG93IHZlcnNpb24iLCBTSE9XX1NUUiAiRGlzcGxheXMgcHJvZ3JhbSB2ZXJzaW9uXG4iKQoreworCXZ0eV9vdXQodnR5LCAiJXMgJXMgKCVzKS4lcyIsIFFVQUdHQV9QUk9HTkFNRSwgUVVBR0dBX1ZFUlNJT04sCisJCWhvc3QubmFtZSA/IGhvc3QubmFtZSA6ICIiLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIlcyVzIiwgUVVBR0dBX0NPUFlSSUdIVCwgVlRZX05FV0xJTkUpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBIZWxwIGRpc3BsYXkgZnVuY3Rpb24gZm9yIGFsbCBub2RlLiAqLworZ0RFRlVOKGNvbmZpZ19oZWxwLAorICAgICAgY29uZmlnX2hlbHBfY21kLCAiaGVscCIsICJEZXNjcmlwdGlvbiBvZiB0aGUgaW50ZXJhY3RpdmUgaGVscCBzeXN0ZW1cbiIpCit7CisJdnR5X291dCh2dHksCisJCSJUaGlzIFZUWSBwcm92aWRlcyBhZHZhbmNlZCBoZWxwIGZlYXR1cmVzLiAgV2hlbiB5b3UgbmVlZCBoZWxwLCVzXAorYW55dGltZSBhdCB0aGUgY29tbWFuZCBsaW5lIHBsZWFzZSBwcmVzcyAnPycuJXNcCislc1wKK0lmIG5vdGhpbmcgbWF0Y2hlcywgdGhlIGhlbHAgbGlzdCB3aWxsIGJlIGVtcHR5IGFuZCB5b3UgbXVzdCBiYWNrdXAlc1wKKyB1bnRpbCBlbnRlcmluZyBhICc/JyBzaG93cyB0aGUgYXZhaWxhYmxlIG9wdGlvbnMuJXNcCitUd28gc3R5bGVzIG9mIGhlbHAgYXJlIHByb3ZpZGVkOiVzXAorMS4gRnVsbCBoZWxwIGlzIGF2YWlsYWJsZSB3aGVuIHlvdSBhcmUgcmVhZHkgdG8gZW50ZXIgYSVzXAorY29tbWFuZCBhcmd1bWVudCAoZS5nLiAnc2hvdyA/JykgYW5kIGRlc2NyaWJlcyBlYWNoIHBvc3NpYmxlJXNcCithcmd1bWVudC4lc1wKKzIuIFBhcnRpYWwgaGVscCBpcyBwcm92aWRlZCB3aGVuIGFuIGFiYnJldmlhdGVkIGFyZ3VtZW50IGlzIGVudGVyZWQlc1wKKyAgIGFuZCB5b3Ugd2FudCB0byBrbm93IHdoYXQgYXJndW1lbnRzIG1hdGNoIHRoZSBpbnB1dCVzXAorICAgKGUuZy4gJ3Nob3cgbWU/Jy4pJXMlcyIsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUsCisJCVZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIEhlbHAgZGlzcGxheSBmdW5jdGlvbiBmb3IgYWxsIG5vZGUuICovCitnREVGVU4oY29uZmlnX2xpc3QsIGNvbmZpZ19saXN0X2NtZCwgImxpc3QiLCAiUHJpbnQgY29tbWFuZCBsaXN0XG4iKQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBjbWRfbm9kZSAqY25vZGUgPSB2ZWN0b3Jfc2xvdChjbWR2ZWMsIHZ0eS0+bm9kZSk7CisJc3RydWN0IGNtZF9lbGVtZW50ICpjbWQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShjbm9kZS0+Y21kX3ZlY3Rvcik7IGkrKykKKwkJaWYgKChjbWQgPSB2ZWN0b3Jfc2xvdChjbm9kZS0+Y21kX3ZlY3RvciwgaSkpICE9IE5VTEwKKwkJICAgICYmICEoY21kLT5hdHRyID09IENNRF9BVFRSX0RFUFJFQ0FURUQKKwkJCSB8fCBjbWQtPmF0dHIgPT0gQ01EX0FUVFJfSElEREVOKSkKKwkJCXZ0eV9vdXQodnR5LCAiICAlcyVzIiwgY21kLT5zdHJpbmcsIFZUWV9ORVdMSU5FKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIFdyaXRlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBpbnRvIGZpbGUuICovCitERUZVTihjb25maWdfd3JpdGVfZmlsZSwKKyAgICAgIGNvbmZpZ193cml0ZV9maWxlX2NtZCwKKyAgICAgICJ3cml0ZSBmaWxlIiwKKyAgICAgICJXcml0ZSBydW5uaW5nIGNvbmZpZ3VyYXRpb24gdG8gbWVtb3J5LCBuZXR3b3JrLCBvciB0ZXJtaW5hbFxuIgorICAgICAgIldyaXRlIHRvIGNvbmZpZ3VyYXRpb24gZmlsZVxuIikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgZmQ7CisJc3RydWN0IGNtZF9ub2RlICpub2RlOworCWNoYXIgKmNvbmZpZ19maWxlOworCWNoYXIgKmNvbmZpZ19maWxlX3RtcCA9IE5VTEw7CisJY2hhciAqY29uZmlnX2ZpbGVfc2F2ID0gTlVMTDsKKwlzdHJ1Y3QgdnR5ICpmaWxlX3Z0eTsKKworCS8qIENoZWNrIGFuZCBzZWUgaWYgd2UgYXJlIG9wZXJhdGluZyB1bmRlciB2dHlzaCBjb25maWd1cmF0aW9uICovCisJaWYgKGhvc3QuY29uZmlnID09IE5VTEwpIHsKKwkJdnR5X291dCh2dHksICJDYW4ndCBzYXZlIHRvIGNvbmZpZ3VyYXRpb24gZmlsZSwgdXNpbmcgdnR5c2guJXMiLAorCQkJVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJLyogR2V0IGZpbGVuYW1lLiAqLworCWNvbmZpZ19maWxlID0gaG9zdC5jb25maWc7CisKKwljb25maWdfZmlsZV9zYXYgPQorCSAgICBfdGFsbG9jX3plcm8odGFsbF92dHlfY21kX2N0eCwKKwkJCSBzdHJsZW4oY29uZmlnX2ZpbGUpICsgc3RybGVuKENPTkZfQkFDS1VQX0VYVCkgKyAxLAorCQkJICJjb25maWdfZmlsZV9zYXYiKTsKKwlzdHJjcHkoY29uZmlnX2ZpbGVfc2F2LCBjb25maWdfZmlsZSk7CisJc3RyY2F0KGNvbmZpZ19maWxlX3NhdiwgQ09ORl9CQUNLVVBfRVhUKTsKKworCWNvbmZpZ19maWxlX3RtcCA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV9jbWRfY3R4LCBzdHJsZW4oY29uZmlnX2ZpbGUpICsgOCwKKwkJCQkJImNvbmZpZ19maWxlX3RtcCIpOworCXNwcmludGYoY29uZmlnX2ZpbGVfdG1wLCAiJXMuWFhYWFhYIiwgY29uZmlnX2ZpbGUpOworCisJLyogT3BlbiBmaWxlIHRvIGNvbmZpZ3VyYXRpb24gd3JpdGUuICovCisJZmQgPSBta3N0ZW1wKGNvbmZpZ19maWxlX3RtcCk7CisJaWYgKGZkIDwgMCkgeworCQl2dHlfb3V0KHZ0eSwgIkNhbid0IG9wZW4gY29uZmlndXJhdGlvbiBmaWxlICVzLiVzIiwKKwkJCWNvbmZpZ19maWxlX3RtcCwgVlRZX05FV0xJTkUpOworCQl0YWxsb2NfZnJlZShjb25maWdfZmlsZV90bXApOworCQl0YWxsb2NfZnJlZShjb25maWdfZmlsZV9zYXYpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJLyogTWFrZSB2dHkgZm9yIGNvbmZpZ3VyYXRpb24gZmlsZS4gKi8KKwlmaWxlX3Z0eSA9IHZ0eV9uZXcoKTsKKwlmaWxlX3Z0eS0+ZmQgPSBmZDsKKwlmaWxlX3Z0eS0+dHlwZSA9IFZUWV9GSUxFOworCisJLyogQ29uZmlnIGZpbGUgaGVhZGVyIHByaW50LiAqLworCXZ0eV9vdXQoZmlsZV92dHksICIhXG4hIE9wZW5CU0MgY29uZmlndXJhdGlvbiBzYXZlZCBmcm9tIHZ0eVxuISAgICIpOworCS8vdnR5X3RpbWVfcHJpbnQgKGZpbGVfdnR5LCAxKTsKKwl2dHlfb3V0KGZpbGVfdnR5LCAiIVxuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShjbWR2ZWMpOyBpKyspCisJCWlmICgobm9kZSA9IHZlY3Rvcl9zbG90KGNtZHZlYywgaSkpICYmIG5vZGUtPmZ1bmMpIHsKKwkJCWlmICgoKm5vZGUtPmZ1bmMpIChmaWxlX3Z0eSkpCisJCQkJdnR5X291dChmaWxlX3Z0eSwgIiFcbiIpOworCQl9CisJdnR5X2Nsb3NlKGZpbGVfdnR5KTsKKworCWlmICh1bmxpbmsoY29uZmlnX2ZpbGVfc2F2KSAhPSAwKQorCQlpZiAoZXJybm8gIT0gRU5PRU5UKSB7CisJCQl2dHlfb3V0KHZ0eSwKKwkJCQkiQ2FuJ3QgdW5saW5rIGJhY2t1cCBjb25maWd1cmF0aW9uIGZpbGUgJXMuJXMiLAorCQkJCWNvbmZpZ19maWxlX3NhdiwgVlRZX05FV0xJTkUpOworCQkJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfc2F2KTsKKwkJCXRhbGxvY19mcmVlKGNvbmZpZ19maWxlX3RtcCk7CisJCQl1bmxpbmsoY29uZmlnX2ZpbGVfdG1wKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCWlmIChsaW5rKGNvbmZpZ19maWxlLCBjb25maWdfZmlsZV9zYXYpICE9IDApIHsKKwkJdnR5X291dCh2dHksICJDYW4ndCBiYWNrdXAgb2xkIGNvbmZpZ3VyYXRpb24gZmlsZSAlcy4lcyIsCisJCQljb25maWdfZmlsZV9zYXYsIFZUWV9ORVdMSU5FKTsKKwkJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfc2F2KTsKKwkJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfdG1wKTsKKwkJdW5saW5rKGNvbmZpZ19maWxlX3RtcCk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisJc3luYygpOworCWlmICh1bmxpbmsoY29uZmlnX2ZpbGUpICE9IDApIHsKKwkJdnR5X291dCh2dHksICJDYW4ndCB1bmxpbmsgY29uZmlndXJhdGlvbiBmaWxlICVzLiVzIiwKKwkJCWNvbmZpZ19maWxlLCBWVFlfTkVXTElORSk7CisJCXRhbGxvY19mcmVlKGNvbmZpZ19maWxlX3Nhdik7CisJCXRhbGxvY19mcmVlKGNvbmZpZ19maWxlX3RtcCk7CisJCXVubGluayhjb25maWdfZmlsZV90bXApOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCWlmIChsaW5rKGNvbmZpZ19maWxlX3RtcCwgY29uZmlnX2ZpbGUpICE9IDApIHsKKwkJdnR5X291dCh2dHksICJDYW4ndCBzYXZlIGNvbmZpZ3VyYXRpb24gZmlsZSAlcy4lcyIsIGNvbmZpZ19maWxlLAorCQkJVlRZX05FV0xJTkUpOworCQl0YWxsb2NfZnJlZShjb25maWdfZmlsZV9zYXYpOworCQl0YWxsb2NfZnJlZShjb25maWdfZmlsZV90bXApOworCQl1bmxpbmsoY29uZmlnX2ZpbGVfdG1wKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKwl1bmxpbmsoY29uZmlnX2ZpbGVfdG1wKTsKKwlzeW5jKCk7CisKKwl0YWxsb2NfZnJlZShjb25maWdfZmlsZV9zYXYpOworCXRhbGxvY19mcmVlKGNvbmZpZ19maWxlX3RtcCk7CisKKwlpZiAoY2htb2QoY29uZmlnX2ZpbGUsIDA2NjYgJiB+Q09ORklHRklMRV9NQVNLKSAhPSAwKSB7CisJCXZ0eV9vdXQodnR5LCAiQ2FuJ3QgY2htb2QgY29uZmlndXJhdGlvbiBmaWxlICVzOiAlcyAoJWQpLiVzIiwKKwkJCWNvbmZpZ19maWxlLCBzdHJlcnJvcihlcnJubyksIGVycm5vLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwl2dHlfb3V0KHZ0eSwgIkNvbmZpZ3VyYXRpb24gc2F2ZWQgdG8gJXMlcyIsIGNvbmZpZ19maWxlLCBWVFlfTkVXTElORSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitBTElBUyhjb25maWdfd3JpdGVfZmlsZSwKKyAgICAgIGNvbmZpZ193cml0ZV9jbWQsCisgICAgICAid3JpdGUiLCAiV3JpdGUgcnVubmluZyBjb25maWd1cmF0aW9uIHRvIG1lbW9yeSwgbmV0d29yaywgb3IgdGVybWluYWxcbiIpCisKKyAgICBBTElBUyhjb25maWdfd3JpdGVfZmlsZSwKKyAgICAgIGNvbmZpZ193cml0ZV9tZW1vcnlfY21kLAorICAgICAgIndyaXRlIG1lbW9yeSIsCisgICAgICAiV3JpdGUgcnVubmluZyBjb25maWd1cmF0aW9uIHRvIG1lbW9yeSwgbmV0d29yaywgb3IgdGVybWluYWxcbiIKKyAgICAgICJXcml0ZSBjb25maWd1cmF0aW9uIHRvIHRoZSBmaWxlIChzYW1lIGFzIHdyaXRlIGZpbGUpXG4iKQorCisgICAgQUxJQVMoY29uZmlnX3dyaXRlX2ZpbGUsCisgICAgICBjb3B5X3J1bm5pbmdjb25maWdfc3RhcnR1cGNvbmZpZ19jbWQsCisgICAgICAiY29weSBydW5uaW5nLWNvbmZpZyBzdGFydHVwLWNvbmZpZyIsCisgICAgICAiQ29weSBjb25maWd1cmF0aW9uXG4iCisgICAgICAiQ29weSBydW5uaW5nIGNvbmZpZyB0by4uLiBcbiIKKyAgICAgICJDb3B5IHJ1bm5pbmcgY29uZmlnIHRvIHN0YXJ0dXAgY29uZmlnIChzYW1lIGFzIHdyaXRlIGZpbGUpXG4iKQorCisvKiBXcml0ZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gaW50byB0aGUgdGVybWluYWwuICovCisgICAgREVGVU4oY29uZmlnX3dyaXRlX3Rlcm1pbmFsLAorICAgICAgY29uZmlnX3dyaXRlX3Rlcm1pbmFsX2NtZCwKKyAgICAgICJ3cml0ZSB0ZXJtaW5hbCIsCisgICAgICAiV3JpdGUgcnVubmluZyBjb25maWd1cmF0aW9uIHRvIG1lbW9yeSwgbmV0d29yaywgb3IgdGVybWluYWxcbiIKKyAgICAgICJXcml0ZSB0byB0ZXJtaW5hbFxuIikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgY21kX25vZGUgKm5vZGU7CisKKwlpZiAodnR5LT50eXBlID09IFZUWV9TSEVMTF9TRVJWKSB7CisJCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKGNtZHZlYyk7IGkrKykKKwkJCWlmICgobm9kZSA9IHZlY3Rvcl9zbG90KGNtZHZlYywgaSkpICYmIG5vZGUtPmZ1bmMKKwkJCSAgICAmJiBub2RlLT52dHlzaCkgeworCQkJCWlmICgoKm5vZGUtPmZ1bmMpICh2dHkpKQorCQkJCQl2dHlfb3V0KHZ0eSwgIiElcyIsIFZUWV9ORVdMSU5FKTsKKwkJCX0KKwl9IGVsc2UgeworCQl2dHlfb3V0KHZ0eSwgIiVzQ3VycmVudCBjb25maWd1cmF0aW9uOiVzIiwgVlRZX05FV0xJTkUsCisJCQlWVFlfTkVXTElORSk7CisJCXZ0eV9vdXQodnR5LCAiISVzIiwgVlRZX05FV0xJTkUpOworCisJCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKGNtZHZlYyk7IGkrKykKKwkJCWlmICgobm9kZSA9IHZlY3Rvcl9zbG90KGNtZHZlYywgaSkpICYmIG5vZGUtPmZ1bmMpIHsKKwkJCQlpZiAoKCpub2RlLT5mdW5jKSAodnR5KSkKKwkJCQkJdnR5X291dCh2dHksICIhJXMiLCBWVFlfTkVXTElORSk7CisJCQl9CisJCXZ0eV9vdXQodnR5LCAiZW5kJXMiLCBWVFlfTkVXTElORSk7CisJfQorCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogV3JpdGUgY3VycmVudCBjb25maWd1cmF0aW9uIGludG8gdGhlIHRlcm1pbmFsLiAqLworQUxJQVMoY29uZmlnX3dyaXRlX3Rlcm1pbmFsLAorICAgICAgc2hvd19ydW5uaW5nX2NvbmZpZ19jbWQsCisgICAgICAic2hvdyBydW5uaW5nLWNvbmZpZyIsIFNIT1dfU1RSICJydW5uaW5nIGNvbmZpZ3VyYXRpb25cbiIpCisKKy8qIFdyaXRlIHN0YXJ0dXAgY29uZmlndXJhdGlvbiBpbnRvIHRoZSB0ZXJtaW5hbC4gKi8KKyAgICBERUZVTihzaG93X3N0YXJ0dXBfY29uZmlnLAorICAgICAgc2hvd19zdGFydHVwX2NvbmZpZ19jbWQsCisgICAgICAic2hvdyBzdGFydHVwLWNvbmZpZyIsIFNIT1dfU1RSICJDb250ZW50ZXMgb2Ygc3RhcnR1cCBjb25maWd1cmF0aW9uXG4iKQoreworCWNoYXIgYnVmW0JVRlNJWl07CisJRklMRSAqY29uZnA7CisKKwljb25mcCA9IGZvcGVuKGhvc3QuY29uZmlnLCAiciIpOworCWlmIChjb25mcCA9PSBOVUxMKSB7CisJCXZ0eV9vdXQodnR5LCAiQ2FuJ3Qgb3BlbiBjb25maWd1cmF0aW9uIGZpbGUgWyVzXSVzIiwKKwkJCWhvc3QuY29uZmlnLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwl3aGlsZSAoZmdldHMoYnVmLCBCVUZTSVosIGNvbmZwKSkgeworCQljaGFyICpjcCA9IGJ1ZjsKKworCQl3aGlsZSAoKmNwICE9ICdccicgJiYgKmNwICE9ICdcbicgJiYgKmNwICE9ICdcMCcpCisJCQljcCsrOworCQkqY3AgPSAnXDAnOworCisJCXZ0eV9vdXQodnR5LCAiJXMlcyIsIGJ1ZiwgVlRZX05FV0xJTkUpOworCX0KKworCWZjbG9zZShjb25mcCk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIEhvc3RuYW1lIGNvbmZpZ3VyYXRpb24gKi8KK0RFRlVOKGNvbmZpZ19ob3N0bmFtZSwKKyAgICAgIGhvc3RuYW1lX2NtZCwKKyAgICAgICJob3N0bmFtZSBXT1JEIiwKKyAgICAgICJTZXQgc3lzdGVtJ3MgbmV0d29yayBuYW1lXG4iICJUaGlzIHN5c3RlbSdzIG5ldHdvcmsgbmFtZVxuIikKK3sKKwlpZiAoIWlzYWxwaGEoKGludCkqYXJndlswXSkpIHsKKwkJdnR5X291dCh2dHksICJQbGVhc2Ugc3BlY2lmeSBzdHJpbmcgc3RhcnRpbmcgd2l0aCBhbHBoYWJldCVzIiwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWlmIChob3N0Lm5hbWUpCisJCXRhbGxvY19mcmVlKGhvc3QubmFtZSk7CisKKwlob3N0Lm5hbWUgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY29uZmlnX25vX2hvc3RuYW1lLAorICAgICAgbm9faG9zdG5hbWVfY21kLAorICAgICAgIm5vIGhvc3RuYW1lIFtIT1NUTkFNRV0iLAorICAgICAgTk9fU1RSICJSZXNldCBzeXN0ZW0ncyBuZXR3b3JrIG5hbWVcbiIgIkhvc3QgbmFtZSBvZiB0aGlzIHJvdXRlclxuIikKK3sKKwlpZiAoaG9zdC5uYW1lKQorCQl0YWxsb2NfZnJlZShob3N0Lm5hbWUpOworCWhvc3QubmFtZSA9IE5VTEw7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBWVFkgaW50ZXJmYWNlIHBhc3N3b3JkIHNldC4gKi8KK0RFRlVOKGNvbmZpZ19wYXNzd29yZCwgcGFzc3dvcmRfY21kLAorICAgICAgInBhc3N3b3JkICg4fCkgV09SRCIsCisgICAgICAiQXNzaWduIHRoZSB0ZXJtaW5hbCBjb25uZWN0aW9uIHBhc3N3b3JkXG4iCisgICAgICAiU3BlY2lmaWVzIGEgSElEREVOIHBhc3N3b3JkIHdpbGwgZm9sbG93XG4iCisgICAgICAiZHVtbXkgc3RyaW5nIFxuIiAiVGhlIEhJRERFTiBsaW5lIHBhc3N3b3JkIHN0cmluZ1xuIikKK3sKKwkvKiBBcmd1bWVudCBjaGVjay4gKi8KKwlpZiAoYXJnYyA9PSAwKSB7CisJCXZ0eV9vdXQodnR5LCAiUGxlYXNlIHNwZWNpZnkgcGFzc3dvcmQuJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAoYXJnYyA9PSAyKSB7CisJCWlmICgqYXJndlswXSA9PSAnOCcpIHsKKwkJCWlmIChob3N0LnBhc3N3b3JkKQorCQkJCXRhbGxvY19mcmVlKGhvc3QucGFzc3dvcmQpOworCQkJaG9zdC5wYXNzd29yZCA9IE5VTEw7CisJCQlpZiAoaG9zdC5wYXNzd29yZF9lbmNyeXB0KQorCQkJCXRhbGxvY19mcmVlKGhvc3QucGFzc3dvcmRfZW5jcnlwdCk7CisJCQlob3N0LnBhc3N3b3JkX2VuY3J5cHQgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIGFyZ3ZbMV0pOworCQkJcmV0dXJuIENNRF9TVUNDRVNTOworCQl9IGVsc2UgeworCQkJdnR5X291dCh2dHksICJVbmtub3duIGVuY3J5cHRpb24gdHlwZS4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCX0KKworCWlmICghaXNhbG51bSgoaW50KSphcmd2WzBdKSkgeworCQl2dHlfb3V0KHZ0eSwKKwkJCSJQbGVhc2Ugc3BlY2lmeSBzdHJpbmcgc3RhcnRpbmcgd2l0aCBhbHBoYW51bWVyaWMlcyIsCisJCQlWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAoaG9zdC5wYXNzd29yZCkKKwkJdGFsbG9jX2ZyZWUoaG9zdC5wYXNzd29yZCk7CisJaG9zdC5wYXNzd29yZCA9IE5VTEw7CisKKyNpZmRlZiBWVFlfQ1JZUFRfUFcKKwlpZiAoaG9zdC5lbmNyeXB0KSB7CisJCWlmIChob3N0LnBhc3N3b3JkX2VuY3J5cHQpCisJCQl0YWxsb2NfZnJlZShob3N0LnBhc3N3b3JkX2VuY3J5cHQpOworCQlob3N0LnBhc3N3b3JkX2VuY3J5cHQgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIHplbmNyeXB0KGFyZ3ZbMF0pKTsKKwl9IGVsc2UKKyNlbmRpZgorCQlob3N0LnBhc3N3b3JkID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCBhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworQUxJQVMoY29uZmlnX3Bhc3N3b3JkLCBwYXNzd29yZF90ZXh0X2NtZCwKKyAgICAgICJwYXNzd29yZCBMSU5FIiwKKyAgICAgICJBc3NpZ24gdGhlIHRlcm1pbmFsIGNvbm5lY3Rpb24gcGFzc3dvcmRcbiIKKyAgICAgICJUaGUgVU5FTkNSWVBURUQgKGNsZWFydGV4dCkgbGluZSBwYXNzd29yZFxuIikKKworLyogVlRZIGVuYWJsZSBwYXNzd29yZCBzZXQuICovCisgICAgREVGVU4oY29uZmlnX2VuYWJsZV9wYXNzd29yZCwgZW5hYmxlX3Bhc3N3b3JkX2NtZCwKKyAgICAgICJlbmFibGUgcGFzc3dvcmQgKDh8KSBXT1JEIiwKKyAgICAgICJNb2RpZnkgZW5hYmxlIHBhc3N3b3JkIHBhcmFtZXRlcnNcbiIKKyAgICAgICJBc3NpZ24gdGhlIHByaXZpbGVnZWQgbGV2ZWwgcGFzc3dvcmRcbiIKKyAgICAgICJTcGVjaWZpZXMgYSBISURERU4gcGFzc3dvcmQgd2lsbCBmb2xsb3dcbiIKKyAgICAgICJkdW1teSBzdHJpbmcgXG4iICJUaGUgSElEREVOICdlbmFibGUnIHBhc3N3b3JkIHN0cmluZ1xuIikKK3sKKwkvKiBBcmd1bWVudCBjaGVjay4gKi8KKwlpZiAoYXJnYyA9PSAwKSB7CisJCXZ0eV9vdXQodnR5LCAiUGxlYXNlIHNwZWNpZnkgcGFzc3dvcmQuJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwkvKiBDcnlwdCB0eXBlIGlzIHNwZWNpZmllZC4gKi8KKwlpZiAoYXJnYyA9PSAyKSB7CisJCWlmICgqYXJndlswXSA9PSAnOCcpIHsKKwkJCWlmIChob3N0LmVuYWJsZSkKKwkJCQl0YWxsb2NfZnJlZShob3N0LmVuYWJsZSk7CisJCQlob3N0LmVuYWJsZSA9IE5VTEw7CisKKwkJCWlmIChob3N0LmVuYWJsZV9lbmNyeXB0KQorCQkJCXRhbGxvY19mcmVlKGhvc3QuZW5hYmxlX2VuY3J5cHQpOworCQkJaG9zdC5lbmFibGVfZW5jcnlwdCA9IHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgYXJndlsxXSk7CisKKwkJCXJldHVybiBDTURfU1VDQ0VTUzsKKwkJfSBlbHNlIHsKKwkJCXZ0eV9vdXQodnR5LCAiVW5rbm93biBlbmNyeXB0aW9uIHR5cGUuJXMiLCBWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwl9CisKKwlpZiAoIWlzYWxudW0oKGludCkqYXJndlswXSkpIHsKKwkJdnR5X291dCh2dHksCisJCQkiUGxlYXNlIHNwZWNpZnkgc3RyaW5nIHN0YXJ0aW5nIHdpdGggYWxwaGFudW1lcmljJXMiLAorCQkJVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJaWYgKGhvc3QuZW5hYmxlKQorCQl0YWxsb2NfZnJlZShob3N0LmVuYWJsZSk7CisJaG9zdC5lbmFibGUgPSBOVUxMOworCisJLyogUGxhaW4gcGFzc3dvcmQgaW5wdXQuICovCisjaWZkZWYgVlRZX0NSWVBUX1BXCisJaWYgKGhvc3QuZW5jcnlwdCkgeworCQlpZiAoaG9zdC5lbmFibGVfZW5jcnlwdCkKKwkJCXRhbGxvY19mcmVlKGhvc3QuZW5hYmxlX2VuY3J5cHQpOworCQlob3N0LmVuYWJsZV9lbmNyeXB0ID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCB6ZW5jcnlwdChhcmd2WzBdKSk7CisJfSBlbHNlCisjZW5kaWYKKwkJaG9zdC5lbmFibGUgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitBTElBUyhjb25maWdfZW5hYmxlX3Bhc3N3b3JkLAorICAgICAgZW5hYmxlX3Bhc3N3b3JkX3RleHRfY21kLAorICAgICAgImVuYWJsZSBwYXNzd29yZCBMSU5FIiwKKyAgICAgICJNb2RpZnkgZW5hYmxlIHBhc3N3b3JkIHBhcmFtZXRlcnNcbiIKKyAgICAgICJBc3NpZ24gdGhlIHByaXZpbGVnZWQgbGV2ZWwgcGFzc3dvcmRcbiIKKyAgICAgICJUaGUgVU5FTkNSWVBURUQgKGNsZWFydGV4dCkgJ2VuYWJsZScgcGFzc3dvcmRcbiIpCisKKy8qIFZUWSBlbmFibGUgcGFzc3dvcmQgZGVsZXRlLiAqLworICAgIERFRlVOKG5vX2NvbmZpZ19lbmFibGVfcGFzc3dvcmQsIG5vX2VuYWJsZV9wYXNzd29yZF9jbWQsCisgICAgICAibm8gZW5hYmxlIHBhc3N3b3JkIiwKKyAgICAgIE5PX1NUUgorICAgICAgIk1vZGlmeSBlbmFibGUgcGFzc3dvcmQgcGFyYW1ldGVyc1xuIgorICAgICAgIkFzc2lnbiB0aGUgcHJpdmlsZWdlZCBsZXZlbCBwYXNzd29yZFxuIikKK3sKKwlpZiAoaG9zdC5lbmFibGUpCisJCXRhbGxvY19mcmVlKGhvc3QuZW5hYmxlKTsKKwlob3N0LmVuYWJsZSA9IE5VTEw7CisKKwlpZiAoaG9zdC5lbmFibGVfZW5jcnlwdCkKKwkJdGFsbG9jX2ZyZWUoaG9zdC5lbmFibGVfZW5jcnlwdCk7CisJaG9zdC5lbmFibGVfZW5jcnlwdCA9IE5VTEw7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKyNpZmRlZiBWVFlfQ1JZUFRfUFcKK0RFRlVOKHNlcnZpY2VfcGFzc3dvcmRfZW5jcnlwdCwKKyAgICAgIHNlcnZpY2VfcGFzc3dvcmRfZW5jcnlwdF9jbWQsCisgICAgICAic2VydmljZSBwYXNzd29yZC1lbmNyeXB0aW9uIiwKKyAgICAgICJTZXQgdXAgbWlzY2VsbGFuZW91cyBzZXJ2aWNlXG4iICJFbmFibGUgZW5jcnlwdGVkIHBhc3N3b3Jkc1xuIikKK3sKKwlpZiAoaG9zdC5lbmNyeXB0KQorCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisKKwlob3N0LmVuY3J5cHQgPSAxOworCisJaWYgKGhvc3QucGFzc3dvcmQpIHsKKwkJaWYgKGhvc3QucGFzc3dvcmRfZW5jcnlwdCkKKwkJCXRhbGxvY19mcmVlKGhvc3QucGFzc3dvcmRfZW5jcnlwdCk7CisJCWhvc3QucGFzc3dvcmRfZW5jcnlwdCA9IHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgemVuY3J5cHQoaG9zdC5wYXNzd29yZCkpOworCX0KKwlpZiAoaG9zdC5lbmFibGUpIHsKKwkJaWYgKGhvc3QuZW5hYmxlX2VuY3J5cHQpCisJCQl0YWxsb2NfZnJlZShob3N0LmVuYWJsZV9lbmNyeXB0KTsKKwkJaG9zdC5lbmFibGVfZW5jcnlwdCA9IHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgemVuY3J5cHQoaG9zdC5lbmFibGUpKTsKKwl9CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKG5vX3NlcnZpY2VfcGFzc3dvcmRfZW5jcnlwdCwKKyAgICAgIG5vX3NlcnZpY2VfcGFzc3dvcmRfZW5jcnlwdF9jbWQsCisgICAgICAibm8gc2VydmljZSBwYXNzd29yZC1lbmNyeXB0aW9uIiwKKyAgICAgIE5PX1NUUiAiU2V0IHVwIG1pc2NlbGxhbmVvdXMgc2VydmljZVxuIiAiRW5hYmxlIGVuY3J5cHRlZCBwYXNzd29yZHNcbiIpCit7CisJaWYgKCFob3N0LmVuY3J5cHQpCisJCXJldHVybiBDTURfU1VDQ0VTUzsKKworCWhvc3QuZW5jcnlwdCA9IDA7CisKKwlpZiAoaG9zdC5wYXNzd29yZF9lbmNyeXB0KQorCQl0YWxsb2NfZnJlZShob3N0LnBhc3N3b3JkX2VuY3J5cHQpOworCWhvc3QucGFzc3dvcmRfZW5jcnlwdCA9IE5VTEw7CisKKwlpZiAoaG9zdC5lbmFibGVfZW5jcnlwdCkKKwkJdGFsbG9jX2ZyZWUoaG9zdC5lbmFibGVfZW5jcnlwdCk7CisJaG9zdC5lbmFibGVfZW5jcnlwdCA9IE5VTEw7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisjZW5kaWYKKworREVGVU4oY29uZmlnX3Rlcm1pbmFsX2xlbmd0aCwgY29uZmlnX3Rlcm1pbmFsX2xlbmd0aF9jbWQsCisgICAgICAidGVybWluYWwgbGVuZ3RoIDwwLTUxMj4iLAorICAgICAgIlNldCB0ZXJtaW5hbCBsaW5lIHBhcmFtZXRlcnNcbiIKKyAgICAgICJTZXQgbnVtYmVyIG9mIGxpbmVzIG9uIGEgc2NyZWVuXG4iCisgICAgICAiTnVtYmVyIG9mIGxpbmVzIG9uIHNjcmVlbiAoMCBmb3Igbm8gcGF1c2luZylcbiIpCit7CisJaW50IGxpbmVzOworCWNoYXIgKmVuZHB0ciA9IE5VTEw7CisKKwlsaW5lcyA9IHN0cnRvbChhcmd2WzBdLCAmZW5kcHRyLCAxMCk7CisJaWYgKGxpbmVzIDwgMCB8fCBsaW5lcyA+IDUxMiB8fCAqZW5kcHRyICE9ICdcMCcpIHsKKwkJdnR5X291dCh2dHksICJsZW5ndGggaXMgbWFsZm9ybWVkJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisJdnR5LT5saW5lcyA9IGxpbmVzOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjb25maWdfdGVybWluYWxfbm9fbGVuZ3RoLCBjb25maWdfdGVybWluYWxfbm9fbGVuZ3RoX2NtZCwKKyAgICAgICJ0ZXJtaW5hbCBubyBsZW5ndGgiLAorICAgICAgIlNldCB0ZXJtaW5hbCBsaW5lIHBhcmFtZXRlcnNcbiIKKyAgICAgIE5PX1NUUiAiU2V0IG51bWJlciBvZiBsaW5lcyBvbiBhIHNjcmVlblxuIikKK3sKKwl2dHktPmxpbmVzID0gLTE7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihzZXJ2aWNlX3Rlcm1pbmFsX2xlbmd0aCwgc2VydmljZV90ZXJtaW5hbF9sZW5ndGhfY21kLAorICAgICAgInNlcnZpY2UgdGVybWluYWwtbGVuZ3RoIDwwLTUxMj4iLAorICAgICAgIlNldCB1cCBtaXNjZWxsYW5lb3VzIHNlcnZpY2VcbiIKKyAgICAgICJTeXN0ZW0gd2lkZSB0ZXJtaW5hbCBsZW5ndGggY29uZmlndXJhdGlvblxuIgorICAgICAgIk51bWJlciBvZiBsaW5lcyBvZiBWVFkgKDAgbWVhbnMgbm8gbGluZSBjb250cm9sKVxuIikKK3sKKwlpbnQgbGluZXM7CisJY2hhciAqZW5kcHRyID0gTlVMTDsKKworCWxpbmVzID0gc3RydG9sKGFyZ3ZbMF0sICZlbmRwdHIsIDEwKTsKKwlpZiAobGluZXMgPCAwIHx8IGxpbmVzID4gNTEyIHx8ICplbmRwdHIgIT0gJ1wwJykgeworCQl2dHlfb3V0KHZ0eSwgImxlbmd0aCBpcyBtYWxmb3JtZWQlcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKwlob3N0LmxpbmVzID0gbGluZXM7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKG5vX3NlcnZpY2VfdGVybWluYWxfbGVuZ3RoLCBub19zZXJ2aWNlX3Rlcm1pbmFsX2xlbmd0aF9jbWQsCisgICAgICAibm8gc2VydmljZSB0ZXJtaW5hbC1sZW5ndGggWzwwLTUxMj5dIiwKKyAgICAgIE5PX1NUUgorICAgICAgIlNldCB1cCBtaXNjZWxsYW5lb3VzIHNlcnZpY2VcbiIKKyAgICAgICJTeXN0ZW0gd2lkZSB0ZXJtaW5hbCBsZW5ndGggY29uZmlndXJhdGlvblxuIgorICAgICAgIk51bWJlciBvZiBsaW5lcyBvZiBWVFkgKDAgbWVhbnMgbm8gbGluZSBjb250cm9sKVxuIikKK3sKKwlob3N0LmxpbmVzID0gLTE7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTl9ISURERU4oZG9fZWNobywKKwkgICAgIGVjaG9fY21kLAorCSAgICAgImVjaG8gLk1FU1NBR0UiLAorCSAgICAgIkVjaG8gYSBtZXNzYWdlIGJhY2sgdG8gdGhlIHZ0eVxuIiAiVGhlIG1lc3NhZ2UgdG8gZWNob1xuIikKK3sKKwljaGFyICptZXNzYWdlOworCisJdnR5X291dCh2dHksICIlcyVzIiwKKwkJKChtZXNzYWdlID0KKwkJICBhcmd2X2NvbmNhdChhcmd2LCBhcmdjLCAwKSkgPyBtZXNzYWdlIDogIiIpLCBWVFlfTkVXTElORSk7CisJaWYgKG1lc3NhZ2UpCisJCXRhbGxvY19mcmVlKG1lc3NhZ2UpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworI2lmIDAKK0RFRlVOKGNvbmZpZ19sb2dtc2csCisgICAgICBjb25maWdfbG9nbXNnX2NtZCwKKyAgICAgICJsb2dtc2cgIiBMT0dfTEVWRUxTICIgLk1FU1NBR0UiLAorICAgICAgIlNlbmQgYSBtZXNzYWdlIHRvIGVuYWJsZWQgbG9nZ2luZyBkZXN0aW5hdGlvbnNcbiIKKyAgICAgIExPR19MRVZFTF9ERVNDICJUaGUgbWVzc2FnZSB0byBzZW5kXG4iKQoreworCWludCBsZXZlbDsKKwljaGFyICptZXNzYWdlOworCisJaWYgKChsZXZlbCA9IGxldmVsX21hdGNoKGFyZ3ZbMF0pKSA9PSBaTE9HX0RJU0FCTEVEKQorCQlyZXR1cm4gQ01EX0VSUl9OT19NQVRDSDsKKworCXpsb2coTlVMTCwgbGV2ZWwsCisJICAgICAoKG1lc3NhZ2UgPSBhcmd2X2NvbmNhdChhcmd2LCBhcmdjLCAxKSkgPyBtZXNzYWdlIDogIiIpKTsKKwlpZiAobWVzc2FnZSkKKwkJdGFsbG9jX2ZyZWUobWVzc2FnZSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihzaG93X2xvZ2dpbmcsCisgICAgICBzaG93X2xvZ2dpbmdfY21kLAorICAgICAgInNob3cgbG9nZ2luZyIsIFNIT1dfU1RSICJTaG93IGN1cnJlbnQgbG9nZ2luZyBjb25maWd1cmF0aW9uXG4iKQoreworCXN0cnVjdCB6bG9nICp6bCA9IHpsb2dfZGVmYXVsdDsKKworCXZ0eV9vdXQodnR5LCAiU3lzbG9nIGxvZ2dpbmc6ICIpOworCWlmICh6bC0+bWF4bHZsW1pMT0dfREVTVF9TWVNMT0ddID09IFpMT0dfRElTQUJMRUQpCisJCXZ0eV9vdXQodnR5LCAiZGlzYWJsZWQiKTsKKwllbHNlCisJCXZ0eV9vdXQodnR5LCAibGV2ZWwgJXMsIGZhY2lsaXR5ICVzLCBpZGVudCAlcyIsCisJCQl6bG9nX3ByaW9yaXR5W3psLT5tYXhsdmxbWkxPR19ERVNUX1NZU0xPR11dLAorCQkJZmFjaWxpdHlfbmFtZSh6bC0+ZmFjaWxpdHkpLCB6bC0+aWRlbnQpOworCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisKKwl2dHlfb3V0KHZ0eSwgIlN0ZG91dCBsb2dnaW5nOiAiKTsKKwlpZiAoemwtPm1heGx2bFtaTE9HX0RFU1RfU1RET1VUXSA9PSBaTE9HX0RJU0FCTEVEKQorCQl2dHlfb3V0KHZ0eSwgImRpc2FibGVkIik7CisJZWxzZQorCQl2dHlfb3V0KHZ0eSwgImxldmVsICVzIiwKKwkJCXpsb2dfcHJpb3JpdHlbemwtPm1heGx2bFtaTE9HX0RFU1RfU1RET1VUXV0pOworCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisKKwl2dHlfb3V0KHZ0eSwgIk1vbml0b3IgbG9nZ2luZzogIik7CisJaWYgKHpsLT5tYXhsdmxbWkxPR19ERVNUX01PTklUT1JdID09IFpMT0dfRElTQUJMRUQpCisJCXZ0eV9vdXQodnR5LCAiZGlzYWJsZWQiKTsKKwllbHNlCisJCXZ0eV9vdXQodnR5LCAibGV2ZWwgJXMiLAorCQkJemxvZ19wcmlvcml0eVt6bC0+bWF4bHZsW1pMT0dfREVTVF9NT05JVE9SXV0pOworCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisKKwl2dHlfb3V0KHZ0eSwgIkZpbGUgbG9nZ2luZzogIik7CisJaWYgKCh6bC0+bWF4bHZsW1pMT0dfREVTVF9GSUxFXSA9PSBaTE9HX0RJU0FCTEVEKSB8fCAhemwtPmZwKQorCQl2dHlfb3V0KHZ0eSwgImRpc2FibGVkIik7CisJZWxzZQorCQl2dHlfb3V0KHZ0eSwgImxldmVsICVzLCBmaWxlbmFtZSAlcyIsCisJCQl6bG9nX3ByaW9yaXR5W3psLT5tYXhsdmxbWkxPR19ERVNUX0ZJTEVdXSwKKwkJCXpsLT5maWxlbmFtZSk7CisJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKworCXZ0eV9vdXQodnR5LCAiUHJvdG9jb2wgbmFtZTogJXMlcyIsCisJCXpsb2dfcHJvdG9fbmFtZXNbemwtPnByb3RvY29sXSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiUmVjb3JkIHByaW9yaXR5OiAlcyVzIiwKKwkJKHpsLT5yZWNvcmRfcHJpb3JpdHkgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKSwgVlRZX05FV0xJTkUpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjb25maWdfbG9nX3N0ZG91dCwKKyAgICAgIGNvbmZpZ19sb2dfc3Rkb3V0X2NtZCwKKyAgICAgICJsb2cgc3Rkb3V0IiwgIkxvZ2dpbmcgY29udHJvbFxuIiAiU2V0IHN0ZG91dCBsb2dnaW5nIGxldmVsXG4iKQoreworCXpsb2dfc2V0X2xldmVsKE5VTEwsIFpMT0dfREVTVF9TVERPVVQsIHpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY29uZmlnX2xvZ19zdGRvdXRfbGV2ZWwsCisgICAgICBjb25maWdfbG9nX3N0ZG91dF9sZXZlbF9jbWQsCisgICAgICAibG9nIHN0ZG91dCAiIExPR19MRVZFTFMsCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iICJTZXQgc3Rkb3V0IGxvZ2dpbmcgbGV2ZWxcbiIgTE9HX0xFVkVMX0RFU0MpCit7CisJaW50IGxldmVsOworCisJaWYgKChsZXZlbCA9IGxldmVsX21hdGNoKGFyZ3ZbMF0pKSA9PSBaTE9HX0RJU0FCTEVEKQorCQlyZXR1cm4gQ01EX0VSUl9OT19NQVRDSDsKKwl6bG9nX3NldF9sZXZlbChOVUxMLCBaTE9HX0RFU1RfU1RET1VULCBsZXZlbCk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihub19jb25maWdfbG9nX3N0ZG91dCwKKyAgICAgIG5vX2NvbmZpZ19sb2dfc3Rkb3V0X2NtZCwKKyAgICAgICJubyBsb2cgc3Rkb3V0IFtMRVZFTF0iLAorICAgICAgTk9fU1RSICJMb2dnaW5nIGNvbnRyb2xcbiIgIkNhbmNlbCBsb2dnaW5nIHRvIHN0ZG91dFxuIiAiTG9nZ2luZyBsZXZlbFxuIikKK3sKKwl6bG9nX3NldF9sZXZlbChOVUxMLCBaTE9HX0RFU1RfU1RET1VULCBaTE9HX0RJU0FCTEVEKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNvbmZpZ19sb2dfbW9uaXRvciwKKyAgICAgIGNvbmZpZ19sb2dfbW9uaXRvcl9jbWQsCisgICAgICAibG9nIG1vbml0b3IiLAorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIiAiU2V0IHRlcm1pbmFsIGxpbmUgKG1vbml0b3IpIGxvZ2dpbmcgbGV2ZWxcbiIpCit7CisJemxvZ19zZXRfbGV2ZWwoTlVMTCwgWkxPR19ERVNUX01PTklUT1IsIHpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY29uZmlnX2xvZ19tb25pdG9yX2xldmVsLAorICAgICAgY29uZmlnX2xvZ19tb25pdG9yX2xldmVsX2NtZCwKKyAgICAgICJsb2cgbW9uaXRvciAiIExPR19MRVZFTFMsCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iCisgICAgICAiU2V0IHRlcm1pbmFsIGxpbmUgKG1vbml0b3IpIGxvZ2dpbmcgbGV2ZWxcbiIgTE9HX0xFVkVMX0RFU0MpCit7CisJaW50IGxldmVsOworCisJaWYgKChsZXZlbCA9IGxldmVsX21hdGNoKGFyZ3ZbMF0pKSA9PSBaTE9HX0RJU0FCTEVEKQorCQlyZXR1cm4gQ01EX0VSUl9OT19NQVRDSDsKKwl6bG9nX3NldF9sZXZlbChOVUxMLCBaTE9HX0RFU1RfTU9OSVRPUiwgbGV2ZWwpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obm9fY29uZmlnX2xvZ19tb25pdG9yLAorICAgICAgbm9fY29uZmlnX2xvZ19tb25pdG9yX2NtZCwKKyAgICAgICJubyBsb2cgbW9uaXRvciBbTEVWRUxdIiwKKyAgICAgIE5PX1NUUgorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIgorICAgICAgIkRpc2FibGUgdGVybWluYWwgbGluZSAobW9uaXRvcikgbG9nZ2luZ1xuIiAiTG9nZ2luZyBsZXZlbFxuIikKK3sKKwl6bG9nX3NldF9sZXZlbChOVUxMLCBaTE9HX0RFU1RfTU9OSVRPUiwgWkxPR19ESVNBQkxFRCk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgaW50IHNldF9sb2dfZmlsZShzdHJ1Y3QgdnR5ICp2dHksIGNvbnN0IGNoYXIgKmZuYW1lLCBpbnQgbG9nbGV2ZWwpCit7CisJaW50IHJldDsKKwljaGFyICpwID0gTlVMTDsKKwljb25zdCBjaGFyICpmdWxscGF0aDsKKworCS8qIFBhdGggZGV0ZWN0aW9uLiAqLworCWlmICghSVNfRElSRUNUT1JZX1NFUCgqZm5hbWUpKSB7CisJCWNoYXIgY3dkW01BWFBBVEhMRU4gKyAxXTsKKwkJY3dkW01BWFBBVEhMRU5dID0gJ1wwJzsKKworCQlpZiAoZ2V0Y3dkKGN3ZCwgTUFYUEFUSExFTikgPT0gTlVMTCkgeworCQkJemxvZ19lcnIoImNvbmZpZ19sb2dfZmlsZTogVW5hYmxlIHRvIGFsbG9jIG1lbSEiKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCisJCWlmICgocCA9IF90YWxsb2NfemVybyh0YWxsX3ZjbWRfY3R4LAorCQkJCSAgICAgIHN0cmxlbihjd2QpICsgc3RybGVuKGZuYW1lKSArIDIpLAorCQkJCSAgICAgICJzZXRfbG9nX2ZpbGUiKQorCQkgICAgPT0gTlVMTCkgeworCQkJemxvZ19lcnIoImNvbmZpZ19sb2dfZmlsZTogVW5hYmxlIHRvIGFsbG9jIG1lbSEiKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCQlzcHJpbnRmKHAsICIlcy8lcyIsIGN3ZCwgZm5hbWUpOworCQlmdWxscGF0aCA9IHA7CisJfSBlbHNlCisJCWZ1bGxwYXRoID0gZm5hbWU7CisKKwlyZXQgPSB6bG9nX3NldF9maWxlKE5VTEwsIGZ1bGxwYXRoLCBsb2dsZXZlbCk7CisKKwlpZiAocCkKKwkJdGFsbG9jX2ZyZWUocCk7CisKKwlpZiAoIXJldCkgeworCQl2dHlfb3V0KHZ0eSwgImNhbid0IG9wZW4gbG9nZmlsZSAlc1xuIiwgZm5hbWUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJaWYgKGhvc3QubG9nZmlsZSkKKwkJdGFsbG9jX2ZyZWUoaG9zdC5sb2dmaWxlKTsKKworCWhvc3QubG9nZmlsZSA9IHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgZm5hbWUpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjb25maWdfbG9nX2ZpbGUsCisgICAgICBjb25maWdfbG9nX2ZpbGVfY21kLAorICAgICAgImxvZyBmaWxlIEZJTEVOQU1FIiwKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIgIkxvZ2dpbmcgdG8gZmlsZVxuIiAiTG9nZ2luZyBmaWxlbmFtZVxuIikKK3sKKwlyZXR1cm4gc2V0X2xvZ19maWxlKHZ0eSwgYXJndlswXSwgemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bCk7Cit9CisKK0RFRlVOKGNvbmZpZ19sb2dfZmlsZV9sZXZlbCwKKyAgICAgIGNvbmZpZ19sb2dfZmlsZV9sZXZlbF9jbWQsCisgICAgICAibG9nIGZpbGUgRklMRU5BTUUgIiBMT0dfTEVWRUxTLAorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIgorICAgICAgIkxvZ2dpbmcgdG8gZmlsZVxuIiAiTG9nZ2luZyBmaWxlbmFtZVxuIiBMT0dfTEVWRUxfREVTQykKK3sKKwlpbnQgbGV2ZWw7CisKKwlpZiAoKGxldmVsID0gbGV2ZWxfbWF0Y2goYXJndlsxXSkpID09IFpMT0dfRElTQUJMRUQpCisJCXJldHVybiBDTURfRVJSX05PX01BVENIOworCXJldHVybiBzZXRfbG9nX2ZpbGUodnR5LCBhcmd2WzBdLCBsZXZlbCk7Cit9CisKK0RFRlVOKG5vX2NvbmZpZ19sb2dfZmlsZSwKKyAgICAgIG5vX2NvbmZpZ19sb2dfZmlsZV9jbWQsCisgICAgICAibm8gbG9nIGZpbGUgW0ZJTEVOQU1FXSIsCisgICAgICBOT19TVFIKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIgIkNhbmNlbCBsb2dnaW5nIHRvIGZpbGVcbiIgIkxvZ2dpbmcgZmlsZSBuYW1lXG4iKQoreworCXpsb2dfcmVzZXRfZmlsZShOVUxMKTsKKworCWlmIChob3N0LmxvZ2ZpbGUpCisJCXRhbGxvY19mcmVlKGhvc3QubG9nZmlsZSk7CisKKwlob3N0LmxvZ2ZpbGUgPSBOVUxMOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitBTElBUyhub19jb25maWdfbG9nX2ZpbGUsCisgICAgICBub19jb25maWdfbG9nX2ZpbGVfbGV2ZWxfY21kLAorICAgICAgIm5vIGxvZyBmaWxlIEZJTEVOQU1FIExFVkVMIiwKKyAgICAgIE5PX1NUUgorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIgorICAgICAgIkNhbmNlbCBsb2dnaW5nIHRvIGZpbGVcbiIgIkxvZ2dpbmcgZmlsZSBuYW1lXG4iICJMb2dnaW5nIGxldmVsXG4iKQorCisgICAgREVGVU4oY29uZmlnX2xvZ19zeXNsb2csCisgICAgICBjb25maWdfbG9nX3N5c2xvZ19jbWQsCisgICAgICAibG9nIHN5c2xvZyIsICJMb2dnaW5nIGNvbnRyb2xcbiIgIlNldCBzeXNsb2cgbG9nZ2luZyBsZXZlbFxuIikKK3sKKwl6bG9nX3NldF9sZXZlbChOVUxMLCBaTE9HX0RFU1RfU1lTTE9HLCB6bG9nX2RlZmF1bHQtPmRlZmF1bHRfbHZsKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNvbmZpZ19sb2dfc3lzbG9nX2xldmVsLAorICAgICAgY29uZmlnX2xvZ19zeXNsb2dfbGV2ZWxfY21kLAorICAgICAgImxvZyBzeXNsb2cgIiBMT0dfTEVWRUxTLAorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIiAiU2V0IHN5c2xvZyBsb2dnaW5nIGxldmVsXG4iIExPR19MRVZFTF9ERVNDKQoreworCWludCBsZXZlbDsKKworCWlmICgobGV2ZWwgPSBsZXZlbF9tYXRjaChhcmd2WzBdKSkgPT0gWkxPR19ESVNBQkxFRCkKKwkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7CisJemxvZ19zZXRfbGV2ZWwoTlVMTCwgWkxPR19ERVNUX1NZU0xPRywgbGV2ZWwpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU5fREVQUkVDQVRFRChjb25maWdfbG9nX3N5c2xvZ19mYWNpbGl0eSwKKwkJIGNvbmZpZ19sb2dfc3lzbG9nX2ZhY2lsaXR5X2NtZCwKKwkJICJsb2cgc3lzbG9nIGZhY2lsaXR5ICIgTE9HX0ZBQ0lMSVRJRVMsCisJCSAiTG9nZ2luZyBjb250cm9sXG4iCisJCSAiTG9nZ2luZyBnb2VzIHRvIHN5c2xvZ1xuIgorCQkgIihEZXByZWNhdGVkKSBGYWNpbGl0eSBwYXJhbWV0ZXIgZm9yIHN5c2xvZyBtZXNzYWdlc1xuIgorCQkgTE9HX0ZBQ0lMSVRZX0RFU0MpCit7CisJaW50IGZhY2lsaXR5OworCisJaWYgKChmYWNpbGl0eSA9IGZhY2lsaXR5X21hdGNoKGFyZ3ZbMF0pKSA8IDApCisJCXJldHVybiBDTURfRVJSX05PX01BVENIOworCisJemxvZ19zZXRfbGV2ZWwoTlVMTCwgWkxPR19ERVNUX1NZU0xPRywgemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bCk7CisJemxvZ19kZWZhdWx0LT5mYWNpbGl0eSA9IGZhY2lsaXR5OworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obm9fY29uZmlnX2xvZ19zeXNsb2csCisgICAgICBub19jb25maWdfbG9nX3N5c2xvZ19jbWQsCisgICAgICAibm8gbG9nIHN5c2xvZyBbTEVWRUxdIiwKKyAgICAgIE5PX1NUUiAiTG9nZ2luZyBjb250cm9sXG4iICJDYW5jZWwgbG9nZ2luZyB0byBzeXNsb2dcbiIgIkxvZ2dpbmcgbGV2ZWxcbiIpCit7CisJemxvZ19zZXRfbGV2ZWwoTlVMTCwgWkxPR19ERVNUX1NZU0xPRywgWkxPR19ESVNBQkxFRCk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitBTElBUyhub19jb25maWdfbG9nX3N5c2xvZywKKyAgICAgIG5vX2NvbmZpZ19sb2dfc3lzbG9nX2ZhY2lsaXR5X2NtZCwKKyAgICAgICJubyBsb2cgc3lzbG9nIGZhY2lsaXR5ICIgTE9HX0ZBQ0lMSVRJRVMsCisgICAgICBOT19TVFIKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIKKyAgICAgICJMb2dnaW5nIGdvZXMgdG8gc3lzbG9nXG4iCisgICAgICAiRmFjaWxpdHkgcGFyYW1ldGVyIGZvciBzeXNsb2cgbWVzc2FnZXNcbiIgTE9HX0ZBQ0lMSVRZX0RFU0MpCisKKyAgICBERUZVTihjb25maWdfbG9nX2ZhY2lsaXR5LAorICAgICAgY29uZmlnX2xvZ19mYWNpbGl0eV9jbWQsCisgICAgICAibG9nIGZhY2lsaXR5ICIgTE9HX0ZBQ0lMSVRJRVMsCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iCisgICAgICAiRmFjaWxpdHkgcGFyYW1ldGVyIGZvciBzeXNsb2cgbWVzc2FnZXNcbiIgTE9HX0ZBQ0lMSVRZX0RFU0MpCit7CisJaW50IGZhY2lsaXR5OworCisJaWYgKChmYWNpbGl0eSA9IGZhY2lsaXR5X21hdGNoKGFyZ3ZbMF0pKSA8IDApCisJCXJldHVybiBDTURfRVJSX05PX01BVENIOworCXpsb2dfZGVmYXVsdC0+ZmFjaWxpdHkgPSBmYWNpbGl0eTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKG5vX2NvbmZpZ19sb2dfZmFjaWxpdHksCisgICAgICBub19jb25maWdfbG9nX2ZhY2lsaXR5X2NtZCwKKyAgICAgICJubyBsb2cgZmFjaWxpdHkgW0ZBQ0lMSVRZXSIsCisgICAgICBOT19TVFIKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIKKyAgICAgICJSZXNldCBzeXNsb2cgZmFjaWxpdHkgdG8gZGVmYXVsdCAoZGFlbW9uKVxuIiAiU3lzbG9nIGZhY2lsaXR5XG4iKQoreworCXpsb2dfZGVmYXVsdC0+ZmFjaWxpdHkgPSBMT0dfREFFTU9OOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU5fREVQUkVDQVRFRChjb25maWdfbG9nX3RyYXAsCisJCSBjb25maWdfbG9nX3RyYXBfY21kLAorCQkgImxvZyB0cmFwICIgTE9HX0xFVkVMUywKKwkJICJMb2dnaW5nIGNvbnRyb2xcbiIKKwkJICIoRGVwcmVjYXRlZCkgU2V0IGxvZ2dpbmcgbGV2ZWwgYW5kIGRlZmF1bHQgZm9yIGFsbCBkZXN0aW5hdGlvbnNcbiIKKwkJIExPR19MRVZFTF9ERVNDKQoreworCWludCBuZXdfbGV2ZWw7CisJaW50IGk7CisKKwlpZiAoKG5ld19sZXZlbCA9IGxldmVsX21hdGNoKGFyZ3ZbMF0pKSA9PSBaTE9HX0RJU0FCTEVEKQorCQlyZXR1cm4gQ01EX0VSUl9OT19NQVRDSDsKKworCXpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwgPSBuZXdfbGV2ZWw7CisJZm9yIChpID0gMDsgaSA8IFpMT0dfTlVNX0RFU1RTOyBpKyspCisJCWlmICh6bG9nX2RlZmF1bHQtPm1heGx2bFtpXSAhPSBaTE9HX0RJU0FCTEVEKQorCQkJemxvZ19kZWZhdWx0LT5tYXhsdmxbaV0gPSBuZXdfbGV2ZWw7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTl9ERVBSRUNBVEVEKG5vX2NvbmZpZ19sb2dfdHJhcCwKKwkJIG5vX2NvbmZpZ19sb2dfdHJhcF9jbWQsCisJCSAibm8gbG9nIHRyYXAgW0xFVkVMXSIsCisJCSBOT19TVFIKKwkJICJMb2dnaW5nIGNvbnRyb2xcbiIKKwkJICJQZXJtaXQgYWxsIGxvZ2dpbmcgaW5mb3JtYXRpb25cbiIgIkxvZ2dpbmcgbGV2ZWxcbiIpCit7CisJemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bCA9IExPR19ERUJVRzsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNvbmZpZ19sb2dfcmVjb3JkX3ByaW9yaXR5LAorICAgICAgY29uZmlnX2xvZ19yZWNvcmRfcHJpb3JpdHlfY21kLAorICAgICAgImxvZyByZWNvcmQtcHJpb3JpdHkiLAorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIgorICAgICAgIkxvZyB0aGUgcHJpb3JpdHkgb2YgdGhlIG1lc3NhZ2Ugd2l0aGluIHRoZSBtZXNzYWdlXG4iKQoreworCXpsb2dfZGVmYXVsdC0+cmVjb3JkX3ByaW9yaXR5ID0gMTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKG5vX2NvbmZpZ19sb2dfcmVjb3JkX3ByaW9yaXR5LAorICAgICAgbm9fY29uZmlnX2xvZ19yZWNvcmRfcHJpb3JpdHlfY21kLAorICAgICAgIm5vIGxvZyByZWNvcmQtcHJpb3JpdHkiLAorICAgICAgTk9fU1RSCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iCisgICAgICAiRG8gbm90IGxvZyB0aGUgcHJpb3JpdHkgb2YgdGhlIG1lc3NhZ2Ugd2l0aGluIHRoZSBtZXNzYWdlXG4iKQoreworCXpsb2dfZGVmYXVsdC0+cmVjb3JkX3ByaW9yaXR5ID0gMDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisjZW5kaWYKKworREVGVU4oYmFubmVyX21vdGRfZmlsZSwKKyAgICAgIGJhbm5lcl9tb3RkX2ZpbGVfY21kLAorICAgICAgImJhbm5lciBtb3RkIGZpbGUgW0ZJTEVdIiwKKyAgICAgICJTZXQgYmFubmVyXG4iICJCYW5uZXIgZm9yIG1vdGRcbiIgIkJhbm5lciBmcm9tIGEgZmlsZVxuIiAiRmlsZW5hbWVcbiIpCit7CisJaWYgKGhvc3QubW90ZGZpbGUpCisJCXRhbGxvY19mcmVlKGhvc3QubW90ZGZpbGUpOworCWhvc3QubW90ZGZpbGUgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihiYW5uZXJfbW90ZF9kZWZhdWx0LAorICAgICAgYmFubmVyX21vdGRfZGVmYXVsdF9jbWQsCisgICAgICAiYmFubmVyIG1vdGQgZGVmYXVsdCIsCisgICAgICAiU2V0IGJhbm5lciBzdHJpbmdcbiIgIlN0cmluZ3MgZm9yIG1vdGRcbiIgIkRlZmF1bHQgc3RyaW5nXG4iKQoreworCWhvc3QubW90ZCA9IGRlZmF1bHRfbW90ZDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKG5vX2Jhbm5lcl9tb3RkLAorICAgICAgbm9fYmFubmVyX21vdGRfY21kLAorICAgICAgIm5vIGJhbm5lciBtb3RkIiwgTk9fU1RSICJTZXQgYmFubmVyIHN0cmluZ1xuIiAiU3RyaW5ncyBmb3IgbW90ZFxuIikKK3sKKwlob3N0Lm1vdGQgPSBOVUxMOworCWlmIChob3N0Lm1vdGRmaWxlKQorCQl0YWxsb2NfZnJlZShob3N0Lm1vdGRmaWxlKTsKKwlob3N0Lm1vdGRmaWxlID0gTlVMTDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIFNldCBjb25maWcgZmlsZW5hbWUuICBDYWxsZWQgZnJvbSB2dHkuYyAqLwordm9pZCBob3N0X2NvbmZpZ19zZXQoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJaG9zdC5jb25maWcgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIGZpbGVuYW1lKTsKK30KKwordm9pZCBpbnN0YWxsX2RlZmF1bHQoZW51bSBub2RlX3R5cGUgbm9kZSkKK3sKKwlpbnN0YWxsX2VsZW1lbnQobm9kZSwgJmNvbmZpZ19leGl0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KG5vZGUsICZjb25maWdfcXVpdF9jbWQpOworCWluc3RhbGxfZWxlbWVudChub2RlLCAmY29uZmlnX2VuZF9jbWQpOworCWluc3RhbGxfZWxlbWVudChub2RlLCAmY29uZmlnX2hlbHBfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQobm9kZSwgJmNvbmZpZ19saXN0X2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnQobm9kZSwgJmNvbmZpZ193cml0ZV90ZXJtaW5hbF9jbWQpOworCWluc3RhbGxfZWxlbWVudChub2RlLCAmY29uZmlnX3dyaXRlX2ZpbGVfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQobm9kZSwgJmNvbmZpZ193cml0ZV9tZW1vcnlfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQobm9kZSwgJmNvbmZpZ193cml0ZV9jbWQpOworCWluc3RhbGxfZWxlbWVudChub2RlLCAmc2hvd19ydW5uaW5nX2NvbmZpZ19jbWQpOworfQorCisvKiBJbml0aWFsaXplIGNvbW1hbmQgaW50ZXJmYWNlLiBJbnN0YWxsIGJhc2ljIG5vZGVzIGFuZCBjb21tYW5kcy4gKi8KK3ZvaWQgY21kX2luaXQoaW50IHRlcm1pbmFsKQoreworCS8qIEFsbG9jYXRlIGluaXRpYWwgdG9wIHZlY3RvciBvZiBjb21tYW5kcy4gKi8KKwljbWR2ZWMgPSB2ZWN0b3JfaW5pdChWRUNUT1JfTUlOX1NJWkUpOworCisJLyogRGVmYXVsdCBob3N0IHZhbHVlIHNldHRpbmdzLiAqLworCWhvc3QubmFtZSA9IE5VTEw7CisJaG9zdC5wYXNzd29yZCA9IE5VTEw7CisJaG9zdC5lbmFibGUgPSBOVUxMOworCWhvc3QubG9nZmlsZSA9IE5VTEw7CisJaG9zdC5jb25maWcgPSBOVUxMOworCWhvc3QubGluZXMgPSAtMTsKKwlob3N0Lm1vdGQgPSBkZWZhdWx0X21vdGQ7CisJaG9zdC5tb3RkZmlsZSA9IE5VTEw7CisKKwkvKiBJbnN0YWxsIHRvcCBub2Rlcy4gKi8KKwlpbnN0YWxsX25vZGUoJnZpZXdfbm9kZSwgTlVMTCk7CisJaW5zdGFsbF9ub2RlKCZlbmFibGVfbm9kZSwgTlVMTCk7CisJaW5zdGFsbF9ub2RlKCZhdXRoX25vZGUsIE5VTEwpOworCWluc3RhbGxfbm9kZSgmYXV0aF9lbmFibGVfbm9kZSwgTlVMTCk7CisJaW5zdGFsbF9ub2RlKCZjb25maWdfbm9kZSwgY29uZmlnX3dyaXRlX2hvc3QpOworCisJLyogRWFjaCBub2RlJ3MgYmFzaWMgY29tbWFuZHMuICovCisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfdmVyc2lvbl9jbWQpOworCWlmICh0ZXJtaW5hbCkgeworCQlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmY29uZmlnX2xpc3RfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmNvbmZpZ19leGl0X2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZjb25maWdfcXVpdF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmY29uZmlnX2hlbHBfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmNvbmZpZ19lbmFibGVfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmNvbmZpZ190ZXJtaW5hbF9sZW5ndGhfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmNvbmZpZ190ZXJtaW5hbF9ub19sZW5ndGhfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmVjaG9fY21kKTsKKwl9CisKKwlpZiAodGVybWluYWwpIHsKKwkJaW5zdGFsbF9kZWZhdWx0KEVOQUJMRV9OT0RFKTsKKwkJaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCAmY29uZmlnX2Rpc2FibGVfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCAmY29uZmlnX3Rlcm1pbmFsX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudCAoRU5BQkxFX05PREUsICZjb3B5X3J1bm5pbmdjb25maWdfc3RhcnR1cGNvbmZpZ19jbWQpOworCX0KKwlpbnN0YWxsX2VsZW1lbnQgKEVOQUJMRV9OT0RFLCAmc2hvd19zdGFydHVwX2NvbmZpZ19jbWQpOworCWluc3RhbGxfZWxlbWVudChFTkFCTEVfTk9ERSwgJnNob3dfdmVyc2lvbl9jbWQpOworCisJaWYgKHRlcm1pbmFsKSB7CisJCWluc3RhbGxfZWxlbWVudChFTkFCTEVfTk9ERSwgJmNvbmZpZ190ZXJtaW5hbF9sZW5ndGhfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCAmY29uZmlnX3Rlcm1pbmFsX25vX2xlbmd0aF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoRU5BQkxFX05PREUsICZlY2hvX2NtZCk7CisKKwkJaW5zdGFsbF9kZWZhdWx0KENPTkZJR19OT0RFKTsKKwl9CisKKwlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZob3N0bmFtZV9jbWQpOworCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJm5vX2hvc3RuYW1lX2NtZCk7CisKKwlpZiAodGVybWluYWwpIHsKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmcGFzc3dvcmRfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmcGFzc3dvcmRfdGV4dF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZlbmFibGVfcGFzc3dvcmRfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmZW5hYmxlX3Bhc3N3b3JkX3RleHRfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmbm9fZW5hYmxlX3Bhc3N3b3JkX2NtZCk7CisKKyNpZmRlZiBWVFlfQ1JZUFRfUFcKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmc2VydmljZV9wYXNzd29yZF9lbmNyeXB0X2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJm5vX3NlcnZpY2VfcGFzc3dvcmRfZW5jcnlwdF9jbWQpOworI2VuZGlmCisJCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJmJhbm5lcl9tb3RkX2RlZmF1bHRfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmYmFubmVyX21vdGRfZmlsZV9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZub19iYW5uZXJfbW90ZF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZzZXJ2aWNlX3Rlcm1pbmFsX2xlbmd0aF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZub19zZXJ2aWNlX3Rlcm1pbmFsX2xlbmd0aF9jbWQpOworCisJfQorCXNyYW5kKHRpbWUoTlVMTCkpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvdnR5L3ZlY3Rvci5jIGIvb3BlbmJzYy9zcmMvdnR5L3ZlY3Rvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNDdhZTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy92dHkvdmVjdG9yLmMKQEAgLTAsMCArMSwxOTIgQEAKKy8qIEdlbmVyaWMgdmVjdG9yIGludGVyZmFjZSByb3V0aW5lCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcgS3VuaWhpcm8gSXNoaWd1cm8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgWmVicmEuCisgKgorICogR05VIFplYnJhIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBHTlUgWmVicmEgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEdOVSBaZWJyYTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAqIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDx2dHkvdmVjdG9yLmg+CisjaW5jbHVkZSA8dnR5L3Z0eS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG1lbW9yeS5oPgorCit2b2lkICp0YWxsX3Z0eV92ZWNfY3R4OworCisvKiBJbml0aWFsaXplIHZlY3RvciA6IGFsbG9jYXRlIG1lbW9yeSBhbmQgcmV0dXJuIHZlY3Rvci4gKi8KK3ZlY3RvciB2ZWN0b3JfaW5pdCh1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwl2ZWN0b3IgdiA9IHRhbGxvY196ZXJvKHRhbGxfdnR5X3ZlY19jdHgsIHN0cnVjdCBfdmVjdG9yKTsKKwlpZiAoIXYpCisJCXJldHVybiBOVUxMOworCisJLyogYWxsb2NhdGUgYXQgbGVhc3Qgb25lIHNsb3QgKi8KKwlpZiAoc2l6ZSA9PSAwKQorCQlzaXplID0gMTsKKworCXYtPmFsbG9jZWQgPSBzaXplOworCXYtPmFjdGl2ZSA9IDA7CisJdi0+aW5kZXggPSBfdGFsbG9jX3plcm8odGFsbF92dHlfdmVjX2N0eCwgc2l6ZW9mKHZvaWQgKikgKiBzaXplLAorCQkJCSJ2ZWN0b3JfaW5pdDppbmRleCIpOworCWlmICghdi0+aW5kZXgpIHsKKwkJdGFsbG9jX2ZyZWUodik7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gdjsKK30KKwordm9pZCB2ZWN0b3Jfb25seV93cmFwcGVyX2ZyZWUodmVjdG9yIHYpCit7CisJdGFsbG9jX2ZyZWUodik7Cit9CisKK3ZvaWQgdmVjdG9yX29ubHlfaW5kZXhfZnJlZSh2b2lkICppbmRleCkKK3sKKwl0YWxsb2NfZnJlZShpbmRleCk7Cit9CisKK3ZvaWQgdmVjdG9yX2ZyZWUodmVjdG9yIHYpCit7CisJdGFsbG9jX2ZyZWUodi0+aW5kZXgpOworCXRhbGxvY19mcmVlKHYpOworfQorCit2ZWN0b3IgdmVjdG9yX2NvcHkodmVjdG9yIHYpCit7CisJdW5zaWduZWQgaW50IHNpemU7CisJdmVjdG9yIG5ldyA9IHRhbGxvY196ZXJvKHRhbGxfdnR5X3ZlY19jdHgsIHN0cnVjdCBfdmVjdG9yKTsKKwlpZiAoIW5ldykKKwkJcmV0dXJuIE5VTEw7CisKKwluZXctPmFjdGl2ZSA9IHYtPmFjdGl2ZTsKKwluZXctPmFsbG9jZWQgPSB2LT5hbGxvY2VkOworCisJc2l6ZSA9IHNpemVvZih2b2lkICopICogKHYtPmFsbG9jZWQpOworCW5ldy0+aW5kZXggPSBfdGFsbG9jX3plcm8odGFsbF92dHlfdmVjX2N0eCwgc2l6ZSwgInZlY3Rvcl9jb3B5OmluZGV4Iik7CisJaWYgKCFuZXctPmluZGV4KSB7CisJCXRhbGxvY19mcmVlKG5ldyk7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1jcHkobmV3LT5pbmRleCwgdi0+aW5kZXgsIHNpemUpOworCisJcmV0dXJuIG5ldzsKK30KKworLyogQ2hlY2sgYXNzaWduZWQgaW5kZXgsIGFuZCBpZiBpdCBydW5zIHNob3J0IGRvdWJsZSBpbmRleCBwb2ludGVyICovCit2b2lkIHZlY3Rvcl9lbnN1cmUodmVjdG9yIHYsIHVuc2lnbmVkIGludCBudW0pCit7CisJaWYgKHYtPmFsbG9jZWQgPiBudW0pCisJCXJldHVybjsKKworCXYtPmluZGV4ID0gdGFsbG9jX3JlYWxsb2Nfc2l6ZSh0YWxsX3Z0eV92ZWNfY3R4LCB2LT5pbmRleCwKKwkJCQkgICAgICAgc2l6ZW9mKHZvaWQgKikgKiAodi0+YWxsb2NlZCAqIDIpKTsKKwltZW1zZXQoJnYtPmluZGV4W3YtPmFsbG9jZWRdLCAwLCBzaXplb2Yodm9pZCAqKSAqIHYtPmFsbG9jZWQpOworCXYtPmFsbG9jZWQgKj0gMjsKKworCWlmICh2LT5hbGxvY2VkIDw9IG51bSkKKwkJdmVjdG9yX2Vuc3VyZSh2LCBudW0pOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIG9ubHkgcmV0dXJucyBuZXh0IGVtcHR5IHNsb3QgaW5kZXguICBJdCBkb3NlIG5vdCBtZWFuCisgICB0aGUgc2xvdCdzIGluZGV4IG1lbW9yeSBpcyBhc3NpZ25lZCwgcGxlYXNlIGNhbGwgdmVjdG9yX2Vuc3VyZSgpCisgICBhZnRlciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uICovCitpbnQgdmVjdG9yX2VtcHR5X3Nsb3QodmVjdG9yIHYpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAodi0+YWN0aXZlID09IDApCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IHYtPmFjdGl2ZTsgaSsrKQorCQlpZiAodi0+aW5kZXhbaV0gPT0gMCkKKwkJCXJldHVybiBpOworCisJcmV0dXJuIGk7Cit9CisKKy8qIFNldCB2YWx1ZSB0byB0aGUgc21hbGxlc3QgZW1wdHkgc2xvdC4gKi8KK2ludCB2ZWN0b3Jfc2V0KHZlY3RvciB2LCB2b2lkICp2YWwpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlpID0gdmVjdG9yX2VtcHR5X3Nsb3Qodik7CisJdmVjdG9yX2Vuc3VyZSh2LCBpKTsKKworCXYtPmluZGV4W2ldID0gdmFsOworCisJaWYgKHYtPmFjdGl2ZSA8PSBpKQorCQl2LT5hY3RpdmUgPSBpICsgMTsKKworCXJldHVybiBpOworfQorCisvKiBTZXQgdmFsdWUgdG8gc3BlY2lmaWVkIGluZGV4IHNsb3QuICovCitpbnQgdmVjdG9yX3NldF9pbmRleCh2ZWN0b3IgdiwgdW5zaWduZWQgaW50IGksIHZvaWQgKnZhbCkKK3sKKwl2ZWN0b3JfZW5zdXJlKHYsIGkpOworCisJdi0+aW5kZXhbaV0gPSB2YWw7CisKKwlpZiAodi0+YWN0aXZlIDw9IGkpCisJCXYtPmFjdGl2ZSA9IGkgKyAxOworCisJcmV0dXJuIGk7Cit9CisKKy8qIExvb2sgdXAgdmVjdG9yLiAgKi8KK3ZvaWQgKnZlY3Rvcl9sb29rdXAodmVjdG9yIHYsIHVuc2lnbmVkIGludCBpKQoreworCWlmIChpID49IHYtPmFjdGl2ZSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIHYtPmluZGV4W2ldOworfQorCisvKiBMb29rdXAgdmVjdG9yLCBlbnN1cmUgaXQuICovCit2b2lkICp2ZWN0b3JfbG9va3VwX2Vuc3VyZSh2ZWN0b3IgdiwgdW5zaWduZWQgaW50IGkpCit7CisJdmVjdG9yX2Vuc3VyZSh2LCBpKTsKKwlyZXR1cm4gdi0+aW5kZXhbaV07Cit9CisKKy8qIFVuc2V0IHZhbHVlIGF0IHNwZWNpZmllZCBpbmRleCBzbG90LiAqLwordm9pZCB2ZWN0b3JfdW5zZXQodmVjdG9yIHYsIHVuc2lnbmVkIGludCBpKQoreworCWlmIChpID49IHYtPmFsbG9jZWQpCisJCXJldHVybjsKKworCXYtPmluZGV4W2ldID0gTlVMTDsKKworCWlmIChpICsgMSA9PSB2LT5hY3RpdmUpIHsKKwkJdi0+YWN0aXZlLS07CisJCXdoaWxlIChpICYmIHYtPmluZGV4Wy0taV0gPT0gTlVMTCAmJiB2LT5hY3RpdmUtLSkgOwkvKiBJcyB0aGlzIHVnbHkgPyAqLworCX0KK30KKworLyogQ291bnQgdGhlIG51bWJlciBvZiBub3QgZW1wbHR5IHNsb3QuICovCit1bnNpZ25lZCBpbnQgdmVjdG9yX2NvdW50KHZlY3RvciB2KQoreworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGNvdW50ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCB2LT5hY3RpdmU7IGkrKykKKwkJaWYgKHYtPmluZGV4W2ldICE9IE5VTEwpCisJCQljb3VudCsrOworCisJcmV0dXJuIGNvdW50OworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvdnR5L3Z0eS5jIGIvb3BlbmJzYy9zcmMvdnR5L3Z0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MDY4NTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy92dHkvdnR5LmMKQEAgLTAsMCArMSwxNjc1IEBACisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisKKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorCisjaW5jbHVkZSA8YXJwYS90ZWxuZXQuaD4KKworI2luY2x1ZGUgImNhcmRzaGVsbC5oIgorI2luY2x1ZGUgPHZ0eS92dHkuaD4KKyNpbmNsdWRlIDx2dHkvY29tbWFuZC5oPgorI2luY2x1ZGUgPHZ0eS9idWZmZXIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKworLyogb3VyIGNhbGxiYWNrLCBsb2NhdGVkIGluIHRlbG5ldF9pbnRlcmZhY2UuYyAqLwordm9pZCB2dHlfZXZlbnQoZW51bSBldmVudCBldmVudCwgaW50IHNvY2ssIHN0cnVjdCB2dHkgKnZ0eSk7CisKK2V4dGVybiBzdHJ1Y3QgaG9zdCBob3N0OworCisvKiBWZWN0b3Igd2hpY2ggc3RvcmUgZWFjaCB2dHkgc3RydWN0dXJlLiAqLworc3RhdGljIHZlY3RvciB2dHl2ZWM7CisKK3ZlY3RvciBWdnR5X3NlcnZfdGhyZWFkOworCitjaGFyICp2dHlfY3dkID0gTlVMTDsKKworLyogQ29uZmlndXJlIGxvY2suICovCitzdGF0aWMgaW50IHZ0eV9jb25maWc7CisKK3N0YXRpYyBpbnQgbm9fcGFzc3dvcmRfY2hlY2sgPSAxOworCit2b2lkICp0YWxsX3Z0eV9jdHg7CisKK3N0YXRpYyB2b2lkIHZ0eV9jbGVhcl9idWYoc3RydWN0IHZ0eSAqdnR5KQoreworCW1lbXNldCh2dHktPmJ1ZiwgMCwgdnR5LT5tYXgpOworfQorCisvKiBBbGxvY2F0ZSBuZXcgdnR5IHN0cnVjdC4gKi8KK3N0cnVjdCB2dHkgKnZ0eV9uZXcoKQoreworCXN0cnVjdCB2dHkgKm5ldyA9IHRhbGxvY196ZXJvKHRhbGxfdnR5X2N0eCwgc3RydWN0IHZ0eSk7CisKKwlpZiAoIW5ldykKKwkJZ290byBvdXQ7CisKKwluZXctPm9idWYgPSBidWZmZXJfbmV3KG5ldywgMCk7CS8qIFVzZSBkZWZhdWx0IGJ1ZmZlciBzaXplLiAqLworCWlmICghbmV3LT5vYnVmKQorCQlnb3RvIG91dF9uZXc7CisJbmV3LT5idWYgPSBfdGFsbG9jX3plcm8obmV3LCBWVFlfQlVGU0laLCAidnR5X25ldy0+YnVmIik7CisJaWYgKCFuZXctPmJ1ZikKKwkJZ290byBvdXRfb2J1ZjsKKworCW5ldy0+bWF4ID0gVlRZX0JVRlNJWjsKKworCXJldHVybiBuZXc7CisKK291dF9vYnVmOgorCWJ1ZmZlcl9mcmVlKG5ldy0+b2J1Zik7CitvdXRfbmV3OgorCXRhbGxvY19mcmVlKG5ldyk7CisJbmV3ID0gTlVMTDsKK291dDoKKwlyZXR1cm4gbmV3OworfQorCisvKiBBdXRoZW50aWNhdGlvbiBvZiB2dHkgKi8KK3N0YXRpYyB2b2lkIHZ0eV9hdXRoKHN0cnVjdCB2dHkgKnZ0eSwgY2hhciAqYnVmKQoreworCWNoYXIgKnBhc3N3ZCA9IE5VTEw7CisJZW51bSBub2RlX3R5cGUgbmV4dF9ub2RlID0gMDsKKwlpbnQgZmFpbDsKKwljaGFyICpjcnlwdChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisKKwlzd2l0Y2ggKHZ0eS0+bm9kZSkgeworCWNhc2UgQVVUSF9OT0RFOgorI2lmZGVmIFZUWV9DUllQVF9QVworCQlpZiAoaG9zdC5lbmNyeXB0KQorCQkJcGFzc3dkID0gaG9zdC5wYXNzd29yZF9lbmNyeXB0OworCQllbHNlCisjZW5kaWYKKwkJCXBhc3N3ZCA9IGhvc3QucGFzc3dvcmQ7CisJCWlmIChob3N0LmFkdmFuY2VkKQorCQkJbmV4dF9ub2RlID0gaG9zdC5lbmFibGUgPyBWSUVXX05PREUgOiBFTkFCTEVfTk9ERTsKKwkJZWxzZQorCQkJbmV4dF9ub2RlID0gVklFV19OT0RFOworCQlicmVhazsKKwljYXNlIEFVVEhfRU5BQkxFX05PREU6CisjaWZkZWYgVlRZX0NSWVBUX1BXCisJCWlmIChob3N0LmVuY3J5cHQpCisJCQlwYXNzd2QgPSBob3N0LmVuYWJsZV9lbmNyeXB0OworCQllbHNlCisjZW5kaWYKKwkJCXBhc3N3ZCA9IGhvc3QuZW5hYmxlOworCQluZXh0X25vZGUgPSBFTkFCTEVfTk9ERTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHBhc3N3ZCkgeworI2lmZGVmIFZUWV9DUllQVF9QVworCQlpZiAoaG9zdC5lbmNyeXB0KQorCQkJZmFpbCA9IHN0cmNtcChjcnlwdChidWYsIHBhc3N3ZCksIHBhc3N3ZCk7CisJCWVsc2UKKyNlbmRpZgorCQkJZmFpbCA9IHN0cmNtcChidWYsIHBhc3N3ZCk7CisJfSBlbHNlCisJCWZhaWwgPSAxOworCisJaWYgKCFmYWlsKSB7CisJCXZ0eS0+ZmFpbCA9IDA7CisJCXZ0eS0+bm9kZSA9IG5leHRfbm9kZTsJLyogU3VjY2VzcyAhICovCisJfSBlbHNlIHsKKwkJdnR5LT5mYWlsKys7CisJCWlmICh2dHktPmZhaWwgPj0gMykgeworCQkJaWYgKHZ0eS0+bm9kZSA9PSBBVVRIX05PREUpIHsKKwkJCQl2dHlfb3V0KHZ0eSwKKwkJCQkJIiUlIEJhZCBwYXNzd29yZHMsIHRvbyBtYW55IGZhaWx1cmVzISVzIiwKKwkJCQkJVlRZX05FV0xJTkUpOworCQkJCXZ0eS0+c3RhdHVzID0gVlRZX0NMT1NFOworCQkJfSBlbHNlIHsKKwkJCQkvKiBBVVRIX0VOQUJMRV9OT0RFICovCisJCQkJdnR5LT5mYWlsID0gMDsKKwkJCQl2dHlfb3V0KHZ0eSwKKwkJCQkJIiUlIEJhZCBlbmFibGUgcGFzc3dvcmRzLCB0b28gbWFueSBmYWlsdXJlcyElcyIsCisJCQkJCVZUWV9ORVdMSU5FKTsKKwkJCQl2dHktPm5vZGUgPSBWSUVXX05PREU7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qIENsb3NlIHZ0eSBpbnRlcmZhY2UuICovCit2b2lkIHZ0eV9jbG9zZShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaW50IGk7CisKKwlpZiAodnR5LT5vYnVmKSAgeworCQkvKiBGbHVzaCBidWZmZXIuICovCisJCWJ1ZmZlcl9mbHVzaF9hbGwodnR5LT5vYnVmLCB2dHktPmZkKTsKKworCQkvKiBGcmVlIGlucHV0IGJ1ZmZlci4gKi8KKwkJYnVmZmVyX2ZyZWUodnR5LT5vYnVmKTsKKwkJdnR5LT5vYnVmID0gTlVMTDsKKwl9CisKKwkvKiBGcmVlIGNvbW1hbmQgaGlzdG9yeS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgVlRZX01BWEhJU1Q7IGkrKykKKwkJaWYgKHZ0eS0+aGlzdFtpXSkKKwkJCXRhbGxvY19mcmVlKHZ0eS0+aGlzdFtpXSk7CisKKwkvKiBVbnNldCB2ZWN0b3IuICovCisJdmVjdG9yX3Vuc2V0KHZ0eXZlYywgdnR5LT5mZCk7CisKKwkvKiBDbG9zZSBzb2NrZXQuICovCisJaWYgKHZ0eS0+ZmQgPiAwKQorCQljbG9zZSh2dHktPmZkKTsKKworCWlmICh2dHktPmJ1ZikgeworCQl0YWxsb2NfZnJlZSh2dHktPmJ1Zik7CisJCXZ0eS0+YnVmID0gTlVMTDsKKwl9CisKKwkvKiBDaGVjayBjb25maWd1cmUuICovCisJdnR5X2NvbmZpZ191bmxvY2sodnR5KTsKKworCS8qIFZUWV9DTE9TRUQgaXMgaGFuZGxlZCBieSB0aGUgdGVsbmV0X2ludGVyZmFjZSAqLworCXZ0eV9ldmVudChWVFlfQ0xPU0VELCB2dHktPmZkLCB2dHkpOworCisJLyogT0sgZnJlZSB2dHkuICovCisJdGFsbG9jX2ZyZWUodnR5KTsKK30KKworaW50IHZ0eV9zaGVsbChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJcmV0dXJuIHZ0eS0+dHlwZSA9PSBWVFlfU0hFTEwgPyAxIDogMDsKK30KKworCisvKiBWVFkgc3RhbmRhcmQgb3V0cHV0IGZ1bmN0aW9uLiAqLworaW50IHZ0eV9vdXQoc3RydWN0IHZ0eSAqdnR5LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJaW50IGxlbiA9IDA7CisJaW50IHNpemUgPSAxMDI0OworCWNoYXIgYnVmWzEwMjRdOworCWNoYXIgKnAgPSBOVUxMOworCisJaWYgKHZ0eV9zaGVsbCh2dHkpKSB7CisJCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisJCXZwcmludGYoZm9ybWF0LCBhcmdzKTsKKwkJdmFfZW5kKGFyZ3MpOworCX0gZWxzZSB7CisJCS8qIFRyeSB0byB3cml0ZSB0byBpbml0aWFsIGJ1ZmZlci4gICovCisJCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisJCWxlbiA9IHZzbnByaW50ZihidWYsIHNpemVvZiBidWYsIGZvcm1hdCwgYXJncyk7CisJCXZhX2VuZChhcmdzKTsKKworCQkvKiBJbml0aWFsIGJ1ZmZlciBpcyBub3QgZW5vdWdoLiAgKi8KKwkJaWYgKGxlbiA8IDAgfHwgbGVuID49IHNpemUpIHsKKwkJCXdoaWxlICgxKSB7CisJCQkJaWYgKGxlbiA+IC0xKQorCQkJCQlzaXplID0gbGVuICsgMTsKKwkJCQllbHNlCisJCQkJCXNpemUgPSBzaXplICogMjsKKworCQkJCXAgPSB0YWxsb2NfcmVhbGxvY19zaXplKHZ0eSwgcCwgc2l6ZSk7CisJCQkJaWYgKCFwKQorCQkJCQlyZXR1cm4gLTE7CisKKwkJCQl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCQkJCWxlbiA9IHZzbnByaW50ZihwLCBzaXplLCBmb3JtYXQsIGFyZ3MpOworCQkJCXZhX2VuZChhcmdzKTsKKworCQkJCWlmIChsZW4gPiAtMSAmJiBsZW4gPCBzaXplKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8qIFdoZW4gaW5pdGlhbCBidWZmZXIgaXMgZW5vdWdoIHRvIHN0b3JlIGFsbCBvdXRwdXQuICAqLworCQlpZiAoIXApCisJCQlwID0gYnVmOworCisJCS8qIFBvaW50ZXIgcCBtdXN0IHBvaW50IG91dCBidWZmZXIuICovCisJCWJ1ZmZlcl9wdXQodnR5LT5vYnVmLCAodV9jaGFyICopIHAsIGxlbik7CisKKwkJLyogSWYgcCBpcyBub3QgZGlmZmVyZW50IHdpdGggYnVmLCBpdCBpcyBhbGxvY2F0ZWQgYnVmZmVyLiAgKi8KKwkJaWYgKHAgIT0gYnVmKQorCQkJdGFsbG9jX2ZyZWUocCk7CisJfQorCisJdnR5X2V2ZW50KFZUWV9XUklURSwgdnR5LT5mZCwgdnR5KTsKKworCXJldHVybiBsZW47Cit9CisKK2ludCB2dHlfb3V0X25ld2xpbmUoc3RydWN0IHZ0eSAqdnR5KQoreworCWNoYXIgKnAgPSB2dHlfbmV3bGluZSh2dHkpOworCWJ1ZmZlcl9wdXQodnR5LT5vYnVmLCBwLCBzdHJsZW4ocCkpOworCXJldHVybiAwOworfQorCitpbnQgdnR5X2NvbmZpZ19sb2NrKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpZiAodnR5X2NvbmZpZyA9PSAwKSB7CisJCXZ0eS0+Y29uZmlnID0gMTsKKwkJdnR5X2NvbmZpZyA9IDE7CisJfQorCXJldHVybiB2dHktPmNvbmZpZzsKK30KKworaW50IHZ0eV9jb25maWdfdW5sb2NrKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpZiAodnR5X2NvbmZpZyA9PSAxICYmIHZ0eS0+Y29uZmlnID09IDEpIHsKKwkJdnR5LT5jb25maWcgPSAwOworCQl2dHlfY29uZmlnID0gMDsKKwl9CisJcmV0dXJuIHZ0eS0+Y29uZmlnOworfQorCisvKiBTYXkgaGVsbG8gdG8gdnR5IGludGVyZmFjZS4gKi8KK3ZvaWQgdnR5X2hlbGxvKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpZiAoaG9zdC5tb3RkZmlsZSkgeworCQlGSUxFICpmOworCQljaGFyIGJ1Zls0MDk2XTsKKworCQlmID0gZm9wZW4oaG9zdC5tb3RkZmlsZSwgInIiKTsKKwkJaWYgKGYpIHsKKwkJCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmKSkgeworCQkJCWNoYXIgKnM7CisJCQkJLyogd29yayBiYWNrd2FyZHMgdG8gaWdub3JlIHRyYWlsbGluZyBpc3NwYWNlKCkgKi8KKwkJCQlmb3IgKHMgPSBidWYgKyBzdHJsZW4oYnVmKTsKKwkJCQkgICAgIChzID4gYnVmKSAmJiBpc3NwYWNlKCoocyAtIDEpKTsgcy0tKSA7CisJCQkJKnMgPSAnXDAnOworCQkJCXZ0eV9vdXQodnR5LCAiJXMlcyIsIGJ1ZiwgVlRZX05FV0xJTkUpOworCQkJfQorCQkJZmNsb3NlKGYpOworCQl9IGVsc2UKKwkJCXZ0eV9vdXQodnR5LCAiTU9URCBmaWxlIG5vdCBmb3VuZCVzIiwgVlRZX05FV0xJTkUpOworCX0gZWxzZSBpZiAoaG9zdC5tb3RkKQorCQl2dHlfb3V0KHZ0eSwgIiVzIiwgaG9zdC5tb3RkKTsKK30KKworLyogUHV0IG91dCBwcm9tcHQgYW5kIHdhaXQgaW5wdXQgZnJvbSB1c2VyLiAqLworc3RhdGljIHZvaWQgdnR5X3Byb21wdChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJc3RydWN0IHV0c25hbWUgbmFtZXM7CisJY29uc3QgY2hhciAqaG9zdG5hbWU7CisKKwlpZiAodnR5LT50eXBlID09IFZUWV9URVJNKSB7CisJCWhvc3RuYW1lID0gaG9zdC5uYW1lOworCQlpZiAoIWhvc3RuYW1lKSB7CisJCQl1bmFtZSgmbmFtZXMpOworCQkJaG9zdG5hbWUgPSBuYW1lcy5ub2RlbmFtZTsKKwkJfQorCQl2dHlfb3V0KHZ0eSwgY21kX3Byb21wdCh2dHktPm5vZGUpLCBob3N0bmFtZSk7CisJfQorfQorCisvKiBDb21tYW5kIGV4ZWN1dGlvbiBvdmVyIHRoZSB2dHkgaW50ZXJmYWNlLiAqLworc3RhdGljIGludCB2dHlfY29tbWFuZChzdHJ1Y3QgdnR5ICp2dHksIGNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXZlY3RvciB2bGluZTsKKworCS8qIFNwbGl0IHJlYWRsaW5lIHN0cmluZyB1cCBpbnRvIHRoZSB2ZWN0b3IgKi8KKwl2bGluZSA9IGNtZF9tYWtlX3N0cnZlYyhidWYpOworCisJaWYgKHZsaW5lID09IE5VTEwpCisJCXJldHVybiBDTURfU1VDQ0VTUzsKKworCXJldCA9IGNtZF9leGVjdXRlX2NvbW1hbmQodmxpbmUsIHZ0eSwgTlVMTCwgMCk7CisJaWYgKHJldCAhPSBDTURfU1VDQ0VTUykKKwkJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSBDTURfV0FSTklORzoKKwkJCWlmICh2dHktPnR5cGUgPT0gVlRZX0ZJTEUpCisJCQkJdnR5X291dCh2dHksICJXYXJuaW5nLi4uJXMiLCBWVFlfTkVXTElORSk7CisJCQlicmVhazsKKwkJY2FzZSBDTURfRVJSX0FNQklHVU9VUzoKKwkJCXZ0eV9vdXQodnR5LCAiJSUgQW1iaWd1b3VzIGNvbW1hbmQuJXMiLCBWVFlfTkVXTElORSk7CisJCQlicmVhazsKKwkJY2FzZSBDTURfRVJSX05PX01BVENIOgorCQkJdnR5X291dCh2dHksICIlJSBVbmtub3duIGNvbW1hbmQuJXMiLCBWVFlfTkVXTElORSk7CisJCQlicmVhazsKKwkJY2FzZSBDTURfRVJSX0lOQ09NUExFVEU6CisJCQl2dHlfb3V0KHZ0eSwgIiUlIENvbW1hbmQgaW5jb21wbGV0ZS4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJCWJyZWFrOworCQl9CisJY21kX2ZyZWVfc3RydmVjKHZsaW5lKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIHRlbG5ldF9iYWNrd2FyZF9jaGFyID0gMHgwODsKK3N0YXRpYyBjb25zdCBjaGFyIHRlbG5ldF9zcGFjZV9jaGFyID0gJyAnOworCisvKiBCYXNpYyBmdW5jdGlvbiB0byB3cml0ZSBidWZmZXIgdG8gdnR5LiAqLworc3RhdGljIHZvaWQgdnR5X3dyaXRlKHN0cnVjdCB2dHkgKnZ0eSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbmJ5dGVzKQoreworCWlmICgodnR5LT5ub2RlID09IEFVVEhfTk9ERSkgfHwgKHZ0eS0+bm9kZSA9PSBBVVRIX0VOQUJMRV9OT0RFKSkKKwkJcmV0dXJuOworCisJLyogU2hvdWxkIHdlIGRvIGJ1ZmZlcmluZyBoZXJlID8gIEFuZCBtYWtlIHZ0eV9mbHVzaCAodnR5KSA/ICovCisJYnVmZmVyX3B1dCh2dHktPm9idWYsIGJ1ZiwgbmJ5dGVzKTsKK30KKworLyogRW5zdXJlIGxlbmd0aCBvZiBpbnB1dCBidWZmZXIuICBJcyBidWZmZXIgaXMgc2hvcnQsIGRvdWJsZSBpdC4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9lbnN1cmUoc3RydWN0IHZ0eSAqdnR5LCBpbnQgbGVuZ3RoKQoreworCWlmICh2dHktPm1heCA8PSBsZW5ndGgpIHsKKwkJdnR5LT5tYXggKj0gMjsKKwkJdnR5LT5idWYgPSB0YWxsb2NfcmVhbGxvY19zaXplKHZ0eSwgdnR5LT5idWYsIHZ0eS0+bWF4KTsKKwkJLy8gRklYTUU6IGNoZWNrIHJldHVybgorCX0KK30KKworLyogQmFzaWMgZnVuY3Rpb24gdG8gaW5zZXJ0IGNoYXJhY3RlciBpbnRvIHZ0eS4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9zZWxmX2luc2VydChzdHJ1Y3QgdnR5ICp2dHksIGNoYXIgYykKK3sKKwlpbnQgaTsKKwlpbnQgbGVuZ3RoOworCisJdnR5X2Vuc3VyZSh2dHksIHZ0eS0+bGVuZ3RoICsgMSk7CisJbGVuZ3RoID0gdnR5LT5sZW5ndGggLSB2dHktPmNwOworCW1lbW1vdmUoJnZ0eS0+YnVmW3Z0eS0+Y3AgKyAxXSwgJnZ0eS0+YnVmW3Z0eS0+Y3BdLCBsZW5ndGgpOworCXZ0eS0+YnVmW3Z0eS0+Y3BdID0gYzsKKworCXZ0eV93cml0ZSh2dHksICZ2dHktPmJ1Zlt2dHktPmNwXSwgbGVuZ3RoICsgMSk7CisJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorCQl2dHlfd3JpdGUodnR5LCAmdGVsbmV0X2JhY2t3YXJkX2NoYXIsIDEpOworCisJdnR5LT5jcCsrOworCXZ0eS0+bGVuZ3RoKys7Cit9CisKKy8qIFNlbGYgaW5zZXJ0IGNoYXJhY3RlciAnYycgaW4gb3ZlcndyaXRlIG1vZGUuICovCitzdGF0aWMgdm9pZCB2dHlfc2VsZl9pbnNlcnRfb3ZlcndyaXRlKHN0cnVjdCB2dHkgKnZ0eSwgY2hhciBjKQoreworCXZ0eV9lbnN1cmUodnR5LCB2dHktPmxlbmd0aCArIDEpOworCXZ0eS0+YnVmW3Z0eS0+Y3ArK10gPSBjOworCisJaWYgKHZ0eS0+Y3AgPiB2dHktPmxlbmd0aCkKKwkJdnR5LT5sZW5ndGgrKzsKKworCWlmICgodnR5LT5ub2RlID09IEFVVEhfTk9ERSkgfHwgKHZ0eS0+bm9kZSA9PSBBVVRIX0VOQUJMRV9OT0RFKSkKKwkJcmV0dXJuOworCisJdnR5X3dyaXRlKHZ0eSwgJmMsIDEpOworfQorCisvKiBJbnNlcnQgYSB3b3JkIGludG8gdnR5IGludGVyZmFjZSB3aXRoIG92ZXJ3cml0ZSBtb2RlLiAqLworc3RhdGljIHZvaWQgdnR5X2luc2VydF93b3JkX292ZXJ3cml0ZShzdHJ1Y3QgdnR5ICp2dHksIGNoYXIgKnN0cikKK3sKKwlpbnQgbGVuID0gc3RybGVuKHN0cik7CisJdnR5X3dyaXRlKHZ0eSwgc3RyLCBsZW4pOworCXN0cmNweSgmdnR5LT5idWZbdnR5LT5jcF0sIHN0cik7CisJdnR5LT5jcCArPSBsZW47CisJdnR5LT5sZW5ndGggPSB2dHktPmNwOworfQorCisvKiBGb3J3YXJkIGNoYXJhY3Rlci4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9mb3J3YXJkX2NoYXIoc3RydWN0IHZ0eSAqdnR5KQoreworCWlmICh2dHktPmNwIDwgdnR5LT5sZW5ndGgpIHsKKwkJdnR5X3dyaXRlKHZ0eSwgJnZ0eS0+YnVmW3Z0eS0+Y3BdLCAxKTsKKwkJdnR5LT5jcCsrOworCX0KK30KKworLyogQmFja3dhcmQgY2hhcmFjdGVyLiAqLworc3RhdGljIHZvaWQgdnR5X2JhY2t3YXJkX2NoYXIoc3RydWN0IHZ0eSAqdnR5KQoreworCWlmICh2dHktPmNwID4gMCkgeworCQl2dHktPmNwLS07CisJCXZ0eV93cml0ZSh2dHksICZ0ZWxuZXRfYmFja3dhcmRfY2hhciwgMSk7CisJfQorfQorCisvKiBNb3ZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUuICovCitzdGF0aWMgdm9pZCB2dHlfYmVnaW5uaW5nX29mX2xpbmUoc3RydWN0IHZ0eSAqdnR5KQoreworCXdoaWxlICh2dHktPmNwKQorCQl2dHlfYmFja3dhcmRfY2hhcih2dHkpOworfQorCisvKiBNb3ZlIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUuICovCitzdGF0aWMgdm9pZCB2dHlfZW5kX29mX2xpbmUoc3RydWN0IHZ0eSAqdnR5KQoreworCXdoaWxlICh2dHktPmNwIDwgdnR5LT5sZW5ndGgpCisJCXZ0eV9mb3J3YXJkX2NoYXIodnR5KTsKK30KKworLyogQWRkIGN1cnJlbnQgY29tbWFuZCBsaW5lIHRvIHRoZSBoaXN0b3J5IGJ1ZmZlci4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9oaXN0X2FkZChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaW50IGluZGV4OworCisJaWYgKHZ0eS0+bGVuZ3RoID09IDApCisJCXJldHVybjsKKworCWluZGV4ID0gdnR5LT5oaW5kZXggPyB2dHktPmhpbmRleCAtIDEgOiBWVFlfTUFYSElTVCAtIDE7CisKKwkvKiBJZ25vcmUgdGhlIHNhbWUgc3RyaW5nIGFzIHByZXZpb3VzIG9uZS4gKi8KKwlpZiAodnR5LT5oaXN0W2luZGV4XSkKKwkJaWYgKHN0cmNtcCh2dHktPmJ1ZiwgdnR5LT5oaXN0W2luZGV4XSkgPT0gMCkgeworCQkJdnR5LT5ocCA9IHZ0eS0+aGluZGV4OworCQkJcmV0dXJuOworCQl9CisKKwkvKiBJbnNlcnQgaGlzdG9yeSBlbnRyeS4gKi8KKwlpZiAodnR5LT5oaXN0W3Z0eS0+aGluZGV4XSkKKwkJdGFsbG9jX2ZyZWUodnR5LT5oaXN0W3Z0eS0+aGluZGV4XSk7CisJdnR5LT5oaXN0W3Z0eS0+aGluZGV4XSA9IHRhbGxvY19zdHJkdXAodnR5LCB2dHktPmJ1Zik7CisKKwkvKiBIaXN0b3J5IGluZGV4IHJvdGF0aW9uLiAqLworCXZ0eS0+aGluZGV4Kys7CisJaWYgKHZ0eS0+aGluZGV4ID09IFZUWV9NQVhISVNUKQorCQl2dHktPmhpbmRleCA9IDA7CisKKwl2dHktPmhwID0gdnR5LT5oaW5kZXg7Cit9CisKKy8qIEdldCB0ZWxuZXQgd2luZG93IHNpemUuICovCitzdGF0aWMgaW50Cit2dHlfdGVsbmV0X29wdGlvbiAoc3RydWN0IHZ0eSAqdnR5LCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBuYnl0ZXMpCit7CisjaWZkZWYgVEVMTkVUX09QVElPTl9ERUJVRworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgbmJ5dGVzOyBpKyspCisgICAgeworICAgICAgc3dpdGNoIChidWZbaV0pCisJeworCWNhc2UgSUFDOgorCSAgdnR5X291dCAodnR5LCAiSUFDICIpOworCSAgYnJlYWs7CisJY2FzZSBXSUxMOgorCSAgdnR5X291dCAodnR5LCAiV0lMTCAiKTsKKwkgIGJyZWFrOworCWNhc2UgV09OVDoKKwkgIHZ0eV9vdXQgKHZ0eSwgIldPTlQgIik7CisJICBicmVhazsKKwljYXNlIERPOgorCSAgdnR5X291dCAodnR5LCAiRE8gIik7CisJICBicmVhazsKKwljYXNlIERPTlQ6CisJICB2dHlfb3V0ICh2dHksICJET05UICIpOworCSAgYnJlYWs7CisJY2FzZSBTQjoKKwkgIHZ0eV9vdXQgKHZ0eSwgIlNCICIpOworCSAgYnJlYWs7CisJY2FzZSBTRToKKwkgIHZ0eV9vdXQgKHZ0eSwgIlNFICIpOworCSAgYnJlYWs7CisJY2FzZSBURUxPUFRfRUNITzoKKwkgIHZ0eV9vdXQgKHZ0eSwgIlRFTE9QVF9FQ0hPICVzIiwgVlRZX05FV0xJTkUpOworCSAgYnJlYWs7CisJY2FzZSBURUxPUFRfU0dBOgorCSAgdnR5X291dCAodnR5LCAiVEVMT1BUX1NHQSAlcyIsIFZUWV9ORVdMSU5FKTsKKwkgIGJyZWFrOworCWNhc2UgVEVMT1BUX05BV1M6CisJICB2dHlfb3V0ICh2dHksICJURUxPUFRfTkFXUyAlcyIsIFZUWV9ORVdMSU5FKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICB2dHlfb3V0ICh2dHksICIleCAiLCBidWZbaV0pOworCSAgYnJlYWs7CisJfQorICAgIH0KKyAgdnR5X291dCAodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisKKyNlbmRpZiAvKiBURUxORVRfT1BUSU9OX0RFQlVHICovCisKKyAgc3dpdGNoIChidWZbMF0pCisgICAgeworICAgIGNhc2UgU0I6CisgICAgICB2dHktPnNiX2xlbiA9IDA7CisgICAgICB2dHktPmlhY19zYl9pbl9wcm9ncmVzcyA9IDE7CisgICAgICByZXR1cm4gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0U6CisgICAgICB7CisJaWYgKCF2dHktPmlhY19zYl9pbl9wcm9ncmVzcykKKwkgIHJldHVybiAwOworCisJaWYgKCh2dHktPnNiX2xlbiA9PSAwKSB8fCAodnR5LT5zYl9idWZbMF0gPT0gJ1wwJykpCisJICB7CisJICAgIHZ0eS0+aWFjX3NiX2luX3Byb2dyZXNzID0gMDsKKwkgICAgcmV0dXJuIDA7CisJICB9CisJc3dpdGNoICh2dHktPnNiX2J1ZlswXSkKKwkgIHsKKwkgIGNhc2UgVEVMT1BUX05BV1M6CisJICAgIGlmICh2dHktPnNiX2xlbiAhPSBURUxORVRfTkFXU19TQl9MRU4pCisJICAgICAgdnR5X291dCh2dHksIlJGQyAxMDczIHZpb2xhdGlvbiBkZXRlY3RlZDogdGVsbmV0IE5BV1Mgb3B0aW9uICIKKwkJCSJzaG91bGQgc2VuZCAlZCBjaGFyYWN0ZXJzLCBidXQgd2UgcmVjZWl2ZWQgJWx1IiwKKwkJCVRFTE5FVF9OQVdTX1NCX0xFTiwgKHVfbG9uZyl2dHktPnNiX2xlbik7CisJICAgIGVsc2UgaWYgKHNpemVvZih2dHktPnNiX2J1ZikgPCBURUxORVRfTkFXU19TQl9MRU4pCisJICAgICAgdnR5X291dCh2dHksICJCdWcgZGV0ZWN0ZWQ6IHNpemVvZih2dHktPnNiX2J1ZikgJWx1IDwgJWQsICIKKwkJICAgICAgICJ0b28gc21hbGwgdG8gaGFuZGxlIHRoZSB0ZWxuZXQgTkFXUyBvcHRpb24iLAorCQkgICAgICAgKHVfbG9uZylzaXplb2YodnR5LT5zYl9idWYpLCBURUxORVRfTkFXU19TQl9MRU4pOworCSAgICBlbHNlCisJICAgICAgeworCQl2dHktPndpZHRoID0gKCh2dHktPnNiX2J1ZlsxXSA8PCA4KXx2dHktPnNiX2J1ZlsyXSk7CisJCXZ0eS0+aGVpZ2h0ID0gKCh2dHktPnNiX2J1ZlszXSA8PCA4KXx2dHktPnNiX2J1Zls0XSk7CisjaWZkZWYgVEVMTkVUX09QVElPTl9ERUJVRworCQl2dHlfb3V0KHZ0eSwgIlRFTE5FVCBOQVdTIHdpbmRvdyBzaXplIG5lZ290aWF0aW9uIGNvbXBsZXRlZDogIgorCQkJICAgICAgIndpZHRoICVkLCBoZWlnaHQgJWQlcyIsCisJCQl2dHktPndpZHRoLCB2dHktPmhlaWdodCwgVlRZX05FV0xJTkUpOworI2VuZGlmCisJICAgICAgfQorCSAgICBicmVhazsKKwkgIH0KKwl2dHktPmlhY19zYl9pbl9wcm9ncmVzcyA9IDA7CisJcmV0dXJuIDA7CisJYnJlYWs7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8qIEV4ZWN1dGUgY3VycmVudCBjb21tYW5kIGxpbmUuICovCitzdGF0aWMgaW50IHZ0eV9leGVjdXRlKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gQ01EX1NVQ0NFU1M7CisKKwlzd2l0Y2ggKHZ0eS0+bm9kZSkgeworCWNhc2UgQVVUSF9OT0RFOgorCWNhc2UgQVVUSF9FTkFCTEVfTk9ERToKKwkJdnR5X2F1dGgodnR5LCB2dHktPmJ1Zik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IHZ0eV9jb21tYW5kKHZ0eSwgdnR5LT5idWYpOworCQlpZiAodnR5LT50eXBlID09IFZUWV9URVJNKQorCQkJdnR5X2hpc3RfYWRkKHZ0eSk7CisJCWJyZWFrOworCX0KKworCS8qIENsZWFyIGNvbW1hbmQgbGluZSBidWZmZXIuICovCisJdnR5LT5jcCA9IHZ0eS0+bGVuZ3RoID0gMDsKKwl2dHlfY2xlYXJfYnVmKHZ0eSk7CisKKwlpZiAodnR5LT5zdGF0dXMgIT0gVlRZX0NMT1NFKQorCQl2dHlfcHJvbXB0KHZ0eSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBTZW5kIFdJTEwgVEVMT1BUX0VDSE8gdG8gcmVtb3RlIHNlcnZlci4gKi8KK3N0YXRpYyB2b2lkCit2dHlfd2lsbF9lY2hvIChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdW5zaWduZWQgY2hhciBjbWRbXSA9IHsgSUFDLCBXSUxMLCBURUxPUFRfRUNITywgJ1wwJyB9OworCXZ0eV9vdXQgKHZ0eSwgIiVzIiwgY21kKTsKK30KKworLyogTWFrZSBzdXBwcmVzcyBHby1BaGVhZCB0ZWxuZXQgb3B0aW9uLiAqLworc3RhdGljIHZvaWQKK3Z0eV93aWxsX3N1cHByZXNzX2dvX2FoZWFkIChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdW5zaWduZWQgY2hhciBjbWRbXSA9IHsgSUFDLCBXSUxMLCBURUxPUFRfU0dBLCAnXDAnIH07CisJdnR5X291dCAodnR5LCAiJXMiLCBjbWQpOworfQorCisvKiBNYWtlIGRvbid0IHVzZSBsaW5lbW9kZSBvdmVyIHRlbG5ldC4gKi8KK3N0YXRpYyB2b2lkCit2dHlfZG9udF9saW5lbW9kZSAoc3RydWN0IHZ0eSAqdnR5KQoreworCXVuc2lnbmVkIGNoYXIgY21kW10gPSB7IElBQywgRE9OVCwgVEVMT1BUX0xJTkVNT0RFLCAnXDAnIH07CisJdnR5X291dCAodnR5LCAiJXMiLCBjbWQpOworfQorCisvKiBVc2Ugd2luZG93IHNpemUuICovCitzdGF0aWMgdm9pZAordnR5X2RvX3dpbmRvd19zaXplIChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdW5zaWduZWQgY2hhciBjbWRbXSA9IHsgSUFDLCBETywgVEVMT1BUX05BV1MsICdcMCcgfTsKKwl2dHlfb3V0ICh2dHksICIlcyIsIGNtZCk7Cit9CisKK3N0YXRpYyB2b2lkIHZ0eV9raWxsX2xpbmVfZnJvbV9iZWdpbm5pbmcoc3RydWN0IHZ0eSAqKTsKK3N0YXRpYyB2b2lkIHZ0eV9yZWRyYXdfbGluZShzdHJ1Y3QgdnR5ICopOworCisvKiBQcmludCBjb21tYW5kIGxpbmUgaGlzdG9yeS4gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20KKyAgIHZ0eV9uZXh0X2xpbmUgYW5kIHZ0eV9wcmV2aW91c19saW5lLiAqLworc3RhdGljIHZvaWQgdnR5X2hpc3RvcnlfcHJpbnQoc3RydWN0IHZ0eSAqdnR5KQoreworCWludCBsZW5ndGg7CisKKwl2dHlfa2lsbF9saW5lX2Zyb21fYmVnaW5uaW5nKHZ0eSk7CisKKwkvKiBHZXQgcHJldmlvdXMgbGluZSBmcm9tIGhpc3RvcnkgYnVmZmVyICovCisJbGVuZ3RoID0gc3RybGVuKHZ0eS0+aGlzdFt2dHktPmhwXSk7CisJbWVtY3B5KHZ0eS0+YnVmLCB2dHktPmhpc3RbdnR5LT5ocF0sIGxlbmd0aCk7CisJdnR5LT5jcCA9IHZ0eS0+bGVuZ3RoID0gbGVuZ3RoOworCisJLyogUmVkcmF3IGN1cnJlbnQgbGluZSAqLworCXZ0eV9yZWRyYXdfbGluZSh2dHkpOworfQorCisvKiBTaG93IG5leHQgY29tbWFuZCBsaW5lIGhpc3RvcnkuICovCitzdGF0aWMgdm9pZCB2dHlfbmV4dF9saW5lKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpbnQgdHJ5X2luZGV4OworCisJaWYgKHZ0eS0+aHAgPT0gdnR5LT5oaW5kZXgpCisJCXJldHVybjsKKworCS8qIFRyeSBpcyB0aGVyZSBoaXN0b3J5IGV4aXN0IG9yIG5vdC4gKi8KKwl0cnlfaW5kZXggPSB2dHktPmhwOworCWlmICh0cnlfaW5kZXggPT0gKFZUWV9NQVhISVNUIC0gMSkpCisJCXRyeV9pbmRleCA9IDA7CisJZWxzZQorCQl0cnlfaW5kZXgrKzsKKworCS8qIElmIHRoZXJlIGlzIG5vdCBoaXN0b3J5IHJldHVybi4gKi8KKwlpZiAodnR5LT5oaXN0W3RyeV9pbmRleF0gPT0gTlVMTCkKKwkJcmV0dXJuOworCWVsc2UKKwkJdnR5LT5ocCA9IHRyeV9pbmRleDsKKworCXZ0eV9oaXN0b3J5X3ByaW50KHZ0eSk7Cit9CisKKy8qIFNob3cgcHJldmlvdXMgY29tbWFuZCBsaW5lIGhpc3RvcnkuICovCitzdGF0aWMgdm9pZCB2dHlfcHJldmlvdXNfbGluZShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaW50IHRyeV9pbmRleDsKKworCXRyeV9pbmRleCA9IHZ0eS0+aHA7CisJaWYgKHRyeV9pbmRleCA9PSAwKQorCQl0cnlfaW5kZXggPSBWVFlfTUFYSElTVCAtIDE7CisJZWxzZQorCQl0cnlfaW5kZXgtLTsKKworCWlmICh2dHktPmhpc3RbdHJ5X2luZGV4XSA9PSBOVUxMKQorCQlyZXR1cm47CisJZWxzZQorCQl2dHktPmhwID0gdHJ5X2luZGV4OworCisJdnR5X2hpc3RvcnlfcHJpbnQodnR5KTsKK30KKworLyogVGhpcyBmdW5jdGlvbiByZWRyYXcgYWxsIG9mIHRoZSBjb21tYW5kIGxpbmUgY2hhcmFjdGVyLiAqLworc3RhdGljIHZvaWQgdnR5X3JlZHJhd19saW5lKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl2dHlfd3JpdGUodnR5LCB2dHktPmJ1ZiwgdnR5LT5sZW5ndGgpOworCXZ0eS0+Y3AgPSB2dHktPmxlbmd0aDsKK30KKworLyogRm9yd2FyZCB3b3JkLiAqLworc3RhdGljIHZvaWQgdnR5X2ZvcndhcmRfd29yZChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJd2hpbGUgKHZ0eS0+Y3AgIT0gdnR5LT5sZW5ndGggJiYgdnR5LT5idWZbdnR5LT5jcF0gIT0gJyAnKQorCQl2dHlfZm9yd2FyZF9jaGFyKHZ0eSk7CisKKwl3aGlsZSAodnR5LT5jcCAhPSB2dHktPmxlbmd0aCAmJiB2dHktPmJ1Zlt2dHktPmNwXSA9PSAnICcpCisJCXZ0eV9mb3J3YXJkX2NoYXIodnR5KTsKK30KKworLyogQmFja3dhcmQgd29yZCB3aXRob3V0IHNraXBwaW5nIHRyYWluaW5nIHNwYWNlLiAqLworc3RhdGljIHZvaWQgdnR5X2JhY2t3YXJkX3B1cmVfd29yZChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJd2hpbGUgKHZ0eS0+Y3AgPiAwICYmIHZ0eS0+YnVmW3Z0eS0+Y3AgLSAxXSAhPSAnICcpCisJCXZ0eV9iYWNrd2FyZF9jaGFyKHZ0eSk7Cit9CisKKy8qIEJhY2t3YXJkIHdvcmQuICovCitzdGF0aWMgdm9pZCB2dHlfYmFja3dhcmRfd29yZChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJd2hpbGUgKHZ0eS0+Y3AgPiAwICYmIHZ0eS0+YnVmW3Z0eS0+Y3AgLSAxXSA9PSAnICcpCisJCXZ0eV9iYWNrd2FyZF9jaGFyKHZ0eSk7CisKKwl3aGlsZSAodnR5LT5jcCA+IDAgJiYgdnR5LT5idWZbdnR5LT5jcCAtIDFdICE9ICcgJykKKwkJdnR5X2JhY2t3YXJkX2NoYXIodnR5KTsKK30KKworLyogV2hlbiAnXkQnIGlzIHR5cGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgd2UgbW92ZSB0byB0aGUgZG93bgorICAgbGV2ZWwuICovCitzdGF0aWMgdm9pZCB2dHlfZG93bl9sZXZlbChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKwkoKmNvbmZpZ19leGl0X2NtZC5mdW5jKSAoTlVMTCwgdnR5LCAwLCBOVUxMKTsKKwl2dHlfcHJvbXB0KHZ0eSk7CisJdnR5LT5jcCA9IDA7Cit9CisKKy8qIFdoZW4gJ15aJyBpcyByZWNlaXZlZCBmcm9tIHZ0eSwgbW92ZSBkb3duIHRvIHRoZSBlbmFibGUgbW9kZS4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9lbmRfY29uZmlnKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCisJc3dpdGNoICh2dHktPm5vZGUpIHsKKwljYXNlIFZJRVdfTk9ERToKKwljYXNlIEVOQUJMRV9OT0RFOgorCQkvKiBOb3RoaW5nIHRvIGRvLiAqLworCQlicmVhazsKKwljYXNlIENPTkZJR19OT0RFOgorCWNhc2UgVlRZX05PREU6CisJCXZ0eV9jb25maWdfdW5sb2NrKHZ0eSk7CisJCXZ0eS0+bm9kZSA9IEVOQUJMRV9OT0RFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBVbmtub3duIG5vZGUsIHdlIGhhdmUgdG8gaWdub3JlIGl0LiAqLworCQlicmVhazsKKwl9CisKKwl2dHlfcHJvbXB0KHZ0eSk7CisJdnR5LT5jcCA9IDA7Cit9CisKKy8qIERlbGV0ZSBhIGNoYXJjdGVyIGF0IHRoZSBjdXJyZW50IHBvaW50LiAqLworc3RhdGljIHZvaWQgdnR5X2RlbGV0ZV9jaGFyKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpbnQgaTsKKwlpbnQgc2l6ZTsKKworCWlmICh2dHktPm5vZGUgPT0gQVVUSF9OT0RFIHx8IHZ0eS0+bm9kZSA9PSBBVVRIX0VOQUJMRV9OT0RFKQorCQlyZXR1cm47CisKKwlpZiAodnR5LT5sZW5ndGggPT0gMCkgeworCQl2dHlfZG93bl9sZXZlbCh2dHkpOworCQlyZXR1cm47CisJfQorCisJaWYgKHZ0eS0+Y3AgPT0gdnR5LT5sZW5ndGgpCisJCXJldHVybjsJCS8qIGNvbXBsZXRpb24gbmVlZCBoZXJlPyAqLworCisJc2l6ZSA9IHZ0eS0+bGVuZ3RoIC0gdnR5LT5jcDsKKworCXZ0eS0+bGVuZ3RoLS07CisJbWVtbW92ZSgmdnR5LT5idWZbdnR5LT5jcF0sICZ2dHktPmJ1Zlt2dHktPmNwICsgMV0sIHNpemUgLSAxKTsKKwl2dHktPmJ1Zlt2dHktPmxlbmd0aF0gPSAnXDAnOworCisJdnR5X3dyaXRlKHZ0eSwgJnZ0eS0+YnVmW3Z0eS0+Y3BdLCBzaXplIC0gMSk7CisJdnR5X3dyaXRlKHZ0eSwgJnRlbG5ldF9zcGFjZV9jaGFyLCAxKTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCXZ0eV93cml0ZSh2dHksICZ0ZWxuZXRfYmFja3dhcmRfY2hhciwgMSk7Cit9CisKKy8qIERlbGV0ZSBhIGNoYXJhY3RlciBiZWZvcmUgdGhlIHBvaW50LiAqLworc3RhdGljIHZvaWQgdnR5X2RlbGV0ZV9iYWNrd2FyZF9jaGFyKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpZiAodnR5LT5jcCA9PSAwKQorCQlyZXR1cm47CisKKwl2dHlfYmFja3dhcmRfY2hhcih2dHkpOworCXZ0eV9kZWxldGVfY2hhcih2dHkpOworfQorCisvKiBLaWxsIHJlc3Qgb2YgbGluZSBmcm9tIGN1cnJlbnQgcG9pbnQuICovCitzdGF0aWMgdm9pZCB2dHlfa2lsbF9saW5lKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpbnQgaTsKKwlpbnQgc2l6ZTsKKworCXNpemUgPSB2dHktPmxlbmd0aCAtIHZ0eS0+Y3A7CisKKwlpZiAoc2l6ZSA9PSAwKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQl2dHlfd3JpdGUodnR5LCAmdGVsbmV0X3NwYWNlX2NoYXIsIDEpOworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCXZ0eV93cml0ZSh2dHksICZ0ZWxuZXRfYmFja3dhcmRfY2hhciwgMSk7CisKKwltZW1zZXQoJnZ0eS0+YnVmW3Z0eS0+Y3BdLCAwLCBzaXplKTsKKwl2dHktPmxlbmd0aCA9IHZ0eS0+Y3A7Cit9CisKKy8qIEtpbGwgbGluZSBmcm9tIHRoZSBiZWdpbm5pbmcuICovCitzdGF0aWMgdm9pZCB2dHlfa2lsbF9saW5lX2Zyb21fYmVnaW5uaW5nKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl2dHlfYmVnaW5uaW5nX29mX2xpbmUodnR5KTsKKwl2dHlfa2lsbF9saW5lKHZ0eSk7Cit9CisKKy8qIERlbGV0ZSBhIHdvcmQgYmVmb3JlIHRoZSBwb2ludC4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9mb3J3YXJkX2tpbGxfd29yZChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJd2hpbGUgKHZ0eS0+Y3AgIT0gdnR5LT5sZW5ndGggJiYgdnR5LT5idWZbdnR5LT5jcF0gPT0gJyAnKQorCQl2dHlfZGVsZXRlX2NoYXIodnR5KTsKKwl3aGlsZSAodnR5LT5jcCAhPSB2dHktPmxlbmd0aCAmJiB2dHktPmJ1Zlt2dHktPmNwXSAhPSAnICcpCisJCXZ0eV9kZWxldGVfY2hhcih2dHkpOworfQorCisvKiBEZWxldGUgYSB3b3JkIGJlZm9yZSB0aGUgcG9pbnQuICovCitzdGF0aWMgdm9pZCB2dHlfYmFja3dhcmRfa2lsbF93b3JkKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl3aGlsZSAodnR5LT5jcCA+IDAgJiYgdnR5LT5idWZbdnR5LT5jcCAtIDFdID09ICcgJykKKwkJdnR5X2RlbGV0ZV9iYWNrd2FyZF9jaGFyKHZ0eSk7CisJd2hpbGUgKHZ0eS0+Y3AgPiAwICYmIHZ0eS0+YnVmW3Z0eS0+Y3AgLSAxXSAhPSAnICcpCisJCXZ0eV9kZWxldGVfYmFja3dhcmRfY2hhcih2dHkpOworfQorCisvKiBUcmFuc3Bvc2UgY2hhcnMgYmVmb3JlIG9yIGF0IHRoZSBwb2ludC4gKi8KK3N0YXRpYyB2b2lkIHZ0eV90cmFuc3Bvc2VfY2hhcnMoc3RydWN0IHZ0eSAqdnR5KQoreworCWNoYXIgYzEsIGMyOworCisJLyogSWYgbGVuZ3RoIGlzIHNob3J0IG9yIHBvaW50IGlzIG5lYXIgYnkgdGhlIGJlZ2lubmluZyBvZiBsaW5lIHRoZW4KKwkgICByZXR1cm4uICovCisJaWYgKHZ0eS0+bGVuZ3RoIDwgMiB8fCB2dHktPmNwIDwgMSkKKwkJcmV0dXJuOworCisJLyogSW4gY2FzZSBvZiBwb2ludCBpcyBsb2NhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUuICovCisJaWYgKHZ0eS0+Y3AgPT0gdnR5LT5sZW5ndGgpIHsKKwkJYzEgPSB2dHktPmJ1Zlt2dHktPmNwIC0gMV07CisJCWMyID0gdnR5LT5idWZbdnR5LT5jcCAtIDJdOworCisJCXZ0eV9iYWNrd2FyZF9jaGFyKHZ0eSk7CisJCXZ0eV9iYWNrd2FyZF9jaGFyKHZ0eSk7CisJCXZ0eV9zZWxmX2luc2VydF9vdmVyd3JpdGUodnR5LCBjMSk7CisJCXZ0eV9zZWxmX2luc2VydF9vdmVyd3JpdGUodnR5LCBjMik7CisJfSBlbHNlIHsKKwkJYzEgPSB2dHktPmJ1Zlt2dHktPmNwXTsKKwkJYzIgPSB2dHktPmJ1Zlt2dHktPmNwIC0gMV07CisKKwkJdnR5X2JhY2t3YXJkX2NoYXIodnR5KTsKKwkJdnR5X3NlbGZfaW5zZXJ0X292ZXJ3cml0ZSh2dHksIGMxKTsKKwkJdnR5X3NlbGZfaW5zZXJ0X292ZXJ3cml0ZSh2dHksIGMyKTsKKwl9Cit9CisKKy8qIERvIGNvbXBsZXRpb24gYXQgdnR5IGludGVyZmFjZS4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9jb21wbGV0ZV9jb21tYW5kKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpbnQgaTsKKwlpbnQgcmV0OworCWNoYXIgKiptYXRjaGVkID0gTlVMTDsKKwl2ZWN0b3IgdmxpbmU7CisKKwlpZiAodnR5LT5ub2RlID09IEFVVEhfTk9ERSB8fCB2dHktPm5vZGUgPT0gQVVUSF9FTkFCTEVfTk9ERSkKKwkJcmV0dXJuOworCisJdmxpbmUgPSBjbWRfbWFrZV9zdHJ2ZWModnR5LT5idWYpOworCWlmICh2bGluZSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBJbiBjYXNlIG9mICdoZWxwIFx0Jy4gKi8KKwlpZiAoaXNzcGFjZSgoaW50KXZ0eS0+YnVmW3Z0eS0+bGVuZ3RoIC0gMV0pKQorCQl2ZWN0b3Jfc2V0KHZsaW5lLCAnXDAnKTsKKworCW1hdGNoZWQgPSBjbWRfY29tcGxldGVfY29tbWFuZCh2bGluZSwgdnR5LCAmcmV0KTsKKworCWNtZF9mcmVlX3N0cnZlYyh2bGluZSk7CisKKwl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCXN3aXRjaCAocmV0KSB7CisJY2FzZSBDTURfRVJSX0FNQklHVU9VUzoKKwkJdnR5X291dCh2dHksICIlJSBBbWJpZ3VvdXMgY29tbWFuZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJdnR5X3Byb21wdCh2dHkpOworCQl2dHlfcmVkcmF3X2xpbmUodnR5KTsKKwkJYnJlYWs7CisJY2FzZSBDTURfRVJSX05PX01BVENIOgorCQkvKiB2dHlfb3V0ICh2dHksICIlJSBUaGVyZSBpcyBubyBtYXRjaGVkIGNvbW1hbmQuJXMiLCBWVFlfTkVXTElORSk7ICovCisJCXZ0eV9wcm9tcHQodnR5KTsKKwkJdnR5X3JlZHJhd19saW5lKHZ0eSk7CisJCWJyZWFrOworCWNhc2UgQ01EX0NPTVBMRVRFX0ZVTExfTUFUQ0g6CisJCXZ0eV9wcm9tcHQodnR5KTsKKwkJdnR5X3JlZHJhd19saW5lKHZ0eSk7CisJCXZ0eV9iYWNrd2FyZF9wdXJlX3dvcmQodnR5KTsKKwkJdnR5X2luc2VydF93b3JkX292ZXJ3cml0ZSh2dHksIG1hdGNoZWRbMF0pOworCQl2dHlfc2VsZl9pbnNlcnQodnR5LCAnICcpOworCQl0YWxsb2NfZnJlZShtYXRjaGVkWzBdKTsKKwkJYnJlYWs7CisJY2FzZSBDTURfQ09NUExFVEVfTUFUQ0g6CisJCXZ0eV9wcm9tcHQodnR5KTsKKwkJdnR5X3JlZHJhd19saW5lKHZ0eSk7CisJCXZ0eV9iYWNrd2FyZF9wdXJlX3dvcmQodnR5KTsKKwkJdnR5X2luc2VydF93b3JkX292ZXJ3cml0ZSh2dHksIG1hdGNoZWRbMF0pOworCQl0YWxsb2NfZnJlZShtYXRjaGVkWzBdKTsKKwkJYnJlYWs7CisJY2FzZSBDTURfQ09NUExFVEVfTElTVF9NQVRDSDoKKwkJZm9yIChpID0gMDsgbWF0Y2hlZFtpXSAhPSBOVUxMOyBpKyspIHsKKwkJCWlmIChpICE9IDAgJiYgKChpICUgNikgPT0gMCkpCisJCQkJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKwkJCXZ0eV9vdXQodnR5LCAiJS0xMHMgIiwgbWF0Y2hlZFtpXSk7CisJCQl0YWxsb2NfZnJlZShtYXRjaGVkW2ldKTsKKwkJfQorCQl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCisJCXZ0eV9wcm9tcHQodnR5KTsKKwkJdnR5X3JlZHJhd19saW5lKHZ0eSk7CisJCWJyZWFrOworCWNhc2UgQ01EX0VSUl9OT1RISU5HX1RPRE86CisJCXZ0eV9wcm9tcHQodnR5KTsKKwkJdnR5X3JlZHJhd19saW5lKHZ0eSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlpZiAobWF0Y2hlZCkKKwkJdmVjdG9yX29ubHlfaW5kZXhfZnJlZShtYXRjaGVkKTsKK30KKworc3RhdGljIHZvaWQKK3Z0eV9kZXNjcmliZV9mb2xkKHN0cnVjdCB2dHkgKnZ0eSwgaW50IGNtZF93aWR0aCwKKwkJICB1bnNpZ25lZCBpbnQgZGVzY193aWR0aCwgc3RydWN0IGRlc2MgKmRlc2MpCit7CisJY2hhciAqYnVmOworCWNvbnN0IGNoYXIgKmNtZCwgKnA7CisJaW50IHBvczsKKworCWNtZCA9IGRlc2MtPmNtZFswXSA9PSAnLicgPyBkZXNjLT5jbWQgKyAxIDogZGVzYy0+Y21kOworCisJaWYgKGRlc2Nfd2lkdGggPD0gMCkgeworCQl2dHlfb3V0KHZ0eSwgIiAgJS0qcyAgJXMlcyIsIGNtZF93aWR0aCwgY21kLCBkZXNjLT5zdHIsCisJCQlWVFlfTkVXTElORSk7CisJCXJldHVybjsKKwl9CisKKwlidWYgPSBfdGFsbG9jX3plcm8odnR5LCBzdHJsZW4oZGVzYy0+c3RyKSArIDEsICJkZXNjcmliZV9mb2xkIik7CisJaWYgKCFidWYpCisJCXJldHVybjsKKworCWZvciAocCA9IGRlc2MtPnN0cjsgc3RybGVuKHApID4gZGVzY193aWR0aDsgcCArPSBwb3MgKyAxKSB7CisJCWZvciAocG9zID0gZGVzY193aWR0aDsgcG9zID4gMDsgcG9zLS0pCisJCQlpZiAoKihwICsgcG9zKSA9PSAnICcpCisJCQkJYnJlYWs7CisKKwkJaWYgKHBvcyA9PSAwKQorCQkJYnJlYWs7CisKKwkJc3RybmNweShidWYsIHAsIHBvcyk7CisJCWJ1Zltwb3NdID0gJ1wwJzsKKwkJdnR5X291dCh2dHksICIgICUtKnMgICVzJXMiLCBjbWRfd2lkdGgsIGNtZCwgYnVmLCBWVFlfTkVXTElORSk7CisKKwkJY21kID0gIiI7CisJfQorCisJdnR5X291dCh2dHksICIgICUtKnMgICVzJXMiLCBjbWRfd2lkdGgsIGNtZCwgcCwgVlRZX05FV0xJTkUpOworCisJdGFsbG9jX2ZyZWUoYnVmKTsKK30KKworLyogRGVzY3JpYmUgbWF0Y2hlZCBjb21tYW5kIGZ1bmN0aW9uLiAqLworc3RhdGljIHZvaWQgdnR5X2Rlc2NyaWJlX2NvbW1hbmQoc3RydWN0IHZ0eSAqdnR5KQoreworCWludCByZXQ7CisJdmVjdG9yIHZsaW5lOworCXZlY3RvciBkZXNjcmliZTsKKwl1bnNpZ25lZCBpbnQgaSwgd2lkdGgsIGRlc2Nfd2lkdGg7CisJc3RydWN0IGRlc2MgKmRlc2MsICpkZXNjX2NyID0gTlVMTDsKKworCXZsaW5lID0gY21kX21ha2Vfc3RydmVjKHZ0eS0+YnVmKTsKKworCS8qIEluIGNhc2Ugb2YgJz4gPycuICovCisJaWYgKHZsaW5lID09IE5VTEwpIHsKKwkJdmxpbmUgPSB2ZWN0b3JfaW5pdCgxKTsKKwkJdmVjdG9yX3NldCh2bGluZSwgJ1wwJyk7CisJfSBlbHNlIGlmIChpc3NwYWNlKChpbnQpdnR5LT5idWZbdnR5LT5sZW5ndGggLSAxXSkpCisJCXZlY3Rvcl9zZXQodmxpbmUsICdcMCcpOworCisJZGVzY3JpYmUgPSBjbWRfZGVzY3JpYmVfY29tbWFuZCh2bGluZSwgdnR5LCAmcmV0KTsKKworCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisKKwkvKiBBbWJpZ3VvdXMgZXJyb3IuICovCisJc3dpdGNoIChyZXQpIHsKKwljYXNlIENNRF9FUlJfQU1CSUdVT1VTOgorCQljbWRfZnJlZV9zdHJ2ZWModmxpbmUpOworCQl2dHlfb3V0KHZ0eSwgIiUlIEFtYmlndW91cyBjb21tYW5kLiVzIiwgVlRZX05FV0xJTkUpOworCQl2dHlfcHJvbXB0KHZ0eSk7CisJCXZ0eV9yZWRyYXdfbGluZSh2dHkpOworCQlyZXR1cm47CisJCWJyZWFrOworCWNhc2UgQ01EX0VSUl9OT19NQVRDSDoKKwkJY21kX2ZyZWVfc3RydmVjKHZsaW5lKTsKKwkJdnR5X291dCh2dHksICIlJSBUaGVyZSBpcyBubyBtYXRjaGVkIGNvbW1hbmQuJXMiLCBWVFlfTkVXTElORSk7CisJCXZ0eV9wcm9tcHQodnR5KTsKKwkJdnR5X3JlZHJhd19saW5lKHZ0eSk7CisJCXJldHVybjsKKwkJYnJlYWs7CisJfQorCisJLyogR2V0IHdpZHRoIG9mIGNvbW1hbmQgc3RyaW5nLiAqLworCXdpZHRoID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShkZXNjcmliZSk7IGkrKykKKwkJaWYgKChkZXNjID0gdmVjdG9yX3Nsb3QoZGVzY3JpYmUsIGkpKSAhPSBOVUxMKSB7CisJCQl1bnNpZ25lZCBpbnQgbGVuOworCisJCQlpZiAoZGVzYy0+Y21kWzBdID09ICdcMCcpCisJCQkJY29udGludWU7CisKKwkJCWxlbiA9IHN0cmxlbihkZXNjLT5jbWQpOworCQkJaWYgKGRlc2MtPmNtZFswXSA9PSAnLicpCisJCQkJbGVuLS07CisKKwkJCWlmICh3aWR0aCA8IGxlbikKKwkJCQl3aWR0aCA9IGxlbjsKKwkJfQorCisJLyogR2V0IHdpZHRoIG9mIGRlc2NyaXB0aW9uIHN0cmluZy4gKi8KKwlkZXNjX3dpZHRoID0gdnR5LT53aWR0aCAtICh3aWR0aCArIDYpOworCisJLyogUHJpbnQgb3V0IGRlc2NyaXB0aW9uLiAqLworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKGRlc2NyaWJlKTsgaSsrKQorCQlpZiAoKGRlc2MgPSB2ZWN0b3Jfc2xvdChkZXNjcmliZSwgaSkpICE9IE5VTEwpIHsKKwkJCWlmIChkZXNjLT5jbWRbMF0gPT0gJ1wwJykKKwkJCQljb250aW51ZTsKKworCQkJaWYgKHN0cmNtcChkZXNjLT5jbWQsICI8Y3I+IikgPT0gMCkgeworCQkJCWRlc2NfY3IgPSBkZXNjOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoIWRlc2MtPnN0cikKKwkJCQl2dHlfb3V0KHZ0eSwgIiAgJS1zJXMiLAorCQkJCQlkZXNjLT5jbWRbMF0gPT0KKwkJCQkJJy4nID8gZGVzYy0+Y21kICsgMSA6IGRlc2MtPmNtZCwKKwkJCQkJVlRZX05FV0xJTkUpOworCQkJZWxzZSBpZiAoZGVzY193aWR0aCA+PSBzdHJsZW4oZGVzYy0+c3RyKSkKKwkJCQl2dHlfb3V0KHZ0eSwgIiAgJS0qcyAgJXMlcyIsIHdpZHRoLAorCQkJCQlkZXNjLT5jbWRbMF0gPT0KKwkJCQkJJy4nID8gZGVzYy0+Y21kICsgMSA6IGRlc2MtPmNtZCwKKwkJCQkJZGVzYy0+c3RyLCBWVFlfTkVXTElORSk7CisJCQllbHNlCisJCQkJdnR5X2Rlc2NyaWJlX2ZvbGQodnR5LCB3aWR0aCwgZGVzY193aWR0aCwgZGVzYyk7CisKKyNpZiAwCisJCQl2dHlfb3V0KHZ0eSwgIiAgJS0qcyAlcyVzIiwgd2lkdGgKKwkJCQlkZXNjLT5jbWRbMF0gPT0gJy4nID8gZGVzYy0+Y21kICsgMSA6IGRlc2MtPmNtZCwKKwkJCQlkZXNjLT5zdHIgPyBkZXNjLT5zdHIgOiAiIiwgVlRZX05FV0xJTkUpOworI2VuZGlmCQkJCS8qIDAgKi8KKwkJfQorCisJaWYgKChkZXNjID0gZGVzY19jcikpIHsKKwkJaWYgKCFkZXNjLT5zdHIpCisJCQl2dHlfb3V0KHZ0eSwgIiAgJS1zJXMiLAorCQkJCWRlc2MtPmNtZFswXSA9PSAnLicgPyBkZXNjLT5jbWQgKyAxIDogZGVzYy0+Y21kLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJZWxzZSBpZiAoZGVzY193aWR0aCA+PSBzdHJsZW4oZGVzYy0+c3RyKSkKKwkJCXZ0eV9vdXQodnR5LCAiICAlLSpzICAlcyVzIiwgd2lkdGgsCisJCQkJZGVzYy0+Y21kWzBdID09ICcuJyA/IGRlc2MtPmNtZCArIDEgOiBkZXNjLT5jbWQsCisJCQkJZGVzYy0+c3RyLCBWVFlfTkVXTElORSk7CisJCWVsc2UKKwkJCXZ0eV9kZXNjcmliZV9mb2xkKHZ0eSwgd2lkdGgsIGRlc2Nfd2lkdGgsIGRlc2MpOworCX0KKworCWNtZF9mcmVlX3N0cnZlYyh2bGluZSk7CisJdmVjdG9yX2ZyZWUoZGVzY3JpYmUpOworCisJdnR5X3Byb21wdCh2dHkpOworCXZ0eV9yZWRyYXdfbGluZSh2dHkpOworfQorCisvKiBeQyBzdG9wIGN1cnJlbnQgaW5wdXQgYW5kIGRvIG5vdCBhZGQgY29tbWFuZCBsaW5lIHRvIHRoZSBoaXN0b3J5LiAqLworc3RhdGljIHZvaWQgdnR5X3N0b3BfaW5wdXQoc3RydWN0IHZ0eSAqdnR5KQoreworCXZ0eS0+Y3AgPSB2dHktPmxlbmd0aCA9IDA7CisJdnR5X2NsZWFyX2J1Zih2dHkpOworCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisKKwlzd2l0Y2ggKHZ0eS0+bm9kZSkgeworCWNhc2UgVklFV19OT0RFOgorCWNhc2UgRU5BQkxFX05PREU6CisJCS8qIE5vdGhpbmcgdG8gZG8uICovCisJCWJyZWFrOworCWNhc2UgQ09ORklHX05PREU6CisJY2FzZSBWVFlfTk9ERToKKwkJdnR5X2NvbmZpZ191bmxvY2sodnR5KTsKKwkJdnR5LT5ub2RlID0gRU5BQkxFX05PREU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIFVua25vd24gbm9kZSwgd2UgaGF2ZSB0byBpZ25vcmUgaXQuICovCisJCWJyZWFrOworCX0KKwl2dHlfcHJvbXB0KHZ0eSk7CisKKwkvKiBTZXQgaGlzdG9yeSBwb2ludGVyIHRvIHRoZSBsYXRlc3Qgb25lLiAqLworCXZ0eS0+aHAgPSB2dHktPmhpbmRleDsKK30KKworI2RlZmluZSBDT05UUk9MKFgpICAoKFgpIC0gJ0AnKQorI2RlZmluZSBWVFlfTk9STUFMICAgICAwCisjZGVmaW5lIFZUWV9QUkVfRVNDQVBFIDEKKyNkZWZpbmUgVlRZX0VTQ0FQRSAgICAgMgorCisvKiBFc2NhcGUgY2hhcmFjdGVyIGNvbW1hbmQgbWFwLiAqLworc3RhdGljIHZvaWQgdnR5X2VzY2FwZV9tYXAodW5zaWduZWQgY2hhciBjLCBzdHJ1Y3QgdnR5ICp2dHkpCit7CisJc3dpdGNoIChjKSB7CisJY2FzZSAoJ0EnKToKKwkJdnR5X3ByZXZpb3VzX2xpbmUodnR5KTsKKwkJYnJlYWs7CisJY2FzZSAoJ0InKToKKwkJdnR5X25leHRfbGluZSh2dHkpOworCQlicmVhazsKKwljYXNlICgnQycpOgorCQl2dHlfZm9yd2FyZF9jaGFyKHZ0eSk7CisJCWJyZWFrOworCWNhc2UgKCdEJyk6CisJCXZ0eV9iYWNrd2FyZF9jaGFyKHZ0eSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCS8qIEdvIGJhY2sgdG8gbm9ybWFsIG1vZGUuICovCisJdnR5LT5lc2NhcGUgPSBWVFlfTk9STUFMOworfQorCisvKiBRdWl0IHByaW50IG91dCB0byB0aGUgYnVmZmVyLiAqLworc3RhdGljIHZvaWQgdnR5X2J1ZmZlcl9yZXNldChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJYnVmZmVyX3Jlc2V0KHZ0eS0+b2J1Zik7CisJdnR5X3Byb21wdCh2dHkpOworCXZ0eV9yZWRyYXdfbGluZSh2dHkpOworfQorCisvKiBSZWFkIGRhdGEgdmlhIHZ0eSBzb2NrZXQuICovCitpbnQgdnR5X3JlYWQoc3RydWN0IHZ0eSAqdnR5KQoreworCWludCBpOworCWludCBuYnl0ZXM7CisJdW5zaWduZWQgY2hhciBidWZbVlRZX1JFQURfQlVGU0laXTsKKworCWludCB2dHlfc29jayA9IHZ0eS0+ZmQ7CisKKwkvKiBSZWFkIHJhdyBkYXRhIGZyb20gc29ja2V0ICovCisJaWYgKChuYnl0ZXMgPSByZWFkKHZ0eS0+ZmQsIGJ1ZiwgVlRZX1JFQURfQlVGU0laKSkgPD0gMCkgeworCQlpZiAobmJ5dGVzIDwgMCkgeworCQkJaWYgKEVSUk5PX0lPX1JFVFJZKGVycm5vKSkgeworCQkJCXZ0eV9ldmVudChWVFlfUkVBRCwgdnR5X3NvY2ssIHZ0eSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkJYnVmZmVyX3Jlc2V0KHZ0eS0+b2J1Zik7CisJCXZ0eS0+c3RhdHVzID0gVlRZX0NMT1NFOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBuYnl0ZXM7IGkrKykgeworCQlpZiAoYnVmW2ldID09IElBQykgeworCQkJaWYgKCF2dHktPmlhYykgeworCQkJCXZ0eS0+aWFjID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSB7CisJCQkJdnR5LT5pYWMgPSAwOworCQkJfQorCQl9CisKKwkJaWYgKHZ0eS0+aWFjX3NiX2luX3Byb2dyZXNzICYmICF2dHktPmlhYykgeworCQkJaWYgKHZ0eS0+c2JfbGVuIDwgc2l6ZW9mKHZ0eS0+c2JfYnVmKSkKKwkJCQl2dHktPnNiX2J1Zlt2dHktPnNiX2xlbl0gPSBidWZbaV07CisJCQl2dHktPnNiX2xlbisrOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAodnR5LT5pYWMpIHsKKwkJCS8qIEluIGNhc2Ugb2YgdGVsbmV0IGNvbW1hbmQgKi8KKwkJCWludCByZXQgPSAwOworCQkJcmV0ID0gdnR5X3RlbG5ldF9vcHRpb24odnR5LCBidWYgKyBpLCBuYnl0ZXMgLSBpKTsKKwkJCXZ0eS0+aWFjID0gMDsKKwkJCWkgKz0gcmV0OworCQkJY29udGludWU7CisJCX0KKworCQlpZiAodnR5LT5zdGF0dXMgPT0gVlRZX01PUkUpIHsKKwkJCXN3aXRjaCAoYnVmW2ldKSB7CisJCQljYXNlIENPTlRST0woJ0MnKToKKwkJCWNhc2UgJ3EnOgorCQkJY2FzZSAnUSc6CisJCQkJdnR5X2J1ZmZlcl9yZXNldCh2dHkpOworCQkJCWJyZWFrOworI2lmIDAJCQkJLyogTW9yZSBsaW5lIGRvZXMgbm90IHdvcmsgZm9yICJzaG93IGlwIGJncCIuICAqLworCQkJY2FzZSAnXG4nOgorCQkJY2FzZSAnXHInOgorCQkJCXZ0eS0+c3RhdHVzID0gVlRZX01PUkVMSU5FOworCQkJCWJyZWFrOworI2VuZGlmCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQkvKiBFc2NhcGUgY2hhcmFjdGVyLiAqLworCQlpZiAodnR5LT5lc2NhcGUgPT0gVlRZX0VTQ0FQRSkgeworCQkJdnR5X2VzY2FwZV9tYXAoYnVmW2ldLCB2dHkpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBQcmUtZXNjYXBlIHN0YXR1cy4gKi8KKwkJaWYgKHZ0eS0+ZXNjYXBlID09IFZUWV9QUkVfRVNDQVBFKSB7CisJCQlzd2l0Y2ggKGJ1ZltpXSkgeworCQkJY2FzZSAnWyc6CisJCQkJdnR5LT5lc2NhcGUgPSBWVFlfRVNDQVBFOworCQkJCWJyZWFrOworCQkJY2FzZSAnYic6CisJCQkJdnR5X2JhY2t3YXJkX3dvcmQodnR5KTsKKwkJCQl2dHktPmVzY2FwZSA9IFZUWV9OT1JNQUw7CisJCQkJYnJlYWs7CisJCQljYXNlICdmJzoKKwkJCQl2dHlfZm9yd2FyZF93b3JkKHZ0eSk7CisJCQkJdnR5LT5lc2NhcGUgPSBWVFlfTk9STUFMOworCQkJCWJyZWFrOworCQkJY2FzZSAnZCc6CisJCQkJdnR5X2ZvcndhcmRfa2lsbF93b3JkKHZ0eSk7CisJCQkJdnR5LT5lc2NhcGUgPSBWVFlfTk9STUFMOworCQkJCWJyZWFrOworCQkJY2FzZSBDT05UUk9MKCdIJyk6CisJCQljYXNlIDB4N2Y6CisJCQkJdnR5X2JhY2t3YXJkX2tpbGxfd29yZCh2dHkpOworCQkJCXZ0eS0+ZXNjYXBlID0gVlRZX05PUk1BTDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJdnR5LT5lc2NhcGUgPSBWVFlfTk9STUFMOworCQkJCWJyZWFrOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQlzd2l0Y2ggKGJ1ZltpXSkgeworCQljYXNlIENPTlRST0woJ0EnKToKKwkJCXZ0eV9iZWdpbm5pbmdfb2ZfbGluZSh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnQicpOgorCQkJdnR5X2JhY2t3YXJkX2NoYXIodnR5KTsKKwkJCWJyZWFrOworCQljYXNlIENPTlRST0woJ0MnKToKKwkJCXZ0eV9zdG9wX2lucHV0KHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MKCdEJyk6CisJCQl2dHlfZGVsZXRlX2NoYXIodnR5KTsKKwkJCWJyZWFrOworCQljYXNlIENPTlRST0woJ0UnKToKKwkJCXZ0eV9lbmRfb2ZfbGluZSh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnRicpOgorCQkJdnR5X2ZvcndhcmRfY2hhcih2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnSCcpOgorCQljYXNlIDB4N2Y6CisJCQl2dHlfZGVsZXRlX2JhY2t3YXJkX2NoYXIodnR5KTsKKwkJCWJyZWFrOworCQljYXNlIENPTlRST0woJ0snKToKKwkJCXZ0eV9raWxsX2xpbmUodnR5KTsKKwkJCWJyZWFrOworCQljYXNlIENPTlRST0woJ04nKToKKwkJCXZ0eV9uZXh0X2xpbmUodnR5KTsKKwkJCWJyZWFrOworCQljYXNlIENPTlRST0woJ1AnKToKKwkJCXZ0eV9wcmV2aW91c19saW5lKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MKCdUJyk6CisJCQl2dHlfdHJhbnNwb3NlX2NoYXJzKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MKCdVJyk6CisJCQl2dHlfa2lsbF9saW5lX2Zyb21fYmVnaW5uaW5nKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MKCdXJyk6CisJCQl2dHlfYmFja3dhcmRfa2lsbF93b3JkKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MKCdaJyk6CisJCQl2dHlfZW5kX2NvbmZpZyh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgJ1xuJzoKKwkJY2FzZSAnXHInOgorCQkJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKwkJCXZ0eV9leGVjdXRlKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSAnXHQnOgorCQkJdnR5X2NvbXBsZXRlX2NvbW1hbmQodnR5KTsKKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJCWlmICh2dHktPm5vZGUgPT0gQVVUSF9OT0RFCisJCQkgICAgfHwgdnR5LT5ub2RlID09IEFVVEhfRU5BQkxFX05PREUpCisJCQkJdnR5X3NlbGZfaW5zZXJ0KHZ0eSwgYnVmW2ldKTsKKwkJCWVsc2UKKwkJCQl2dHlfZGVzY3JpYmVfY29tbWFuZCh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgJ1wwMzMnOgorCQkJaWYgKGkgKyAxIDwgbmJ5dGVzICYmIGJ1ZltpICsgMV0gPT0gJ1snKSB7CisJCQkJdnR5LT5lc2NhcGUgPSBWVFlfRVNDQVBFOworCQkJCWkrKzsKKwkJCX0gZWxzZQorCQkJCXZ0eS0+ZXNjYXBlID0gVlRZX1BSRV9FU0NBUEU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlmIChidWZbaV0gPiAzMSAmJiBidWZbaV0gPCAxMjcpCisJCQkJdnR5X3NlbGZfaW5zZXJ0KHZ0eSwgYnVmW2ldKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogQ2hlY2sgc3RhdHVzLiAqLworCWlmICh2dHktPnN0YXR1cyA9PSBWVFlfQ0xPU0UpCisJCXZ0eV9jbG9zZSh2dHkpOworCWVsc2UgeworCQl2dHlfZXZlbnQoVlRZX1dSSVRFLCB2dHlfc29jaywgdnR5KTsKKwkJdnR5X2V2ZW50KFZUWV9SRUFELCB2dHlfc29jaywgdnR5KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFJlYWQgdXAgY29uZmlndXJhdGlvbiBmaWxlICovCitzdGF0aWMgaW50Cit2dHlfcmVhZF9maWxlKEZJTEUgKmNvbmZwKQoreworCWludCByZXQ7CisJc3RydWN0IHZ0eSAqdnR5OworCisJdnR5ID0gdnR5X25ldygpOworCXZ0eS0+ZmQgPSAwOworCXZ0eS0+dHlwZSA9IFZUWV9GSUxFOworCXZ0eS0+bm9kZSA9IENPTkZJR19OT0RFOworCisJcmV0ID0gY29uZmlnX2Zyb21fZmlsZSh2dHksIGNvbmZwKTsKKworCWlmIChyZXQgIT0gQ01EX1NVQ0NFU1MpIHsKKwkJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSBDTURfRVJSX0FNQklHVU9VUzoKKwkJCWZwcmludGYoc3RkZXJyLCAiQW1iaWd1b3VzIGNvbW1hbmQuXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIENNRF9FUlJfTk9fTUFUQ0g6CisJCQlmcHJpbnRmKHN0ZGVyciwgIlRoZXJlIGlzIG5vIHN1Y2ggY29tbWFuZC5cbiIpOworCQkJYnJlYWs7CisJCX0KKwkJZnByaW50ZihzdGRlcnIsICJFcnJvciBvY2N1cnJlZCBkdXJpbmcgcmVhZGluZyBiZWxvdyAiCisJCQkibGluZTpcbiVzXG4iLCB2dHktPmJ1Zik7CisJCXZ0eV9jbG9zZSh2dHkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl2dHlfY2xvc2UodnR5KTsKKwlyZXR1cm4gMDsKK30KKworLyogQ3JlYXRlIG5ldyB2dHkgc3RydWN0dXJlLiAqLworc3RydWN0IHZ0eSAqCit2dHlfY3JlYXRlIChpbnQgdnR5X3NvY2ssIHZvaWQgKnByaXYpCit7CisgIHN0cnVjdCB2dHkgKnZ0eTsKKworCXN0cnVjdCB0ZXJtaW9zIHQ7CisKKwl0Y2dldGF0dHIodnR5X3NvY2ssICZ0KTsKKwljZm1ha2VyYXcoJnQpOworCXRjc2V0YXR0cih2dHlfc29jaywgVENTQU5PVywgJnQpOworCisgIC8qIEFsbG9jYXRlIG5ldyB2dHkgc3RydWN0dXJlIGFuZCBzZXQgdXAgZGVmYXVsdCB2YWx1ZXMuICovCisgIHZ0eSA9IHZ0eV9uZXcgKCk7CisgIHZ0eS0+ZmQgPSB2dHlfc29jazsKKyAgdnR5LT5wcml2ID0gcHJpdjsKKyAgdnR5LT50eXBlID0gVlRZX1RFUk07CisgIGlmIChub19wYXNzd29yZF9jaGVjaykKKyAgICB7CisgICAgICBpZiAoaG9zdC5hZHZhbmNlZCkKKwl2dHktPm5vZGUgPSBFTkFCTEVfTk9ERTsKKyAgICAgIGVsc2UKKwl2dHktPm5vZGUgPSBWSUVXX05PREU7CisgICAgfQorICBlbHNlCisgICAgdnR5LT5ub2RlID0gQVVUSF9OT0RFOworICB2dHktPmZhaWwgPSAwOworICB2dHktPmNwID0gMDsKKyAgdnR5X2NsZWFyX2J1ZiAodnR5KTsKKyAgdnR5LT5sZW5ndGggPSAwOworICBtZW1zZXQgKHZ0eS0+aGlzdCwgMCwgc2l6ZW9mICh2dHktPmhpc3QpKTsKKyAgdnR5LT5ocCA9IDA7CisgIHZ0eS0+aGluZGV4ID0gMDsKKyAgdmVjdG9yX3NldF9pbmRleCAodnR5dmVjLCB2dHlfc29jaywgdnR5KTsKKyAgdnR5LT5zdGF0dXMgPSBWVFlfTk9STUFMOworICBpZiAoaG9zdC5saW5lcyA+PSAwKQorICAgIHZ0eS0+bGluZXMgPSBob3N0LmxpbmVzOworICBlbHNlCisgICAgdnR5LT5saW5lcyA9IC0xOworCisgIGlmICghIG5vX3Bhc3N3b3JkX2NoZWNrKQorICAgIHsKKyAgICAgIC8qIFZ0eSBpcyBub3QgYXZhaWxhYmxlIGlmIHBhc3N3b3JkIGlzbid0IHNldC4gKi8KKyAgICAgIGlmIChob3N0LnBhc3N3b3JkID09IE5VTEwgJiYgaG9zdC5wYXNzd29yZF9lbmNyeXB0ID09IE5VTEwpCisJeworCSAgdnR5X291dCAodnR5LCAiVnR5IHBhc3N3b3JkIGlzIG5vdCBzZXQuJXMiLCBWVFlfTkVXTElORSk7CisJICB2dHktPnN0YXR1cyA9IFZUWV9DTE9TRTsKKwkgIHZ0eV9jbG9zZSAodnR5KTsKKwkgIHJldHVybiBOVUxMOworCX0KKyAgICB9CisKKyAgLyogU2F5IGhlbGxvIHRvIHRoZSB3b3JsZC4gKi8KKyAgdnR5X2hlbGxvICh2dHkpOworICBpZiAoISBub19wYXNzd29yZF9jaGVjaykKKyAgICB2dHlfb3V0ICh2dHksICIlc1VzZXIgQWNjZXNzIFZlcmlmaWNhdGlvbiVzJXMiLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FKTsKKworICAvKiBTZXR0aW5nIHVwIHRlcm1pbmFsLiAqLworICB2dHlfd2lsbF9lY2hvICh2dHkpOworICB2dHlfd2lsbF9zdXBwcmVzc19nb19haGVhZCAodnR5KTsKKworICB2dHlfZG9udF9saW5lbW9kZSAodnR5KTsKKyAgdnR5X2RvX3dpbmRvd19zaXplICh2dHkpOworICAvKiB2dHlfZG9udF9sZmxvd19haGVhZCAodnR5KTsgKi8KKworICB2dHlfcHJvbXB0ICh2dHkpOworCisgIC8qIEFkZCByZWFkL3dyaXRlIHRocmVhZC4gKi8KKyAgdnR5X2V2ZW50IChWVFlfV1JJVEUsIHZ0eV9zb2NrLCB2dHkpOworICB2dHlfZXZlbnQgKFZUWV9SRUFELCB2dHlfc29jaywgdnR5KTsKKworICByZXR1cm4gdnR5OworfQorCitERUZVTihjb25maWdfd2hvLCBjb25maWdfd2hvX2NtZCwgIndobyIsICJEaXNwbGF5IHdobyBpcyBvbiB2dHlcbiIpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IHZ0eSAqdjsKKworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKHZ0eXZlYyk7IGkrKykKKwkJaWYgKCh2ID0gdmVjdG9yX3Nsb3QodnR5dmVjLCBpKSkgIT0gTlVMTCkKKwkJCXZ0eV9vdXQodnR5LCAiJXN2dHlbJWRdICVzIiwKKwkJCQl2LT5jb25maWcgPyAiKiIgOiAiICIsIGksIFZUWV9ORVdMSU5FKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIE1vdmUgdG8gdnR5IGNvbmZpZ3VyYXRpb24gbW9kZS4gKi8KK0RFRlVOKGxpbmVfdnR5LAorICAgICAgbGluZV92dHlfY21kLAorICAgICAgImxpbmUgdnR5IiwgIkNvbmZpZ3VyZSBhIHRlcm1pbmFsIGxpbmVcbiIgIlZpcnR1YWwgdGVybWluYWxcbiIpCit7CisJdnR5LT5ub2RlID0gVlRZX05PREU7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiB2dHkgbG9naW4uICovCitERUZVTih2dHlfbG9naW4sIHZ0eV9sb2dpbl9jbWQsICJsb2dpbiIsICJFbmFibGUgcGFzc3dvcmQgY2hlY2tpbmdcbiIpCit7CisJbm9fcGFzc3dvcmRfY2hlY2sgPSAwOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obm9fdnR5X2xvZ2luLAorICAgICAgbm9fdnR5X2xvZ2luX2NtZCwgIm5vIGxvZ2luIiwgTk9fU1RSICJFbmFibGUgcGFzc3dvcmQgY2hlY2tpbmdcbiIpCit7CisJbm9fcGFzc3dvcmRfY2hlY2sgPSAxOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oc2VydmljZV9hZHZhbmNlZF92dHksCisgICAgICBzZXJ2aWNlX2FkdmFuY2VkX3Z0eV9jbWQsCisgICAgICAic2VydmljZSBhZHZhbmNlZC12dHkiLAorICAgICAgIlNldCB1cCBtaXNjZWxsYW5lb3VzIHNlcnZpY2VcbiIgIkVuYWJsZSBhZHZhbmNlZCBtb2RlIHZ0eSBpbnRlcmZhY2VcbiIpCit7CisJaG9zdC5hZHZhbmNlZCA9IDE7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihub19zZXJ2aWNlX2FkdmFuY2VkX3Z0eSwKKyAgICAgIG5vX3NlcnZpY2VfYWR2YW5jZWRfdnR5X2NtZCwKKyAgICAgICJubyBzZXJ2aWNlIGFkdmFuY2VkLXZ0eSIsCisgICAgICBOT19TVFIKKyAgICAgICJTZXQgdXAgbWlzY2VsbGFuZW91cyBzZXJ2aWNlXG4iICJFbmFibGUgYWR2YW5jZWQgbW9kZSB2dHkgaW50ZXJmYWNlXG4iKQoreworCWhvc3QuYWR2YW5jZWQgPSAwOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4odGVybWluYWxfbW9uaXRvciwKKyAgICAgIHRlcm1pbmFsX21vbml0b3JfY21kLAorICAgICAgInRlcm1pbmFsIG1vbml0b3IiLAorICAgICAgIlNldCB0ZXJtaW5hbCBsaW5lIHBhcmFtZXRlcnNcbiIKKyAgICAgICJDb3B5IGRlYnVnIG91dHB1dCB0byB0aGUgY3VycmVudCB0ZXJtaW5hbCBsaW5lXG4iKQoreworCXZ0eS0+bW9uaXRvciA9IDE7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTih0ZXJtaW5hbF9ub19tb25pdG9yLAorICAgICAgdGVybWluYWxfbm9fbW9uaXRvcl9jbWQsCisgICAgICAidGVybWluYWwgbm8gbW9uaXRvciIsCisgICAgICAiU2V0IHRlcm1pbmFsIGxpbmUgcGFyYW1ldGVyc1xuIgorICAgICAgTk9fU1RSICJDb3B5IGRlYnVnIG91dHB1dCB0byB0aGUgY3VycmVudCB0ZXJtaW5hbCBsaW5lXG4iKQoreworCXZ0eS0+bW9uaXRvciA9IDA7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihzaG93X2hpc3RvcnksCisgICAgICBzaG93X2hpc3RvcnlfY21kLAorICAgICAgInNob3cgaGlzdG9yeSIsIFNIT1dfU1RSICJEaXNwbGF5IHRoZSBzZXNzaW9uIGNvbW1hbmQgaGlzdG9yeVxuIikKK3sKKwlpbnQgaW5kZXg7CisKKwlmb3IgKGluZGV4ID0gdnR5LT5oaW5kZXggKyAxOyBpbmRleCAhPSB2dHktPmhpbmRleDspIHsKKwkJaWYgKGluZGV4ID09IFZUWV9NQVhISVNUKSB7CisJCQlpbmRleCA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICh2dHktPmhpc3RbaW5kZXhdICE9IE5VTEwpCisJCQl2dHlfb3V0KHZ0eSwgIiAgJXMlcyIsIHZ0eS0+aGlzdFtpbmRleF0sIFZUWV9ORVdMSU5FKTsKKworCQlpbmRleCsrOworCX0KKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogRGlzcGxheSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uICovCitzdGF0aWMgaW50IHZ0eV9jb25maWdfd3JpdGUoc3RydWN0IHZ0eSAqdnR5KQoreworCXZ0eV9vdXQodnR5LCAibGluZSB2dHklcyIsIFZUWV9ORVdMSU5FKTsKKworCS8qIGxvZ2luICovCisJaWYgKG5vX3Bhc3N3b3JkX2NoZWNrKQorCQl2dHlfb3V0KHZ0eSwgIiBubyBsb2dpbiVzIiwgVlRZX05FV0xJTkUpOworCisJdnR5X291dCh2dHksICIhJXMiLCBWVFlfTkVXTElORSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0cnVjdCBjbWRfbm9kZSB2dHlfbm9kZSA9IHsKKwlWVFlfTk9ERSwKKwkiJXMoY29uZmlnLWxpbmUpIyAiLAorCTEsCit9OworCisvKiBSZXNldCBhbGwgVlRZIHN0YXR1cy4gKi8KK3ZvaWQgdnR5X3Jlc2V0KCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgdnR5ICp2dHk7CisJc3RydWN0IHRocmVhZCAqdnR5X3NlcnZfdGhyZWFkOworCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUodnR5dmVjKTsgaSsrKQorCQlpZiAoKHZ0eSA9IHZlY3Rvcl9zbG90KHZ0eXZlYywgaSkpICE9IE5VTEwpIHsKKwkJCWJ1ZmZlcl9yZXNldCh2dHktPm9idWYpOworCQkJdnR5LT5zdGF0dXMgPSBWVFlfQ0xPU0U7CisJCQl2dHlfY2xvc2UodnR5KTsKKwkJfQorCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoVnZ0eV9zZXJ2X3RocmVhZCk7IGkrKykKKwkJaWYgKCh2dHlfc2Vydl90aHJlYWQgPQorCQkgICAgIHZlY3Rvcl9zbG90KFZ2dHlfc2Vydl90aHJlYWQsIGkpKSAhPSBOVUxMKSB7CisJCQkvL3RocmVhZF9jYW5jZWwgKHZ0eV9zZXJ2X3RocmVhZCk7CisJCQl2ZWN0b3Jfc2xvdChWdnR5X3NlcnZfdGhyZWFkLCBpKSA9IE5VTEw7CisJCQljbG9zZShpKTsKKwkJfQorfQorCitzdGF0aWMgdm9pZCB2dHlfc2F2ZV9jd2Qodm9pZCkKK3sKKwljaGFyIGN3ZFtNQVhQQVRITEVOXTsKKwljaGFyICpjIDsKKworCWMgPSBnZXRjd2QoY3dkLCBNQVhQQVRITEVOKTsKKworCWlmICghYykgeworCQlpZiAoY2hkaXIoU1lTQ09ORkRJUikgIT0gMCkKKwkJICAgIHBlcnJvcigiY2hkaXIgZmFpbGVkIik7CisJCWlmIChnZXRjd2QoY3dkLCBNQVhQQVRITEVOKSA9PSBOVUxMKQorCQkgICAgcGVycm9yKCJnZXRjd2QgZmFpbGVkIik7CisJfQorCisJdnR5X2N3ZCA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV9jdHgsIHN0cmxlbihjd2QpICsgMSwgInNhdmVfY3dkIik7CisJc3RyY3B5KHZ0eV9jd2QsIGN3ZCk7Cit9CisKK2NoYXIgKnZ0eV9nZXRfY3dkKCkKK3sKKwlyZXR1cm4gdnR5X2N3ZDsKK30KKworaW50IHZ0eV9zaGVsbF9zZXJ2KHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlyZXR1cm4gdnR5LT50eXBlID09IFZUWV9TSEVMTF9TRVJWID8gMSA6IDA7Cit9CisKK3ZvaWQgdnR5X2luaXRfdnR5c2goKQoreworCXZ0eXZlYyA9IHZlY3Rvcl9pbml0KFZFQ1RPUl9NSU5fU0laRSk7Cit9CisKK2V4dGVybiB2b2lkICp0YWxsX2JzY19jdHg7CisvKiBJbnN0YWxsIHZ0eSdzIG93biBjb21tYW5kcyBsaWtlIGB3aG8nIGNvbW1hbmQuICovCit2b2lkIHZ0eV9pbml0KCkKK3sKKwl0YWxsX3Z0eV9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QoTlVMTCwgMCwgInZ0eSIpOworCXRhbGxfdnR5X3ZlY19jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF92dHlfY3R4LCAwLCAidnR5X3ZlY3RvciIpOworCXRhbGxfdnR5X2NtZF9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF92dHlfY3R4LCAwLCAidnR5X2NvbW1hbmQiKTsKKworCS8qIEZvciBmdXJ0aGVyIGNvbmZpZ3VyYXRpb24gcmVhZCwgcHJlc2VydmUgY3VycmVudCBkaXJlY3RvcnkuICovCisJdnR5X3NhdmVfY3dkKCk7CisKKwl2dHl2ZWMgPSB2ZWN0b3JfaW5pdChWRUNUT1JfTUlOX1NJWkUpOworCisJLyogSW5zdGFsbCBiZ3AgdG9wIG5vZGUuICovCisJaW5zdGFsbF9ub2RlKCZ2dHlfbm9kZSwgdnR5X2NvbmZpZ193cml0ZSk7CisKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmY29uZmlnX3dob19jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X2hpc3RvcnlfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoRU5BQkxFX05PREUsICZjb25maWdfd2hvX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmbGluZV92dHlfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZzZXJ2aWNlX2FkdmFuY2VkX3Z0eV9jbWQpOworCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJm5vX3NlcnZpY2VfYWR2YW5jZWRfdnR5X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmc2hvd19oaXN0b3J5X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCAmdGVybWluYWxfbW9uaXRvcl9jbWQpOworCWluc3RhbGxfZWxlbWVudChFTkFCTEVfTk9ERSwgJnRlcm1pbmFsX25vX21vbml0b3JfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoRU5BQkxFX05PREUsICZzaG93X2hpc3RvcnlfY21kKTsKKworCWluc3RhbGxfZGVmYXVsdChWVFlfTk9ERSk7CisJaW5zdGFsbF9lbGVtZW50KFZUWV9OT0RFLCAmdnR5X2xvZ2luX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZUWV9OT0RFLCAmbm9fdnR5X2xvZ2luX2NtZCk7Cit9CisKK2ludCB2dHlfcmVhZF9jb25maWdfZmlsZShjb25zdCBjaGFyICpmaWxlX25hbWUpCit7CisJRklMRSAqY2ZpbGU7CisJaW50IHJjOworCisJY2ZpbGUgPSBmb3BlbihmaWxlX25hbWUsICJyIik7CisJaWYgKCFjZmlsZSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlyYyA9IHZ0eV9yZWFkX2ZpbGUoY2ZpbGUpOworCWZjbG9zZShjZmlsZSk7CisKKwlob3N0X2NvbmZpZ19zZXQoZmlsZV9uYW1lKTsKKworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3Z0eV9pbnRlcmZhY2UuYyBiL29wZW5ic2Mvc3JjL3Z0eV9pbnRlcmZhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTFhNjAzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvdnR5X2ludGVyZmFjZS5jCkBAIC0wLDAgKzEsMTgzNiBAQAorLyogT3BlbkJTQyBpbnRlcmZhY2UgdG8gcXVhZ2dhIFZUWSAqLworLyogKEMpIDIwMDktMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHZ0eS9jb21tYW5kLmg+CisjaW5jbHVkZSA8dnR5L2J1ZmZlci5oPgorI2luY2x1ZGUgPHZ0eS92dHkuaD4KKworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZTFfaW5wdXQuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfbm0uaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc21fdXRpbHMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2NoYW5fYWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21lYXNfcmVwLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdGVsbmV0X2ludGVyZmFjZS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdnR5Lmg+CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldDsKKworc3RydWN0IGNtZF9ub2RlIG5ldF9ub2RlID0geworCUdTTU5FVF9OT0RFLAorCSIlcyhuZXR3b3JrKSMiLAorCTEsCit9OworCitzdHJ1Y3QgY21kX25vZGUgYnRzX25vZGUgPSB7CisJQlRTX05PREUsCisJIiVzKGJ0cykjIiwKKwkxLAorfTsKKworc3RydWN0IGNtZF9ub2RlIHRyeF9ub2RlID0geworCVRSWF9OT0RFLAorCSIlcyh0cngpIyIsCisJMSwKK307CisKK3N0cnVjdCBjbWRfbm9kZSB0c19ub2RlID0geworCVRTX05PREUsCisJIiVzKHRzKSMiLAorCTEsCit9OworCitzdGF0aWMgaW50IGR1bW15X2NvbmZpZ193cml0ZShzdHJ1Y3QgdnR5ICp2KQoreworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgbmV0X2R1bXBfbm1zdGF0ZShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fbm1fc3RhdGUgKm5tcykKK3sKKwl2dHlfb3V0KHZ0eSwiT3BlciAnJXMnLCBBZG1pbiAldSwgQXZhaWwgJyVzJyVzIiwKKwkJbm1fb3BzdGF0ZV9uYW1lKG5tcy0+b3BlcmF0aW9uYWwpLCBubXMtPmFkbWluaXN0cmF0aXZlLAorCQlubV9hdmFpbF9uYW1lKG5tcy0+YXZhaWxhYmlsaXR5KSwgVlRZX05FV0xJTkUpOworfQorCitzdGF0aWMgdm9pZCBkdW1wX3BjaGFuX2xvYWRfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgY2hhciAqcHJlZml4LAorCQkJCWNvbnN0IHN0cnVjdCBwY2hhbl9sb2FkICpwbCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBsLT5wY2hhbik7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgbG9hZF9jb3VudGVyICpsYyA9ICZwbC0+cGNoYW5baV07CisJCXVuc2lnbmVkIGludCBwZXJjZW50OworCisJCWlmIChsYy0+dG90YWwgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCXBlcmNlbnQgPSAobGMtPnVzZWQgKiAxMDApIC8gbGMtPnRvdGFsOworCisJCXZ0eV9vdXQodnR5LCAiJXMlMjBzOiAlM3UlJSAoJXUvJXUpJXMiLCBwcmVmaXgsCisJCQlnc21fcGNoYW5fbmFtZShpKSwgcGVyY2VudCwgbGMtPnVzZWQsIGxjLT50b3RhbCwKKwkJCVZUWV9ORVdMSU5FKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG5ldF9kdW1wX3Z0eShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fbmV0d29yayAqbmV0KQoreworCXN0cnVjdCBwY2hhbl9sb2FkIHBsOworCisJdnR5X291dCh2dHksICJCU0MgaXMgb24gQ291bnRyeSBDb2RlICV1LCBOZXR3b3JrIENvZGUgJXUgIgorCQkiYW5kIGhhcyAldSBCVFMlcyIsIG5ldC0+Y291bnRyeV9jb2RlLCBuZXQtPm5ldHdvcmtfY29kZSwKKwkJbmV0LT5udW1fYnRzLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIExvbmcgbmV0d29yayBuYW1lOiAnJXMnJXMiLAorCQluZXQtPm5hbWVfbG9uZywgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBTaG9ydCBuZXR3b3JrIG5hbWU6ICclcyclcyIsCisJCW5ldC0+bmFtZV9zaG9ydCwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBBdXRoZW50aWNhdGlvbiBwb2xpY3k6ICVzJXMiLAorCQlnc21fYXV0aF9wb2xpY3lfbmFtZShuZXQtPmF1dGhfcG9saWN5KSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBMb2NhdGlvbiB1cGRhdGluZyByZWplY3QgY2F1c2U6ICV1JXMiLAorCQluZXQtPnJlamVjdF9jYXVzZSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBFbmNyeXB0aW9uOiBBNS8ldSVzIiwgbmV0LT5hNV9lbmNyeXB0aW9uLAorCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIE5FQ0kgKFRDSC9IKTogJXUlcyIsIG5ldC0+bmVjaSwKKwkJVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBSUkxQIE1vZGU6ICVzJXMiLCBycmxwX21vZGVfbmFtZShuZXQtPnJybHAubW9kZSksCisJCVZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgTU0gSW5mbzogJXMlcyIsIG5ldC0+c2VuZF9tbV9pbmZvID8gIk9uIiA6ICJPZmYiLAorCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIEhhbmRvdmVyOiAlcyVzIiwgbmV0LT5oYW5kb3Zlci5hY3RpdmUgPyAiT24iIDogIk9mZiIsCisJCVZUWV9ORVdMSU5FKTsKKwluZXR3b3JrX2NoYW5fbG9hZCgmcGwsIG5ldCk7CisJdnR5X291dCh2dHksICIgIEN1cnJlbnQgQ2hhbm5lbCBMb2FkOiVzIiwgVlRZX05FV0xJTkUpOworCWR1bXBfcGNoYW5fbG9hZF92dHkodnR5LCAiICAgICIsICZwbCk7Cit9CisKK0RFRlVOKHNob3dfbmV0LCBzaG93X25ldF9jbWQsICJzaG93IG5ldHdvcmsiLAorCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IGEgR1NNIE5FVFdPUktcbiIpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBnc21uZXQ7CisJbmV0X2R1bXBfdnR5KHZ0eSwgbmV0KTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgZTFpc2xfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICplMWwpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmU7CisKKwlpZiAoIWUxbCkgeworCQl2dHlfb3V0KHZ0eSwgIiAgIE5vbmUlcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuOworCX0KKworCWxpbmUgPSBlMWwtPnRzLT5saW5lOworCisJdnR5X291dCh2dHksICIgICAgRTEgTGluZSAldSwgVHlwZSAlczogVGltZXNsb3QgJXUsIE1vZGUgJXMlcyIsCisJCWxpbmUtPm51bSwgbGluZS0+ZHJpdmVyLT5uYW1lLCBlMWwtPnRzLT5udW0sCisJCWUxaW5wX3NpZ250eXBlX25hbWUoZTFsLT50eXBlKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICAgIEUxIFRFSSAldSwgU0FQSSAldSVzIiwKKwkJZTFsLT50ZWksIGUxbC0+c2FwaSwgVlRZX05FV0xJTkUpOworfQorCitzdGF0aWMgdm9pZCBidHNfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBwY2hhbl9sb2FkIHBsOworCisJdnR5X291dCh2dHksICJCVFMgJXUgaXMgb2YgJXMgdHlwZSBpbiBiYW5kICVzLCBoYXMgQ0kgJXUgTEFDICV1LCAiCisJCSJCU0lDICV1LCBUU0MgJXUgYW5kICV1IFRSWCVzIiwKKwkJYnRzLT5uciwgYnRzdHlwZTJzdHIoYnRzLT50eXBlKSwgZ3NtX2JhbmRfbmFtZShidHMtPmJhbmQpLAorCQlidHMtPmNlbGxfaWRlbnRpdHksCisJCWJ0cy0+bG9jYXRpb25fYXJlYV9jb2RlLCBidHMtPmJzaWMsIGJ0cy0+dHNjLAorCQlidHMtPm51bV90cngsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIk1TIE1heCBwb3dlcjogJXUgZEJtJXMiLCBidHMtPm1zX21heF9wb3dlciwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiTWluaW11bSBSeCBMZXZlbCBmb3IgQWNjZXNzOiAlaSBkQm0lcyIsCisJCXJ4bGV2MmRibShidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIucnhsZXZfYWNjX21pbiksCisJCVZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIkNlbGwgUmVzZWxlY3Rpb24gSHlzdGVyZXNpczogJXUgZEJtJXMiLAorCQlidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIuY2VsbF9yZXNlbF9oeXN0KjIsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIlJBQ0ggVFgtSW50ZWdlcjogJXUlcyIsIGJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbC50eF9pbnRlZ2VyLAorCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJSQUNIIE1heCB0cmFuc21pc3Npb25zOiAldSVzIiwKKwkJcmFjaF9tYXhfdHJhbnNfcmF3MnZhbChidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wubWF4X3RyYW5zKSwKKwkJVlRZX05FV0xJTkUpOworCWlmIChidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wuY2VsbF9iYXIpCisJCXZ0eV9vdXQodnR5LCAiICBDRUxMIElTIEJBUlJFRCVzIiwgVlRZX05FV0xJTkUpOworCWlmIChpc19pcGFjY2Vzc19idHMoYnRzKSkKKwkJdnR5X291dCh2dHksICIgIFVuaXQgSUQ6ICV1LyV1LzAsIE9NTCBTdHJlYW0gSUQgMHglMDJ4JXMiLAorCQkJYnRzLT5pcF9hY2Nlc3Muc2l0ZV9pZCwgYnRzLT5pcF9hY2Nlc3MuYnRzX2lkLAorCQkJYnRzLT5vbWxfdGVpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIE5NIFN0YXRlOiAiKTsKKwluZXRfZHVtcF9ubXN0YXRlKHZ0eSwgJmJ0cy0+bm1fc3RhdGUpOworCXZ0eV9vdXQodnR5LCAiICBTaXRlIE1nciBOTSBTdGF0ZTogIik7CisJbmV0X2R1bXBfbm1zdGF0ZSh2dHksICZidHMtPnNpdGVfbWdyLm5tX3N0YXRlKTsKKwl2dHlfb3V0KHZ0eSwgIiAgUGFnaW5nOiBGSVhNRSBwZW5kaW5nIHJlcXVlc3RzLCAldSBmcmVlIHNsb3RzJXMiLAorCQlidHMtPnBhZ2luZy5hdmFpbGFibGVfc2xvdHMsIFZUWV9ORVdMSU5FKTsKKwlpZiAoIWlzX2lwYWNjZXNzX2J0cyhidHMpKSB7CisJCXZ0eV9vdXQodnR5LCAiICBFMSBTaWduYWxsaW5nIExpbms6JXMiLCBWVFlfTkVXTElORSk7CisJCWUxaXNsX2R1bXBfdnR5KHZ0eSwgYnRzLT5vbWxfbGluayk7CisJfQorCS8qIEZJWE1FOiBvbWxfbGluaywgY2hhbl9kZXNjICovCisJbWVtc2V0KCZwbCwgMCwgc2l6ZW9mKHBsKSk7CisJYnRzX2NoYW5fbG9hZCgmcGwsIGJ0cyk7CisJdnR5X291dCh2dHksICIgIEN1cnJlbnQgQ2hhbm5lbCBMb2FkOiVzIiwgVlRZX05FV0xJTkUpOworCWR1bXBfcGNoYW5fbG9hZF92dHkodnR5LCAiICAgICIsICZwbCk7Cit9CisKK0RFRlVOKHNob3dfYnRzLCBzaG93X2J0c19jbWQsICJzaG93IGJ0cyBbbnVtYmVyXSIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgYSBCVFNcbiIKKwkJIkJUUyBudW1iZXIiKQoreworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gZ3NtbmV0OworCWludCBidHNfbnI7CisKKwlpZiAoYXJnYyAhPSAwKSB7CisJCS8qIHVzZSB0aGUgQlRTIG51bWJlciB0aGF0IHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgKi8KKwkJYnRzX25yID0gYXRvaShhcmd2WzBdKTsKKwkJaWYgKGJ0c19uciA+IG5ldC0+bnVtX2J0cykgeworCQkJdnR5X291dCh2dHksICIlJSBjYW4ndCBmaW5kIEJUUyAnJXMnJXMiLCBhcmd2WzBdLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCQlidHNfZHVtcF92dHkodnR5LCBnc21fYnRzX251bShuZXQsIGJ0c19ucikpOworCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJfQorCS8qIHByaW50IGFsbCBCVFMncyAqLworCWZvciAoYnRzX25yID0gMDsgYnRzX25yIDwgbmV0LT5udW1fYnRzOyBidHNfbnIrKykKKwkJYnRzX2R1bXBfdnR5KHZ0eSwgZ3NtX2J0c19udW0obmV0LCBidHNfbnIpKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogdXRpbGl0eSBmdW5jdGlvbnMgKi8KK3N0YXRpYyB2b2lkIHBhcnNlX2UxX2xpbmsoc3RydWN0IGdzbV9lMV9zdWJzbG90ICplMV9saW5rLCBjb25zdCBjaGFyICpsaW5lLAorCQkJICBjb25zdCBjaGFyICp0cywgY29uc3QgY2hhciAqc3MpCit7CisJZTFfbGluay0+ZTFfbnIgPSBhdG9pKGxpbmUpOworCWUxX2xpbmstPmUxX3RzID0gYXRvaSh0cyk7CisJaWYgKCFzdHJjbXAoc3MsICJmdWxsIikpCisJCWUxX2xpbmstPmUxX3RzX3NzID0gMjU1OworCWVsc2UKKwkJZTFfbGluay0+ZTFfdHNfc3MgPSBhdG9pKHNzKTsKK30KKworc3RhdGljIHZvaWQgY29uZmlnX3dyaXRlX2UxX2xpbmsoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKmUxX2xpbmssCisJCQkJIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpZiAoIWUxX2xpbmstPmUxX3RzKQorCQlyZXR1cm47CisKKwlpZiAoZTFfbGluay0+ZTFfdHNfc3MgPT0gMjU1KQorCQl2dHlfb3V0KHZ0eSwgIiVzZTEgbGluZSAldSB0aW1lc2xvdCAldSBzdWItc2xvdCBmdWxsJXMiLAorCQkJcHJlZml4LCBlMV9saW5rLT5lMV9uciwgZTFfbGluay0+ZTFfdHMsIFZUWV9ORVdMSU5FKTsKKwllbHNlCisJCXZ0eV9vdXQodnR5LCAiJXNlMSBsaW5lICV1IHRpbWVzbG90ICV1IHN1Yi1zbG90ICV1JXMiLAorCQkJcHJlZml4LCBlMV9saW5rLT5lMV9uciwgZTFfbGluay0+ZTFfdHMsCisJCQllMV9saW5rLT5lMV90c19zcywgVlRZX05FV0xJTkUpOworfQorCisKK3N0YXRpYyB2b2lkIGNvbmZpZ193cml0ZV90c19zaW5nbGUoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzKQoreworCXZ0eV9vdXQodnR5LCAiICAgIHRpbWVzbG90ICV1JXMiLCB0cy0+bnIsIFZUWV9ORVdMSU5FKTsKKwlpZiAodHMtPnBjaGFuICE9IEdTTV9QQ0hBTl9OT05FKQorCQl2dHlfb3V0KHZ0eSwgIiAgICAgcGh5c19jaGFuX2NvbmZpZyAlcyVzIiwKKwkJCWdzbV9wY2hhbl9uYW1lKHRzLT5wY2hhbiksIFZUWV9ORVdMSU5FKTsKKwljb25maWdfd3JpdGVfZTFfbGluayh2dHksICZ0cy0+ZTFfbGluaywgIiAgICAgIik7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ193cml0ZV90cnhfc2luZ2xlKHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJaW50IGk7CisKKwl2dHlfb3V0KHZ0eSwgIiAgdHJ4ICV1JXMiLCB0cngtPm5yLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgICByZl9sb2NrZWQgJXUlcyIsCisJCXRyeC0+bm1fc3RhdGUuYWRtaW5pc3RyYXRpdmUgPT0gTk1fU1RBVEVfTE9DS0VEID8gMSA6IDAsCisJCVZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgIGFyZmNuICV1JXMiLCB0cngtPmFyZmNuLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgICBub21pbmFsIHBvd2VyICV1JXMiLCB0cngtPm5vbWluYWxfcG93ZXIsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgIG1heF9wb3dlcl9yZWQgJXUlcyIsIHRyeC0+bWF4X3Bvd2VyX3JlZCwgVlRZX05FV0xJTkUpOworCWNvbmZpZ193cml0ZV9lMV9saW5rKHZ0eSwgJnRyeC0+cnNsX2UxX2xpbmssICIgICByc2wgIik7CisJdnR5X291dCh2dHksICIgICByc2wgZTEgdGVpICV1JXMiLCB0cngtPnJzbF90ZWksIFZUWV9ORVdMSU5FKTsKKworCWZvciAoaSA9IDA7IGkgPCBUUlhfTlJfVFM7IGkrKykKKwkJY29uZmlnX3dyaXRlX3RzX3NpbmdsZSh2dHksICZ0cngtPnRzW2ldKTsKK30KKworc3RhdGljIHZvaWQgY29uZmlnX3dyaXRlX2J0c19zaW5nbGUoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCWludCBpOworCisJdnR5X291dCh2dHksICIgYnRzICV1JXMiLCBidHMtPm5yLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIHR5cGUgJXMlcyIsIGJ0c3R5cGUyc3RyKGJ0cy0+dHlwZSksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgYmFuZCAlcyVzIiwgZ3NtX2JhbmRfbmFtZShidHMtPmJhbmQpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIGNlbGxfaWRlbnRpdHkgJXUlcyIsIGJ0cy0+Y2VsbF9pZGVudGl0eSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBsb2NhdGlvbl9hcmVhX2NvZGUgJXUlcyIsIGJ0cy0+bG9jYXRpb25fYXJlYV9jb2RlLAorCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIHRyYWluaW5nX3NlcXVlbmNlX2NvZGUgJXUlcyIsIGJ0cy0+dHNjLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIGJhc2Vfc3RhdGlvbl9pZF9jb2RlICV1JXMiLCBidHMtPmJzaWMsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgbXMgbWF4IHBvd2VyICV1JXMiLCBidHMtPm1zX21heF9wb3dlciwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBjZWxsIHJlc2VsZWN0aW9uIGh5c3RlcmVzaXMgJXUlcyIsCisJCWJ0cy0+c2lfY29tbW9uLmNlbGxfc2VsX3Bhci5jZWxsX3Jlc2VsX2h5c3QqMiwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICByeGxldiBhY2Nlc3MgbWluICV1JXMiLAorCQlidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIucnhsZXZfYWNjX21pbiwgVlRZX05FV0xJTkUpOworCWlmIChidHMtPnNpX2NvbW1vbi5jaGFuX2Rlc2MudDMyMTIpCisJCXZ0eV9vdXQodnR5LCAiICBwZXJpb2RpYyBsb2NhdGlvbiB1cGRhdGUgJXUlcyIsCisJCQlidHMtPnNpX2NvbW1vbi5jaGFuX2Rlc2MudDMyMTIgKiAxMCwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBjaGFubmVsIGFsbG9jYXRvciAlcyVzIiwKKwkJYnRzLT5jaGFuX2FsbG9jX3JldmVyc2UgPyAiZGVzY2VuZGluZyIgOiAiYXNjZW5kaW5nIiwKKwkJVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICByYWNoIHR4IGludGVnZXIgJXUlcyIsCisJCWJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbC50eF9pbnRlZ2VyLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIHJhY2ggbWF4IHRyYW5zbWlzc2lvbiAldSVzIiwKKwkJcmFjaF9tYXhfdHJhbnNfcmF3MnZhbChidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wubWF4X3RyYW5zKSwKKwkJVlRZX05FV0xJTkUpOworCisJaWYgKGJ0cy0+cmFjaF9iX3RocmVzaCAhPSAtMSkKKwkJdnR5X291dCh2dHksICIgIHJhY2ggbm0gYnVzeSB0aHJlc2hvbGQgJXUlcyIsCisJCQlidHMtPnJhY2hfYl90aHJlc2gsIFZUWV9ORVdMSU5FKTsKKwlpZiAoYnRzLT5yYWNoX2xkYXZnX3Nsb3RzICE9IC0xKQorCQl2dHlfb3V0KHZ0eSwgIiAgcmFjaCBubSBsb2FkIGF2ZXJhZ2UgJXUlcyIsCisJCQlidHMtPnJhY2hfbGRhdmdfc2xvdHMsIFZUWV9ORVdMSU5FKTsKKwlpZiAoYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLmNlbGxfYmFyKQorCQl2dHlfb3V0KHZ0eSwgIiAgY2VsbCBiYXJyZWQgMSVzIiwgVlRZX05FV0xJTkUpOworCWlmIChpc19pcGFjY2Vzc19idHMoYnRzKSkgeworCQl2dHlfb3V0KHZ0eSwgIiAgaXAuYWNjZXNzIHVuaXRfaWQgJXUgJXUlcyIsCisJCQlidHMtPmlwX2FjY2Vzcy5zaXRlX2lkLCBidHMtPmlwX2FjY2Vzcy5idHNfaWQsIFZUWV9ORVdMSU5FKTsKKwkJdnR5X291dCh2dHksICIgIG9tbCBpcC5hY2Nlc3Mgc3RyZWFtX2lkICV1JXMiLCBidHMtPm9tbF90ZWksIFZUWV9ORVdMSU5FKTsKKwl9IGVsc2UgeworCQljb25maWdfd3JpdGVfZTFfbGluayh2dHksICZidHMtPm9tbF9lMV9saW5rLCAiICBvbWwgIik7CisJCXZ0eV9vdXQodnR5LCAiICBvbWwgZTEgdGVpICV1JXMiLCBidHMtPm9tbF90ZWksIFZUWV9ORVdMSU5FKTsKKwl9CisJdnR5X291dCh2dHksICIgIGdwcnMgbW9kZSAlcyVzIiwgYnRzX2dwcnNfbW9kZV9uYW1lKGJ0cy0+Z3Bycy5tb2RlKSwKKwkJVlRZX05FV0xJTkUpOworCWlmIChidHMtPmdwcnMubW9kZSAhPSBCVFNfR1BSU19OT05FKSB7CisJCXZ0eV9vdXQodnR5LCAiICBncHJzIHJvdXRpbmcgYXJlYSAldSVzIiwgYnRzLT5ncHJzLnJhYywKKwkJCVZUWV9ORVdMSU5FKTsKKwkJdnR5X291dCh2dHksICIgIGdwcnMgY2VsbCBidmNpICV1JXMiLCBidHMtPmdwcnMuY2VsbC5idmNpLAorCQkJVlRZX05FV0xJTkUpOworCQl2dHlfb3V0KHZ0eSwgIiAgZ3BycyBuc2VpICV1JXMiLCBidHMtPmdwcnMubnNlLm5zZWksCisJCQlWVFlfTkVXTElORSk7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJ0cy0+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+dHNbdHNfbnJdOworCQkJCXRzX2R1bXBfdnR5KHZ0eSwgdHMpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBzdWJzY3JfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKwl2dHlfb3V0KHZ0eSwgIiAgICBJRDogJWxsdSwgQXV0aG9yaXplZDogJWQlcyIsIHN1YnNjci0+aWQsCisJCXN1YnNjci0+YXV0aG9yaXplZCwgVlRZX05FV0xJTkUpOworCWlmIChzdWJzY3ItPm5hbWUpCisJCXZ0eV9vdXQodnR5LCAiICAgIE5hbWU6ICclcyclcyIsIHN1YnNjci0+bmFtZSwgVlRZX05FV0xJTkUpOworCWlmIChzdWJzY3ItPmV4dGVuc2lvbikKKwkJdnR5X291dCh2dHksICIgICAgRXh0ZW5zaW9uOiAlcyVzIiwgc3Vic2NyLT5leHRlbnNpb24sCisJCQlWVFlfTkVXTElORSk7CisJaWYgKHN1YnNjci0+aW1zaSkKKwkJdnR5X291dCh2dHksICIgICAgSU1TSTogJXMlcyIsIHN1YnNjci0+aW1zaSwgVlRZX05FV0xJTkUpOworCWlmIChzdWJzY3ItPnRtc2kgIT0gR1NNX1JFU0VSVkVEX1RNU0kpCisJCXZ0eV9vdXQodnR5LCAiICAgIFRNU0k6ICUwOFglcyIsIHN1YnNjci0+dG1zaSwKKwkJCVZUWV9ORVdMSU5FKTsKKworCXZ0eV9vdXQodnR5LCAiICAgIFVzZSBjb3VudDogJXUlcyIsIHN1YnNjci0+dXNlX2NvdW50LCBWVFlfTkVXTElORSk7Cit9CisKK3N0YXRpYyB2b2lkIG1lYXNfcmVwX2R1bXBfdW5pX3Z0eShzdHJ1Y3QgdnR5ICp2dHksCisJCQkJICBzdHJ1Y3QgZ3NtX21lYXNfcmVwX3VuaWRpciAqbXJ1LAorCQkJCSAgY29uc3QgY2hhciAqcHJlZml4LAorCQkJCSAgY29uc3QgY2hhciAqZGlyKQoreworCXZ0eV9vdXQodnR5LCAiJXMgIFJYTC1GVUxMLSVzOiAlNGQgZEJtLCBSWEwtU1VCLSVzOiAlNGQgZEJtICIsCisJCXByZWZpeCwgZGlyLCByeGxldjJkYm0obXJ1LT5mdWxsLnJ4X2xldiksCisJCQlkaXIsIHJ4bGV2MmRibShtcnUtPnN1Yi5yeF9sZXYpKTsKKwl2dHlfb3V0KHZ0eSwgIlJYUS1GVUxMLSVzOiAlZCwgUlhRLVNVQi0lczogJWQlcyIsCisJCWRpciwgbXJ1LT5mdWxsLnJ4X3F1YWwsIGRpciwgbXJ1LT5zdWIucnhfcXVhbCwKKwkJVlRZX05FV0xJTkUpOworfQorCitzdGF0aWMgdm9pZCBtZWFzX3JlcF9kdW1wX3Z0eShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fbWVhc19yZXAgKm1yLAorCQkJICAgICAgY29uc3QgY2hhciAqcHJlZml4KQoreworCXZ0eV9vdXQodnR5LCAiJXNNZWFzdXJlbWVudCBSZXBvcnQ6JXMiLCBwcmVmaXgsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiVzICBGbGFnczogJXMlcyVzJXMlcyIsIHByZWZpeCwKKwkJCW1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfVUxfRFRYID8gIkRUWHUgIiA6ICIiLAorCQkJbXItPmZsYWdzICYgTUVBU19SRVBfRl9ETF9EVFggPyAiRFRYZCAiIDogIiIsCisJCQltci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX0ZQQyA/ICJGUEMgIiA6ICIiLAorCQkJbXItPmZsYWdzICYgTUVBU19SRVBfRl9ETF9WQUxJRCA/ICIgIiA6ICJETGludmFsICIsCisJCQlWVFlfTkVXTElORSk7CisJaWYgKG1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfTVNfVE8pCisJCXZ0eV9vdXQodnR5LCAiJXMgIE1TIFRpbWluZyBPZmZzZXQ6ICV1JXMiLCBwcmVmaXgsCisJCQltci0+bXNfdGltaW5nX29mZnNldCwgVlRZX05FV0xJTkUpOworCWlmIChtci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX01TX0wxKQorCQl2dHlfb3V0KHZ0eSwgIiVzICBMMSBNUyBQb3dlcjogJXUgZEJtLCBUaW1pbmcgQWR2YW5jZTogJXUlcyIsCisJCQlwcmVmaXgsIG1yLT5tc19sMS5wd3IsIG1yLT5tc19sMS50YSwgVlRZX05FV0xJTkUpOworCWlmIChtci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX0RMX1ZBTElEKQorCQltZWFzX3JlcF9kdW1wX3VuaV92dHkodnR5LCAmbXItPmRsLCBwcmVmaXgsICJkbCIpOworCW1lYXNfcmVwX2R1bXBfdW5pX3Z0eSh2dHksICZtci0+dWwsIHByZWZpeCwgInVsIik7Cit9CisKK3N0YXRpYyB2b2lkIGxjaGFuX2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJaW50IGlkeDsKKworCXZ0eV9vdXQodnR5LCAiTGNoYW4gJXUgaW4gVGltZXNsb3QgJXUgb2YgVFJYICV1IGluIEJUUyAldSwgVHlwZSAlcyVzIiwKKwkJbGNoYW4tPm5yLCBsY2hhbi0+dHMtPm5yLCBsY2hhbi0+dHMtPnRyeC0+bnIsCisJCWxjaGFuLT50cy0+dHJ4LT5idHMtPm5yLCBnc21fbGNoYW50X25hbWUobGNoYW4tPnR5cGUpLAorCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIFVzZSBDb3VudDogJXUsIFN0YXRlOiAlcyVzIiwgbGNoYW4tPmNvbm4udXNlX2NvdW50LAorCQlnc21fbGNoYW5zX25hbWUobGNoYW4tPnN0YXRlKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBCUyBQb3dlcjogJXUgZEJtLCBNUyBQb3dlcjogJXUgZEJtJXMiLAorCQlsY2hhbi0+dHMtPnRyeC0+bm9taW5hbF9wb3dlciAtIGxjaGFuLT50cy0+dHJ4LT5tYXhfcG93ZXJfcmVkCisJCS0gbGNoYW4tPmJzX3Bvd2VyKjIsCisJCW1zX3B3cl9kYm0obGNoYW4tPnRzLT50cngtPmJ0cy0+YmFuZCwgbGNoYW4tPm1zX3Bvd2VyKSwKKwkJVlRZX05FV0xJTkUpOworCWlmIChsY2hhbi0+Y29ubi5zdWJzY3IpIHsKKwkJdnR5X291dCh2dHksICIgIFN1YnNjcmliZXI6JXMiLCBWVFlfTkVXTElORSk7CisJCXN1YnNjcl9kdW1wX3Z0eSh2dHksIGxjaGFuLT5jb25uLnN1YnNjcik7CisJfSBlbHNlCisJCXZ0eV9vdXQodnR5LCAiICBObyBTdWJzY3JpYmVyJXMiLCBWVFlfTkVXTElORSk7CisJaWYgKGlzX2lwYWNjZXNzX2J0cyhsY2hhbi0+dHMtPnRyeC0+YnRzKSkgeworCQlzdHJ1Y3QgaW5fYWRkciBpYTsKKwkJaWEuc19hZGRyID0gaHRvbmwobGNoYW4tPmFiaXNfaXAuYm91bmRfaXApOworCQl2dHlfb3V0KHZ0eSwgIiAgQm91bmQgSVA6ICVzIFBvcnQgJXUgUlRQX1RZUEUyPSV1IENPTk5fSUQ9JXUlcyIsCisJCQlpbmV0X250b2EoaWEpLCBsY2hhbi0+YWJpc19pcC5ib3VuZF9wb3J0LAorCQkJbGNoYW4tPmFiaXNfaXAucnRwX3BheWxvYWQyLCBsY2hhbi0+YWJpc19pcC5jb25uX2lkLAorCQkJVlRZX05FV0xJTkUpOworCX0KKworCS8qIHdlIHdhbnQgdG8gcmVwb3J0IHRoZSBsYXN0IG1lYXN1cmVtZW50IHJlcG9ydCAqLworCWlkeCA9IGNhbGNfaW5pdGlhbF9pZHgoQVJSQVlfU0laRShsY2hhbi0+bWVhc19yZXApLAorCQkJICAgICAgIGxjaGFuLT5tZWFzX3JlcF9pZHgsIDEpOworCW1lYXNfcmVwX2R1bXBfdnR5KHZ0eSwgJmxjaGFuLT5tZWFzX3JlcFtpZHhdLCAiICAiKTsKK30KKworI2lmIDAKK1RPRE86IGNhbGxyZWYgYW5kIHJlbW90ZSBjYWxscmVmIG9mIGNhbGwgbXVzdCBiZSByZXNvbHZlZCB0byBnZXQgZ3NtX3RyYW5zIG9iamVjdAorc3RhdGljIHZvaWQgY2FsbF9kdW1wX3Z0eShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fY2FsbCAqY2FsbCkKK3sKKwl2dHlfb3V0KHZ0eSwgIkNhbGwgVHlwZSAldSwgU3RhdGUgJXUsIFRyYW5zYWN0aW9uIElEICV1JXMiLAorCQljYWxsLT50eXBlLCBjYWxsLT5zdGF0ZSwgY2FsbC0+dHJhbnNhY3Rpb25faWQsIFZUWV9ORVdMSU5FKTsKKworCWlmIChjYWxsLT5sb2NhbF9sY2hhbikgeworCQl2dHlfb3V0KHZ0eSwgIkNhbGwgTG9jYWwgQ2hhbm5lbDolcyIsIFZUWV9ORVdMSU5FKTsKKwkJbGNoYW5fZHVtcF92dHkodnR5LCBjYWxsLT5sb2NhbF9sY2hhbik7CisJfSBlbHNlCisJCXZ0eV9vdXQodnR5LCAiQ2FsbCBoYXMgbm8gTG9jYWwgQ2hhbm5lbCVzIiwgVlRZX05FV0xJTkUpOworCisJaWYgKGNhbGwtPnJlbW90ZV9sY2hhbikgeworCQl2dHlfb3V0KHZ0eSwgIkNhbGwgUmVtb3RlIENoYW5uZWw6JXMiLCBWVFlfTkVXTElORSk7CisJCWxjaGFuX2R1bXBfdnR5KHZ0eSwgY2FsbC0+cmVtb3RlX2xjaGFuKTsKKwl9IGVsc2UKKwkJdnR5X291dCh2dHksICJDYWxsIGhhcyBubyBSZW1vdGUgQ2hhbm5lbCVzIiwgVlRZX05FV0xJTkUpOworCisJaWYgKGNhbGwtPmNhbGxlZF9zdWJzY3IpIHsKKwkJdnR5X291dCh2dHksICJDYWxsZWQgU3Vic2NyaWJlcjolcyIsIFZUWV9ORVdMSU5FKTsKKwkJc3Vic2NyX2R1bXBfdnR5KHZ0eSwgY2FsbC0+Y2FsbGVkX3N1YnNjcik7CisJfSBlbHNlCisJCXZ0eV9vdXQodnR5LCAiQ2FsbCBoYXMgbm8gQ2FsbGVkIFN1YnNjcmliZXIlcyIsIFZUWV9ORVdMSU5FKTsKK30KKyNlbmRpZgorCitERUZVTihzaG93X2xjaGFuLAorICAgICAgc2hvd19sY2hhbl9jbWQsCisgICAgICAic2hvdyBsY2hhbiBbYnRzX25yXSBbdHJ4X25yXSBbdHNfbnJdIFtsY2hhbl9ucl0iLAorCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IGEgbG9naWNhbCBjaGFubmVsXG4iKQoreworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gZ3NtbmV0OworCXN0cnVjdCBnc21fYnRzICpidHM7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0czsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKwlpbnQgYnRzX25yLCB0cnhfbnIsIHRzX25yLCBsY2hhbl9ucjsKKworCWlmIChhcmdjID49IDEpIHsKKwkJLyogdXNlIHRoZSBCVFMgbnVtYmVyIHRoYXQgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCAqLworCQlidHNfbnIgPSBhdG9pKGFyZ3ZbMF0pOworCQlpZiAoYnRzX25yID49IG5ldC0+bnVtX2J0cykgeworCQkJdnR5X291dCh2dHksICIlJSBjYW4ndCBmaW5kIEJUUyAlcyVzIiwgYXJndlswXSwKKwkJCQlWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJYnRzID0gZ3NtX2J0c19udW0obmV0LCBidHNfbnIpOworCX0KKwlpZiAoYXJnYyA+PSAyKSB7CisJCXRyeF9uciA9IGF0b2koYXJndlsxXSk7CisJCWlmICh0cnhfbnIgPj0gYnRzLT5udW1fdHJ4KSB7CisJCQl2dHlfb3V0KHZ0eSwgIiUlIGNhbid0IGZpbmQgVFJYICVzJXMiLCBhcmd2WzFdLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCQl0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCB0cnhfbnIpOworCX0KKwlpZiAoYXJnYyA+PSAzKSB7CisJCXRzX25yID0gYXRvaShhcmd2WzJdKTsKKwkJaWYgKHRzX25yID49IFRSWF9OUl9UUykgeworCQkJdnR5X291dCh2dHksICIlJSBjYW4ndCBmaW5kIFRTICVzJXMiLCBhcmd2WzJdLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCQl0cyA9ICZ0cngtPnRzW3RzX25yXTsKKwl9CisJaWYgKGFyZ2MgPj0gNCkgeworCQlsY2hhbl9uciA9IGF0b2koYXJndlszXSk7CisJCWlmIChsY2hhbl9uciA+PSBUU19NQVhfTENIQU4pIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgY2FuJ3QgZmluZCBMQ0hBTiAlcyVzIiwgYXJndlszXSwKKwkJCQlWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJbGNoYW4gPSAmdHMtPmxjaGFuW2xjaGFuX25yXTsKKwkJbGNoYW5fZHVtcF92dHkodnR5LCBsY2hhbik7CisJCXJldHVybiBDTURfU1VDQ0VTUzsKKwl9CisJZm9yIChidHNfbnIgPSAwOyBidHNfbnIgPCBuZXQtPm51bV9idHM7IGJ0c19ucisrKSB7CisJCWJ0cyA9IGdzbV9idHNfbnVtKG5ldCwgYnRzX25yKTsKKwkJZm9yICh0cnhfbnIgPSAwOyB0cnhfbnIgPCBidHMtPm51bV90cng7IHRyeF9ucisrKSB7CisJCQl0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCB0cnhfbnIpOworCQkJZm9yICh0c19uciA9IDA7IHRzX25yIDwgVFJYX05SX1RTOyB0c19ucisrKSB7CisJCQkJdHMgPSAmdHJ4LT50c1t0c19ucl07CisJCQkJZm9yIChsY2hhbl9uciA9IDA7IGxjaGFuX25yIDwgVFNfTUFYX0xDSEFOOworCQkJCSAgICAgbGNoYW5fbnIrKykgeworCQkJCQlsY2hhbiA9ICZ0cy0+bGNoYW5bbGNoYW5fbnJdOworCQkJCQlpZiAobGNoYW4tPnR5cGUgPT0gR1NNX0xDSEFOX05PTkUpCisJCQkJCQljb250aW51ZTsKKwkJCQkJbGNoYW5fZHVtcF92dHkodnR5LCBsY2hhbik7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBlMWRydl9kdW1wX3Z0eShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBlMWlucF9kcml2ZXIgKmRydikKK3sKKwl2dHlfb3V0KHZ0eSwgIkUxIElucHV0IERyaXZlciAlcyVzIiwgZHJ2LT5uYW1lLCBWVFlfTkVXTElORSk7Cit9CisKK0RFRlVOKHNob3dfZTFkcnYsCisgICAgICBzaG93X2UxZHJ2X2NtZCwKKyAgICAgICJzaG93IGUxX2RyaXZlciIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgYXZhaWxhYmxlIEUxIGRyaXZlcnNcbiIpCit7CisJc3RydWN0IGUxaW5wX2RyaXZlciAqZHJ2OworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoZHJ2LCAmZTFpbnBfZHJpdmVyX2xpc3QsIGxpc3QpCisJCWUxZHJ2X2R1bXBfdnR5KHZ0eSwgZHJ2KTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgZTFsaW5lX2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUpCit7CisJdnR5X291dCh2dHksICJFMSBMaW5lIE51bWJlciAldSwgTmFtZSAlcywgRHJpdmVyICVzJXMiLAorCQlsaW5lLT5udW0sIGxpbmUtPm5hbWUgPyBsaW5lLT5uYW1lIDogIiIsCisJCWxpbmUtPmRyaXZlci0+bmFtZSwgVlRZX05FV0xJTkUpOworfQorCitERUZVTihzaG93X2UxbGluZSwKKyAgICAgIHNob3dfZTFsaW5lX2NtZCwKKyAgICAgICJzaG93IGUxX2xpbmUgW2xpbmVfbnJdIiwKKwlTSE9XX1NUUiAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCBhIEUxIGxpbmVcbiIpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmU7CisKKwlpZiAoYXJnYyA+PSAxKSB7CisJCWludCBudW0gPSBhdG9pKGFyZ3ZbMF0pOworCQlsbGlzdF9mb3JfZWFjaF9lbnRyeShsaW5lLCAmZTFpbnBfbGluZV9saXN0LCBsaXN0KSB7CisJCQlpZiAobGluZS0+bnVtID09IG51bSkgeworCQkJCWUxbGluZV9kdW1wX3Z0eSh2dHksIGxpbmUpOworCQkJCXJldHVybiBDTURfU1VDQ0VTUzsKKwkJCX0KKwkJfQorCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQkKKwkKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShsaW5lLCAmZTFpbnBfbGluZV9saXN0LCBsaXN0KQorCQllMWxpbmVfZHVtcF92dHkodnR5LCBsaW5lKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgZTF0c19kdW1wX3Z0eShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBlMWlucF90cyAqdHMpCit7CisJaWYgKHRzLT50eXBlID09IEUxSU5QX1RTX1RZUEVfTk9ORSkKKwkJcmV0dXJuOworCXZ0eV9vdXQodnR5LCAiRTEgVGltZXNsb3QgJTJ1IG9mIExpbmUgJXUgaXMgVHlwZSAlcyVzIiwKKwkJdHMtPm51bSwgdHMtPmxpbmUtPm51bSwgZTFpbnBfdHN0eXBlX25hbWUodHMtPnR5cGUpLAorCQlWVFlfTkVXTElORSk7Cit9CisKK0RFRlVOKHNob3dfZTF0cywKKyAgICAgIHNob3dfZTF0c19jbWQsCisgICAgICAic2hvdyBlMV90aW1lc2xvdCBbbGluZV9ucl0gW3RzX25yXSIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgYSBFMSB0aW1lc2xvdFxuIikKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSA9IE5VTEw7CisJc3RydWN0IGUxaW5wX3RzICp0czsKKwlpbnQgdHNfbnI7CisKKwlpZiAoYXJnYyA9PSAwKSB7CisJCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGxpbmUsICZlMWlucF9saW5lX2xpc3QsIGxpc3QpIHsKKwkJCWZvciAodHNfbnIgPSAwOyB0c19uciA8IE5VTV9FMV9UUzsgdHNfbnIrKykgeworCQkJCXRzID0gJmxpbmUtPnRzW3RzX25yXTsKKwkJCQllMXRzX2R1bXBfdnR5KHZ0eSwgdHMpOworCQkJfQorCQl9CisJCXJldHVybiBDTURfU1VDQ0VTUzsKKwl9CisJaWYgKGFyZ2MgPj0gMSkgeworCQlpbnQgbnVtID0gYXRvaShhcmd2WzBdKTsKKwkJbGxpc3RfZm9yX2VhY2hfZW50cnkobGluZSwgJmUxaW5wX2xpbmVfbGlzdCwgbGlzdCkgeworCQkJaWYgKGxpbmUtPm51bSA9PSBudW0pCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFsaW5lIHx8IGxpbmUtPm51bSAhPSBudW0pIHsKKwkJCXZ0eV9vdXQodnR5LCAiRTEgbGluZSAlcyBpcyBpbnZhbGlkJXMiLAorCQkJCWFyZ3ZbMF0sIFZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCX0JCisJaWYgKGFyZ2MgPj0gMikgeworCQl0c19uciA9IGF0b2koYXJndlsxXSk7CisJCWlmICh0c19uciA+IE5VTV9FMV9UUykgeworCQkJdnR5X291dCh2dHksICJFMSB0aW1lc2xvdCAlcyBpcyBpbnZhbGlkJXMiLAorCQkJCWFyZ3ZbMV0sIFZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCQl0cyA9ICZsaW5lLT50c1t0c19ucl07CisJCWUxdHNfZHVtcF92dHkodnR5LCB0cyk7CisJCXJldHVybiBDTURfU1VDQ0VTUzsKKwl9IGVsc2UgeworCQlmb3IgKHRzX25yID0gMDsgdHNfbnIgPCBOVU1fRTFfVFM7IHRzX25yKyspIHsKKwkJCXRzID0gJmxpbmUtPnRzW3RzX25yXTsKKwkJCWUxdHNfZHVtcF92dHkodnR5LCB0cyk7CisJCX0KKwkJcmV0dXJuIENNRF9TVUNDRVNTOworCX0KKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIHBhZ2luZ19kdW1wX3Z0eShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKnBhZykKK3sKKwl2dHlfb3V0KHZ0eSwgIlBhZ2luZyBvbiBCVFMgJXUlcyIsIHBhZy0+YnRzLT5uciwgVlRZX05FV0xJTkUpOworCXN1YnNjcl9kdW1wX3Z0eSh2dHksIHBhZy0+c3Vic2NyKTsKK30KKworc3RhdGljIHZvaWQgYnRzX3BhZ2luZ19kdW1wX3Z0eShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCAqcGFnOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkocGFnLCAmYnRzLT5wYWdpbmcucGVuZGluZ19yZXF1ZXN0cywgZW50cnkpCisJCXBhZ2luZ19kdW1wX3Z0eSh2dHksIHBhZyk7Cit9CisKK0RFRlVOKHNob3dfcGFnaW5nLAorICAgICAgc2hvd19wYWdpbmdfY21kLAorICAgICAgInNob3cgcGFnaW5nIFtidHNfbnJdIiwKKwlTSE9XX1NUUiAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCBwYWdpbmcgcmV1cWVzdHMgb2YgYSBCVFNcbiIpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBnc21uZXQ7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlpbnQgYnRzX25yOworCisJaWYgKGFyZ2MgPj0gMSkgeworCQkvKiB1c2UgdGhlIEJUUyBudW1iZXIgdGhhdCB0aGUgdXNlciBoYXMgc3BlY2lmaWVkICovCisJCWJ0c19uciA9IGF0b2koYXJndlswXSk7CisJCWlmIChidHNfbnIgPj0gbmV0LT5udW1fYnRzKSB7CisJCQl2dHlfb3V0KHZ0eSwgIiUlIGNhbid0IGZpbmQgQlRTICVzJXMiLCBhcmd2WzBdLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCQlidHMgPSBnc21fYnRzX251bShuZXQsIGJ0c19ucik7CisJCWJ0c19wYWdpbmdfZHVtcF92dHkodnR5LCBidHMpOworCQkKKwkJcmV0dXJuIENNRF9TVUNDRVNTOworCX0KKwlmb3IgKGJ0c19uciA9IDA7IGJ0c19uciA8IG5ldC0+bnVtX2J0czsgYnRzX25yKyspIHsKKwkJYnRzID0gZ3NtX2J0c19udW0obmV0LCBidHNfbnIpOworCQlidHNfcGFnaW5nX2R1bXBfdnR5KHZ0eSwgYnRzKTsKKwl9CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXQsCisgICAgICBjZmdfbmV0X2NtZCwKKyAgICAgICJuZXR3b3JrIiwKKyAgICAgICJDb25maWd1cmUgdGhlIEdTTSBuZXR3b3JrIikKK3sKKwl2dHktPmluZGV4ID0gZ3NtbmV0OworCXZ0eS0+bm9kZSA9IEdTTU5FVF9OT0RFOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisKK0RFRlVOKGNmZ19uZXRfbmNjLAorICAgICAgY2ZnX25ldF9uY2NfY21kLAorICAgICAgIm5ldHdvcmsgY291bnRyeSBjb2RlIDwxLTk5OT4iLAorICAgICAgIlNldCB0aGUgR1NNIG5ldHdvcmsgY291bnRyeSBjb2RlIikKK3sKKwlnc21uZXQtPmNvdW50cnlfY29kZSA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfbW5jLAorICAgICAgY2ZnX25ldF9tbmNfY21kLAorICAgICAgIm1vYmlsZSBuZXR3b3JrIGNvZGUgPDEtOTk5PiIsCisgICAgICAiU2V0IHRoZSBHU00gbW9iaWxlIG5ldHdvcmsgY29kZSIpCit7CisJZ3NtbmV0LT5uZXR3b3JrX2NvZGUgPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X25hbWVfc2hvcnQsCisgICAgICBjZmdfbmV0X25hbWVfc2hvcnRfY21kLAorICAgICAgInNob3J0IG5hbWUgTkFNRSIsCisgICAgICAiU2V0IHRoZSBzaG9ydCBHU00gbmV0d29yayBuYW1lIikKK3sKKwlpZiAoZ3NtbmV0LT5uYW1lX3Nob3J0KQorCQl0YWxsb2NfZnJlZShnc21uZXQtPm5hbWVfc2hvcnQpOworCisJZ3NtbmV0LT5uYW1lX3Nob3J0ID0gdGFsbG9jX3N0cmR1cChnc21uZXQsIGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X25hbWVfbG9uZywKKyAgICAgIGNmZ19uZXRfbmFtZV9sb25nX2NtZCwKKyAgICAgICJsb25nIG5hbWUgTkFNRSIsCisgICAgICAiU2V0IHRoZSBsb25nIEdTTSBuZXR3b3JrIG5hbWUiKQoreworCWlmIChnc21uZXQtPm5hbWVfbG9uZykKKwkJdGFsbG9jX2ZyZWUoZ3NtbmV0LT5uYW1lX2xvbmcpOworCisJZ3NtbmV0LT5uYW1lX2xvbmcgPSB0YWxsb2Nfc3RyZHVwKGdzbW5ldCwgYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfYXV0aF9wb2xpY3ksCisgICAgICBjZmdfbmV0X2F1dGhfcG9saWN5X2NtZCwKKyAgICAgICJhdXRoIHBvbGljeSAoY2xvc2VkfGFjY2VwdC1hbGx8dG9rZW4pIiwKKyAgICAgICJTZXQgdGhlIEdTTSBuZXR3b3JrIGF1dGhlbnRpY2F0aW9uIHBvbGljeVxuIikKK3sKKwllbnVtIGdzbV9hdXRoX3BvbGljeSBwb2xpY3kgPSBnc21fYXV0aF9wb2xpY3lfcGFyc2UoYXJndlswXSk7CisKKwlnc21uZXQtPmF1dGhfcG9saWN5ID0gcG9saWN5OworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X3JlamVjdF9jYXVzZSwKKyAgICAgIGNmZ19uZXRfcmVqZWN0X2NhdXNlX2NtZCwKKyAgICAgICJsb2NhdGlvbiB1cGRhdGluZyByZWplY3QgY2F1c2UgPDItMTExPiIsCisgICAgICAiU2V0IHRoZSByZWplY3QgY2F1c2Ugb2YgbG9jYXRpb24gdXBkYXRpbmcgcmVqZWN0XG4iKQoreworCWdzbW5ldC0+cmVqZWN0X2NhdXNlID0gYXRvaShhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9lbmNyeXB0aW9uLAorICAgICAgY2ZnX25ldF9lbmNyeXB0aW9uX2NtZCwKKyAgICAgICJlbmNyeXB0aW9uIGE1ICgwfDF8MikiLAorICAgICAgIkVuYWJsZSBvciBkaXNhYmxlIGVuY3J5cHRpb24gKEE1KSBmb3IgdGhpcyBuZXR3b3JrXG4iKQoreworCWdzbW5ldC0+YTVfZW5jcnlwdGlvbj0gYXRvaShhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9uZWNpLAorICAgICAgY2ZnX25ldF9uZWNpX2NtZCwKKyAgICAgICJuZWNpICgwfDEpIiwKKyAgICAgICJTZXQgaWYgTkVDSSBvZiBjZWxsIHNlbGVjdGlvbiBpcyB0byBiZSBzZXQiKQoreworCWdzbW5ldC0+bmVjaSA9IGF0b2koYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X3JybHBfbW9kZSwgY2ZnX25ldF9ycmxwX21vZGVfY21kLAorICAgICAgInJybHAgbW9kZSAobm9uZXxtcy1iYXNlZHxtcy1wcmVmZXJyZWR8YXNzLXByZWZlcnJlZCkiLAorCSJTZXQgdGhlIFJhZGlvIFJlc291cmNlIExvY2F0aW9uIFByb3RvY29sIE1vZGUiKQoreworCWdzbW5ldC0+cnJscC5tb2RlID0gcnJscF9tb2RlX3BhcnNlKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X21tX2luZm8sIGNmZ19uZXRfbW1faW5mb19jbWQsCisgICAgICAibW0gaW5mbyAoMHwxKSIsCisJIldoZXRoZXIgdG8gc2VuZCBNTSBJTkZPIGFmdGVyIExPQyBVUEQgQUNDRVBUIikKK3sKKwlnc21uZXQtPnNlbmRfbW1faW5mbyA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfaGFuZG92ZXIsIGNmZ19uZXRfaGFuZG92ZXJfY21kLAorICAgICAgImhhbmRvdmVyICgwfDEpIiwKKwkiV2hldGhlciBvciBub3QgdG8gdXNlIGluLWNhbGwgaGFuZG92ZXIiKQoreworCWludCBlbmFibGUgPSBhdG9pKGFyZ3ZbMF0pOworCisJaWYgKGVuYWJsZSAmJiBpcGFjY19ydHBfZGlyZWN0KSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgQ2Fubm90IGVuYWJsZSBoYW5kb3ZlciB1bmxlc3MgUlRQIFByb3h5IG1vZGUgIgorCQkJImlzIGVuYWJsZWQgYnkgdXNpbmcgdGhlIC1QIGNvbW1hbmQgbGluZSBvcHRpb24lcyIsCisJCQlWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisJZ3NtbmV0LT5oYW5kb3Zlci5hY3RpdmUgPSBlbmFibGU7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfaG9fd2luX3J4bGV2X2F2ZywgY2ZnX25ldF9ob193aW5fcnhsZXZfYXZnX2NtZCwKKyAgICAgICJoYW5kb3ZlciB3aW5kb3cgcnhsZXYgYXZlcmFnaW5nIDwxLTEwPiIsCisJIkhvdyBtYW55IFJ4TGV2IG1lYXN1cmVtZW50cyBhcmUgdXNlZCBmb3IgYXZlcmFnaW5nIikKK3sKKwlnc21uZXQtPmhhbmRvdmVyLndpbl9yeGxldl9hdmcgPSBhdG9pKGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9ob193aW5fcnhxdWFsX2F2ZywgY2ZnX25ldF9ob193aW5fcnhxdWFsX2F2Z19jbWQsCisgICAgICAiaGFuZG92ZXIgd2luZG93IHJ4cXVhbCBhdmVyYWdpbmcgPDEtMTA+IiwKKwkiSG93IG1hbnkgUnhRdWFsIG1lYXN1cmVtZW50cyBhcmUgdXNlZCBmb3IgYXZlcmFnaW5nIikKK3sKKwlnc21uZXQtPmhhbmRvdmVyLndpbl9yeHF1YWxfYXZnID0gYXRvaShhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfaG9fd2luX3J4bGV2X25laWdoX2F2ZywgY2ZnX25ldF9ob193aW5fcnhsZXZfYXZnX25laWdoX2NtZCwKKyAgICAgICJoYW5kb3ZlciB3aW5kb3cgcnhsZXYgbmVpZ2hib3IgYXZlcmFnaW5nIDwxLTEwPiIsCisJIkhvdyBtYW55IFJ4UXVhbCBtZWFzdXJlbWVudHMgYXJlIHVzZWQgZm9yIGF2ZXJhZ2luZyIpCit7CisJZ3NtbmV0LT5oYW5kb3Zlci53aW5fcnhsZXZfYXZnX25laWdoID0gYXRvaShhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfaG9fcHdyX2ludGVydmFsLCBjZmdfbmV0X2hvX3B3cl9pbnRlcnZhbF9jbWQsCisgICAgICAiaGFuZG92ZXIgcG93ZXIgYnVkZ2V0IGludGVydmFsIDwxLTk5PiIsCisJIkhvdyBvZnRlbiB0byBjaGVjayBpZiB3ZSBoYXZlIGEgYmV0dGVyIGNlbGwgKFNBQ0NIIGZyYW1lcykiKQoreworCWdzbW5ldC0+aGFuZG92ZXIucHdyX2ludGVydmFsID0gYXRvaShhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfaG9fcHdyX2h5c3RlcmVzaXMsIGNmZ19uZXRfaG9fcHdyX2h5c3RlcmVzaXNfY21kLAorICAgICAgImhhbmRvdmVyIHBvd2VyIGJ1ZGdldCBoeXN0ZXJlc2lzIDwwLTk5OT4iLAorCSJIb3cgbWFueSBkQiBkb2VzIGEgbmVpZ2hib3IgdG8gYmUgc3Ryb25nZXIgdG8gYmVjb21lIGEgSE8gY2FuZGlkYXRlIikKK3sKKwlnc21uZXQtPmhhbmRvdmVyLnB3cl9oeXN0ZXJlc2lzID0gYXRvaShhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfaG9fbWF4X2Rpc3RhbmNlLCBjZmdfbmV0X2hvX21heF9kaXN0YW5jZV9jbWQsCisgICAgICAiaGFuZG92ZXIgbWF4aW11bSBkaXN0YW5jZSA8MC05OTk5PiIsCisJIkhvdyBiaWcgaXMgdGhlIG1heGltdW0gdGltaW5nIGFkdmFuY2UgYmVmb3JlIEhPIGlzIGZvcmNlZCIpCit7CisJZ3NtbmV0LT5oYW5kb3Zlci5tYXhfZGlzdGFuY2UgPSBhdG9pKGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworI2RlZmluZSBERUNMQVJFX1RJTUVSKG51bWJlciwgZG9jKSBcCisgICAgREVGVU4oY2ZnX25ldF9UIyNudW1iZXIsCQkJCQlcCisgICAgICBjZmdfbmV0X1QjI251bWJlciMjX2NtZCwJCQkJCVwKKyAgICAgICJ0aW1lciB0IiAjbnVtYmVyICAiIDwwLTY1NTM1PiIsCQkJCVwKKyAgICAgIGRvYykJCQkJCQkJXAorewkJCQkJCQkJXAorCWludCB2YWx1ZSA9IGF0b2koYXJndlswXSk7CQkJCVwKKwkJCQkJCQkJXAorCWlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiA2NTUzNSkgewkJCVwKKwkJdnR5X291dCh2dHksICJUaW1lciB2YWx1ZSAlcyBvdXQgb2YgcmFuZ2UuJXMiLAlcCisJCSAgICAgICAgYXJndlswXSwgVlRZX05FV0xJTkUpOwkJCVwKKwkJcmV0dXJuIENNRF9XQVJOSU5HOwkJCQlcCisJfQkJCQkJCQlcCisJCQkJCQkJCVwKKwlnc21uZXQtPlQjI251bWJlciA9IHZhbHVlOwkJCQlcCisJcmV0dXJuIENNRF9TVUNDRVNTOwkJCQkJXAorfQorCitERUNMQVJFX1RJTUVSKDMxMDEsICJTZXQgdGhlIHRpbWVvdXQgdmFsdWUgZm9yIElNTUVESUFURSBBU1NJR05NRU5ULiIpCitERUNMQVJFX1RJTUVSKDMxMDMsICJTZXQgdGhlIHRpbWVvdXQgdmFsdWUgZm9yIEhBTkRPVkVSLiIpCitERUNMQVJFX1RJTUVSKDMxMDUsICJDdXJyZW50bHkgbm90IHVzZWQuIikKK0RFQ0xBUkVfVElNRVIoMzEwNywgIkN1cnJlbnRseSBub3QgdXNlZC4iKQorREVDTEFSRV9USU1FUigzMTA5LCAiQ3VycmVudGx5IG5vdCB1c2VkLiIpCitERUNMQVJFX1RJTUVSKDMxMTEsICJDdXJyZW50bHkgbm90IHVzZWQuIikKK0RFQ0xBUkVfVElNRVIoMzExMywgIlNldCB0aGUgdGltZSB0byB0cnkgcGFnaW5nIGEgc3Vic2NyaWJlci4iKQorREVDTEFSRV9USU1FUigzMTE1LCAiQ3VycmVudGx5IG5vdCB1c2VkLiIpCitERUNMQVJFX1RJTUVSKDMxMTcsICJDdXJyZW50bHkgbm90IHVzZWQuIikKK0RFQ0xBUkVfVElNRVIoMzExOSwgIkN1cnJlbnRseSBub3QgdXNlZC4iKQorREVDTEFSRV9USU1FUigzMTQxLCAiQ3VycmVudGx5IG5vdCB1c2VkLiIpCisKKworLyogcGVyLUJUUyBjb25maWd1cmF0aW9uICovCitERUZVTihjZmdfYnRzLAorICAgICAgY2ZnX2J0c19jbWQsCisgICAgICAiYnRzIEJUU19OUiIsCisgICAgICAiU2VsZWN0IGEgQlRTIHRvIGNvbmZpZ3VyZVxuIikKK3sKKwlpbnQgYnRzX25yID0gYXRvaShhcmd2WzBdKTsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCisJaWYgKGJ0c19uciA+IGdzbW5ldC0+bnVtX2J0cykgeworCQl2dHlfb3V0KHZ0eSwgIiUlIFRoZSBuZXh0IHVudXNlZCBCVFMgbnVtYmVyIGlzICV1JXMiLAorCQkJZ3NtbmV0LT5udW1fYnRzLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9IGVsc2UgaWYgKGJ0c19uciA9PSBnc21uZXQtPm51bV9idHMpIHsKKwkJLyogYWxsb2NhdGUgYSBuZXcgb25lICovCisJCWJ0cyA9IGdzbV9idHNfYWxsb2MoZ3NtbmV0LCBHU01fQlRTX1RZUEVfVU5LTk9XTiwKKwkJCQkgICAgSEFSRENPREVEX1RTQywgSEFSRENPREVEX0JTSUMpOworCX0gZWxzZQorCQlidHMgPSBnc21fYnRzX251bShnc21uZXQsIGJ0c19ucik7CisKKwlpZiAoIWJ0cykgeworCQl2dHlfb3V0KHZ0eSwgIiUlIFVuYWJsZSB0byBhbGxvY2F0ZSBCVFMgJXUlcyIsCisJCQlnc21uZXQtPm51bV9idHMsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCXZ0eS0+aW5kZXggPSBidHM7CisJdnR5LT5ub2RlID0gQlRTX05PREU7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfdHlwZSwKKyAgICAgIGNmZ19idHNfdHlwZV9jbWQsCisgICAgICAidHlwZSBUWVBFIiwKKyAgICAgICJTZXQgdGhlIEJUUyB0eXBlXG4iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWludCByYzsKKworCXJjID0gZ3NtX3NldF9idHNfdHlwZShidHMsIHBhcnNlX2J0c3R5cGUoYXJndlswXSkpOworCWlmIChyYyA8IDApCisJCXJldHVybiBDTURfV0FSTklORzsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19iYW5kLAorICAgICAgY2ZnX2J0c19iYW5kX2NtZCwKKyAgICAgICJiYW5kIEJBTkQiLAorICAgICAgIlNldCB0aGUgZnJlcXVlbmN5IGJhbmQgb2YgdGhpcyBCVFNcbiIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJaW50IGJhbmQgPSBnc21fYmFuZF9wYXJzZShhcmd2WzBdKTsKKworCWlmIChiYW5kIDwgMCkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIEJBTkQgJWQgaXMgbm90IGEgdmFsaWQgR1NNIGJhbmQlcyIsCisJCQliYW5kLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlidHMtPmJhbmQgPSBiYW5kOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX2NpLAorICAgICAgY2ZnX2J0c19jaV9jbWQsCisgICAgICAiY2VsbF9pZGVudGl0eSA8MC02NTUzNT4iLAorICAgICAgIlNldCB0aGUgQ2VsbCBpZGVudGl0eSBvZiB0aGlzIEJUU1xuIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgY2kgPSBhdG9pKGFyZ3ZbMF0pOworCisJaWYgKGNpIDwgMCB8fCBjaSA+IDB4ZmZmZikgeworCQl2dHlfb3V0KHZ0eSwgIiUlIENJICVkIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2UgKDAtNjU1MzUpJXMiLAorCQkJY2ksIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKwlidHMtPmNlbGxfaWRlbnRpdHkgPSBjaTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19sYWMsCisgICAgICBjZmdfYnRzX2xhY19jbWQsCisgICAgICAibG9jYXRpb25fYXJlYV9jb2RlIDwwLTY1NTM1PiIsCisgICAgICAiU2V0IHRoZSBMb2NhdGlvbiBBcmVhIENvZGUgKExBQykgb2YgdGhpcyBCVFNcbiIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJaW50IGxhYyA9IGF0b2koYXJndlswXSk7CisKKwlpZiAobGFjIDwgMCB8fCBsYWMgPiAweGZmZmYpIHsKKwkJdnR5X291dCh2dHksICIlJSBMQUMgJWQgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSAoMC02NTUzNSklcyIsCisJCQlsYWMsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWlmIChsYWMgPT0gR1NNX0xBQ19SRVNFUlZFRF9ERVRBQ0hFRCB8fCBsYWMgPT0gR1NNX0xBQ19SRVNFUlZFRF9BTExfQlRTKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgTEFDICVkIGlzIHJlc2VydmVkIGJ5IEdTTSAwNC4wOCVzIiwKKwkJCWxhYywgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5sb2NhdGlvbl9hcmVhX2NvZGUgPSBsYWM7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKworREVGVU4oY2ZnX2J0c190c2MsCisgICAgICBjZmdfYnRzX3RzY19jbWQsCisgICAgICAidHJhaW5pbmdfc2VxdWVuY2VfY29kZSA8MC0yNTU+IiwKKyAgICAgICJTZXQgdGhlIFRyYWluaW5nIFNlcXVlbmNlIENvZGUgKFRTQykgb2YgdGhpcyBCVFNcbiIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJaW50IHRzYyA9IGF0b2koYXJndlswXSk7CisKKwlpZiAodHNjIDwgMCB8fCB0c2MgPiAweGZmKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgVFNDICVkIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2UgKDAtMjU1KSVzIiwKKwkJCXRzYywgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCWJ0cy0+dHNjID0gdHNjOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX2JzaWMsCisgICAgICBjZmdfYnRzX2JzaWNfY21kLAorICAgICAgImJhc2Vfc3RhdGlvbl9pZF9jb2RlIDwwLTYzPiIsCisgICAgICAiU2V0IHRoZSBCYXNlIFN0YXRpb24gSWRlbnRpdHkgQ29kZSAoQlNJQykgb2YgdGhpcyBCVFNcbiIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJaW50IGJzaWMgPSBhdG9pKGFyZ3ZbMF0pOworCisJaWYgKGJzaWMgPCAwIHx8IGJzaWMgPiAweDNmKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgQlNJQyAlZCBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlICgwLTI1NSklcyIsCisJCQlic2ljLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisJYnRzLT5ic2ljID0gYnNpYzsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworCitERUZVTihjZmdfYnRzX3VuaXRfaWQsCisgICAgICBjZmdfYnRzX3VuaXRfaWRfY21kLAorICAgICAgImlwLmFjY2VzcyB1bml0X2lkIDwwLTY1NTM0PiA8MC0yNTU+IiwKKyAgICAgICJTZXQgdGhlIGlwLmFjY2VzcyBCVFMgVW5pdCBJRCBvZiB0aGlzIEJUU1xuIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgc2l0ZV9pZCA9IGF0b2koYXJndlswXSk7CisJaW50IGJ0c19pZCA9IGF0b2koYXJndlsxXSk7CisKKwlpZiAoIWlzX2lwYWNjZXNzX2J0cyhidHMpKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgQlRTIGlzIG5vdCBvZiBpcC5hY2Nlc3MgdHlwZSVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5pcF9hY2Nlc3Muc2l0ZV9pZCA9IHNpdGVfaWQ7CisJYnRzLT5pcF9hY2Nlc3MuYnRzX2lkID0gYnRzX2lkOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX3N0cmVhbV9pZCwKKyAgICAgIGNmZ19idHNfc3RyZWFtX2lkX2NtZCwKKyAgICAgICJvbWwgaXAuYWNjZXNzIHN0cmVhbV9pZCA8MC0yNTU+IiwKKyAgICAgICJTZXQgdGhlIGlwLmFjY2VzcyBTdHJlYW0gSUQgb2YgdGhlIE9NTCBsaW5rIG9mIHRoaXMgQlRTXG4iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWludCBzdHJlYW1faWQgPSBhdG9pKGFyZ3ZbMF0pOworCisJaWYgKCFpc19pcGFjY2Vzc19idHMoYnRzKSkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIEJUUyBpcyBub3Qgb2YgaXAuYWNjZXNzIHR5cGUlcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWJ0cy0+b21sX3RlaSA9IHN0cmVhbV9pZDsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworCitERUZVTihjZmdfYnRzX29tbF9lMSwKKyAgICAgIGNmZ19idHNfb21sX2UxX2NtZCwKKyAgICAgICJvbWwgZTEgbGluZSBFMV9MSU5FIHRpbWVzbG90IDwxLTMxPiBzdWItc2xvdCAoMHwxfDJ8M3xmdWxsKSIsCisgICAgICAiRTEgaW50ZXJmYWNlIHRvIGJlIHVzZWQgZm9yIE9NTFxuIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKworCXBhcnNlX2UxX2xpbmsoJmJ0cy0+b21sX2UxX2xpbmssIGFyZ3ZbMF0sIGFyZ3ZbMV0sIGFyZ3ZbMl0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisKK0RFRlVOKGNmZ19idHNfb21sX2UxX3RlaSwKKyAgICAgIGNmZ19idHNfb21sX2UxX3RlaV9jbWQsCisgICAgICAib21sIGUxIHRlaSA8MC02Mz4iLAorICAgICAgIlNldCB0aGUgVEVJIHRvIGJlIHVzZWQgZm9yIE9NTCIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlidHMtPm9tbF90ZWkgPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX2NoYWxsb2MsIGNmZ19idHNfY2hhbGxvY19jbWQsCisgICAgICAiY2hhbm5lbCBhbGxvY2F0b3IgKGFzY2VuZGluZ3xkZXNjZW5kaW5nKSIsCisgICAgICAiU2hvdWxkIHRoZSBjaGFubmVsIGFsbG9jYXRvciBhbGxvY2F0ZSBpbiByZXZlcnNlIFRSWCBvcmRlcj8iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCisJaWYgKCFzdHJjbXAoYXJndlswXSwgImFzY2VuZGluZyIpKQorCQlidHMtPmNoYW5fYWxsb2NfcmV2ZXJzZSA9IDA7CisJZWxzZQorCQlidHMtPmNoYW5fYWxsb2NfcmV2ZXJzZSA9IDE7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfcmFjaF90eF9pbnRlZ2VyLAorICAgICAgY2ZnX2J0c19yYWNoX3R4X2ludGVnZXJfY21kLAorICAgICAgInJhY2ggdHggaW50ZWdlciA8MC0xNT4iLAorICAgICAgIlNldCB0aGUgcmF3IHR4IGludGVnZXIgdmFsdWUgaW4gUkFDSCBDb250cm9sIHBhcmFtZXRlcnMgSUUiKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbC50eF9pbnRlZ2VyID0gYXRvaShhcmd2WzBdKSAmIDB4ZjsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfcmFjaF9tYXhfdHJhbnMsCisgICAgICBjZmdfYnRzX3JhY2hfbWF4X3RyYW5zX2NtZCwKKyAgICAgICJyYWNoIG1heCB0cmFuc21pc3Npb24gKDF8Mnw0fDcpIiwKKyAgICAgICJTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIFJBQ0ggYnVyc3QgdHJhbnNtaXNzaW9ucyIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLm1heF90cmFucyA9IHJhY2hfbWF4X3RyYW5zX3ZhbDJyYXcoYXRvaShhcmd2WzBdKSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX3JhY2hfbm1fYl90aHJlc2gsCisgICAgICBjZmdfYnRzX3JhY2hfbm1fYl90aHJlc2hfY21kLAorICAgICAgInJhY2ggbm0gYnVzeSB0aHJlc2hvbGQgPDAtMjU1PiIsCisgICAgICAiU2V0IHRoZSBOTSBCdXN5IFRocmVzaG9sZCBpbiBEQiIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJYnRzLT5yYWNoX2JfdGhyZXNoID0gYXRvaShhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfcmFjaF9ubV9sZGF2ZywKKyAgICAgIGNmZ19idHNfcmFjaF9ubV9sZGF2Z19jbWQsCisgICAgICAicmFjaCBubSBsb2FkIGF2ZXJhZ2UgPDAtNjU1MzU+IiwKKyAgICAgICJTZXQgdGhlIE5NIExvYWRhdmVyIFNsb3RzIHZhbHVlIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlidHMtPnJhY2hfbGRhdmdfc2xvdHMgPSBhdG9pKGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19jZWxsX2JhcnJlZCwgY2ZnX2J0c19jZWxsX2JhcnJlZF9jbWQsCisgICAgICAiY2VsbCBiYXJyZWQgKDB8MSkiLAorICAgICAgIlNob3VsZCB0aGlzIGNlbGwgYmUgYmFycmVkIGZyb20gYWNjZXNzPyIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wuY2VsbF9iYXIgPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX21zX21heF9wb3dlciwgY2ZnX2J0c19tc19tYXhfcG93ZXJfY21kLAorICAgICAgIm1zIG1heCBwb3dlciA8MC00MD4iLAorICAgICAgIk1heGltdW0gdHJhbnNtaXQgcG93ZXIgb2YgdGhlIE1TIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKworCWJ0cy0+bXNfbWF4X3Bvd2VyID0gYXRvaShhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19jZWxsX3Jlc2VsX2h5c3QsIGNmZ19idHNfY2VsbF9yZXNlbF9oeXN0X2NtZCwKKyAgICAgICJjZWxsIHJlc2VsZWN0aW9uIGh5c3RlcmVzaXMgPDAtMTQ+IiwKKyAgICAgICJDZWxsIFJlLVNlbGVjdGlvbiBIeXN0ZXJlc2lzIGluIGRCIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKworCWJ0cy0+c2lfY29tbW9uLmNlbGxfc2VsX3Bhci5jZWxsX3Jlc2VsX2h5c3QgPSBhdG9pKGFyZ3ZbMF0pLzI7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfcnhsZXZfYWNjX21pbiwgY2ZnX2J0c19yeGxldl9hY2NfbWluX2NtZCwKKyAgICAgICJyeGxldiBhY2Nlc3MgbWluIDwwLTYzPiIsCisgICAgICAiTWluaW11bSBSeExldiBuZWVkZWQgZm9yIGNlbGwgYWNjZXNzIChiZXR0ZXIgdGhhbiAtMTEwZEJtKSIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIucnhsZXZfYWNjX21pbiA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfcGVyX2xvY191cGQsIGNmZ19idHNfcGVyX2xvY191cGRfY21kLAorICAgICAgInBlcmlvZGljIGxvY2F0aW9uIHVwZGF0ZSA8MC0xNTMwPiIsCisgICAgICAiUGVyaW9kaWMgTG9jYXRpb24gVXBkYXRpbmcgSW50ZXJ2YWwgaW4gTWludXRlcyIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlidHMtPnNpX2NvbW1vbi5jaGFuX2Rlc2MudDMyMTIgPSBhdG9pKGFyZ3ZbMF0pIC8gMTA7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfcHJzX2J2Y2ksIGNmZ19idHNfZ3Byc19idmNpX2NtZCwKKwkiZ3BycyBjZWxsIGJ2Y2kgPDItNjU1MzU+IiwKKwkiR1BSUyBCU1NHUCBWQyBJZGVudGlmaWVyIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKworCWlmIChidHMtPmdwcnMubW9kZSA9PSBCVFNfR1BSU19OT05FKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgR1BSUyBub3QgZW5hYmxlZCBvbiB0aGlzIEJUUyVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5ncHJzLmNlbGwuYnZjaSA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfZ3Byc19uc2VpLCBjZmdfYnRzX2dwcnNfbnNlaV9jbWQsCisJImdwcnMgbnNlaSA8MC02NTUzNT4iLAorCSJHUFJTIE5TIEVudGl0eSBJZGVudGlmaWVyIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKworCWlmIChidHMtPmdwcnMubW9kZSA9PSBCVFNfR1BSU19OT05FKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgR1BSUyBub3QgZW5hYmxlZCBvbiB0aGlzIEJUUyVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5ncHJzLm5zZS5uc2VpID0gYXRvaShhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworCitERUZVTihjZmdfYnRzX2dwcnNfbnN2Y2ksIGNmZ19idHNfZ3Byc19uc3ZjaV9jbWQsCisJImdwcnMgbnN2YyA8MC0xPiBuc3ZjaSA8MC02NTUzNT4iLAorCSJHUFJTIE5TIFZDIElkZW50aWZpZXIiKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWludCBpZHggPSBhdG9pKGFyZ3ZbMF0pOworCisJaWYgKGJ0cy0+Z3Bycy5tb2RlID09IEJUU19HUFJTX05PTkUpIHsKKwkJdnR5X291dCh2dHksICIlJSBHUFJTIG5vdCBlbmFibGVkIG9uIHRoaXMgQlRTJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlidHMtPmdwcnMubnN2Y1tpZHhdLm5zdmNpID0gYXRvaShhcmd2WzFdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19ncHJzX25zdmNfbHBvcnQsIGNmZ19idHNfZ3Byc19uc3ZjX2xwb3J0X2NtZCwKKwkiZ3BycyBuc3ZjIDwwLTE+IGxvY2FsIHVkcCBwb3J0IDwwLTY1NTM1PiIsCisJIkdQUlMgTlMgTG9jYWwgVURQIFBvcnQiKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWludCBpZHggPSBhdG9pKGFyZ3ZbMF0pOworCisJaWYgKGJ0cy0+Z3Bycy5tb2RlID09IEJUU19HUFJTX05PTkUpIHsKKwkJdnR5X291dCh2dHksICIlJSBHUFJTIG5vdCBlbmFibGVkIG9uIHRoaXMgQlRTJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlidHMtPmdwcnMubnN2Y1tpZHhdLmxvY2FsX3BvcnQgPSBhdG9pKGFyZ3ZbMV0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX2dwcnNfbnN2Y19ycG9ydCwgY2ZnX2J0c19ncHJzX25zdmNfcnBvcnRfY21kLAorCSJncHJzIG5zdmMgPDAtMT4gcmVtb3RlIHVkcCBwb3J0IDwwLTY1NTM1PiIsCisJIkdQUlMgTlMgUmVtb3RlIFVEUCBQb3J0IikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgaWR4ID0gYXRvaShhcmd2WzBdKTsKKworCWlmIChidHMtPmdwcnMubW9kZSA9PSBCVFNfR1BSU19OT05FKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgR1BSUyBub3QgZW5hYmxlZCBvbiB0aGlzIEJUUyVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5ncHJzLm5zdmNbaWR4XS5yZW1vdGVfcG9ydCA9IGF0b2koYXJndlsxXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfZ3Byc19uc3ZjX3JpcCwgY2ZnX2J0c19ncHJzX25zdmNfcmlwX2NtZCwKKwkiZ3BycyBuc3ZjIDwwLTE+IHJlbW90ZSBpcCBBLkIuQy5EIiwKKwkiR1BSUyBOUyBSZW1vdGUgSVAgQWRkcmVzcyIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJaW50IGlkeCA9IGF0b2koYXJndlswXSk7CisJc3RydWN0IGluX2FkZHIgaWE7CisKKwlpZiAoYnRzLT5ncHJzLm1vZGUgPT0gQlRTX0dQUlNfTk9ORSkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIEdQUlMgbm90IGVuYWJsZWQgb24gdGhpcyBCVFMlcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWluZXRfYXRvbihhcmd2WzFdLCAmaWEpOworCWJ0cy0+Z3Bycy5uc3ZjW2lkeF0ucmVtb3RlX2lwID0gbnRvaGwoaWEuc19hZGRyKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19ncHJzX3JhYywgY2ZnX2J0c19ncHJzX3JhY19jbWQsCisJImdwcnMgcm91dGluZyBhcmVhIDwwLTI1NT4iLAorCSJHUFJTIFJvdXRpbmcgQXJlYSBDb2RlIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKworCWlmIChidHMtPmdwcnMubW9kZSA9PSBCVFNfR1BSU19OT05FKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgR1BSUyBub3QgZW5hYmxlZCBvbiB0aGlzIEJUUyVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5ncHJzLnJhYyA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfZ3Byc19tb2RlLCBjZmdfYnRzX2dwcnNfbW9kZV9jbWQsCisJImdwcnMgbW9kZSAobm9uZXxncHJzfGVncHJzKSIsCisJIkdQUlMgTW9kZSBmb3IgdGhpcyBCVFMiKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCisJYnRzLT5ncHJzLm1vZGUgPSBidHNfZ3Byc19tb2RlX3BhcnNlKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisKKy8qIHBlciBUUlggY29uZmlndXJhdGlvbiAqLworREVGVU4oY2ZnX3RyeCwKKyAgICAgIGNmZ190cnhfY21kLAorICAgICAgInRyeCBUUlhfTlIiLAorICAgICAgIlNlbGVjdCBhIFRSWCB0byBjb25maWd1cmUiKQoreworCWludCB0cnhfbnIgPSBhdG9pKGFyZ3ZbMF0pOworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCisJaWYgKHRyeF9uciA+IGJ0cy0+bnVtX3RyeCkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIFRoZSBuZXh0IHVudXNlZCBUUlggbnVtYmVyIGluIHRoaXMgQlRTIGlzICV1JXMiLAorCQkJYnRzLT5udW1fdHJ4LCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9IGVsc2UgaWYgKHRyeF9uciA9PSBidHMtPm51bV90cngpIHsKKwkJLyogd2UgbmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBvbmUgKi8KKwkJdHJ4ID0gZ3NtX2J0c190cnhfYWxsb2MoYnRzKTsKKwl9IGVsc2UKKwkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgdHJ4X25yKTsKKworCWlmICghdHJ4KQorCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisKKwl2dHktPmluZGV4ID0gdHJ4OworCXZ0eS0+bm9kZSA9IFRSWF9OT0RFOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfdHJ4X2FyZmNuLAorICAgICAgY2ZnX3RyeF9hcmZjbl9jbWQsCisgICAgICAiYXJmY24gPDEtMTAyND4iLAorICAgICAgIlNldCB0aGUgQVJGQ04gZm9yIHRoaXMgVFJYXG4iKQoreworCWludCBhcmZjbiA9IGF0b2koYXJndlswXSk7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSB2dHktPmluZGV4OworCisJLyogRklYTUU6IGNoZWNrIGlmIHRoaXMgQVJGQ04gaXMgc3VwcG9ydGVkIGJ5IHRoaXMgVFJYICovCisKKwl0cngtPmFyZmNuID0gYXJmY247CisKKwkvKiBGSVhNRTogcGF0Y2ggQVJGQ04gaW50byBTWVNURU0gSU5GT1JNQVRJT04gKi8KKwkvKiBGSVhNRTogdXNlIE9NTCBsYXllciB0byB1cGRhdGUgdGhlIEFSRkNOICovCisJLyogRklYTUU6IHVzZSBSU0wgbGF5ZXIgdG8gdXBkYXRlIFNZU1RFTSBJTkZPUk1BVElPTiAqLworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfdHJ4X25vbWluYWxfcG93ZXIsCisgICAgICBjZmdfdHJ4X25vbWluYWxfcG93ZXJfY21kLAorICAgICAgIm5vbWluYWwgcG93ZXIgPDAtMTAwPiIsCisgICAgICAiTm9taW5hbCBUUlggUkYgUG93ZXIgaW4gZEJcbiIpCit7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSB2dHktPmluZGV4OworCisJdHJ4LT5ub21pbmFsX3Bvd2VyID0gYXRvaShhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX3RyeF9tYXhfcG93ZXJfcmVkLAorICAgICAgY2ZnX3RyeF9tYXhfcG93ZXJfcmVkX2NtZCwKKyAgICAgICJtYXhfcG93ZXJfcmVkIDwwLTEwMD4iLAorICAgICAgIlJlZHVjdGlvbiBvZiBtYXhpbXVtIEJTIFJGIFBvd2VyIGluIGRCXG4iKQoreworCWludCBtYXhwd3JfciA9IGF0b2koYXJndlswXSk7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSB2dHktPmluZGV4OworCWludCB1cHBlcl9saW1pdCA9IDI0OwkvKiBkZWZhdWx0IDEyLjIxIG1heCBwb3dlciByZWQuICovCisKKwkvKiBGSVhNRTogY2hlY2sgaWYgb3VyIEJUUyB0eXBlIHN1cHBvcnRzIG1vcmUgdGhhbiAxMiAqLworCWlmIChtYXhwd3JfciA8IDAgfHwgbWF4cHdyX3IgPiB1cHBlcl9saW1pdCkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIFBvd2VyICVkIGRCIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2UlcyIsCisJCQltYXhwd3JfciwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCWlmIChtYXhwd3JfciAmIDEpIHsKKwkJdnR5X291dCh2dHksICIlJSBQb3dlciAlZCBkQiBpcyBub3QgYW4gZXZlbiB2YWx1ZSVzIiwKKwkJCW1heHB3cl9yLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwl0cngtPm1heF9wb3dlcl9yZWQgPSBtYXhwd3JfcjsKKworCS8qIEZJWE1FOiBtYWtlIHN1cmUgd2UgdXBkYXRlIHRoaXMgdXNpbmcgT01MICovCisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ190cnhfcnNsX2UxLAorICAgICAgY2ZnX3RyeF9yc2xfZTFfY21kLAorICAgICAgInJzbCBlMSBsaW5lIEUxX0xJTkUgdGltZXNsb3QgPDEtMzE+IHN1Yi1zbG90ICgwfDF8MnwzfGZ1bGwpIiwKKyAgICAgICJFMSBpbnRlcmZhY2UgdG8gYmUgdXNlZCBmb3IgUlNMXG4iKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdnR5LT5pbmRleDsKKworCXBhcnNlX2UxX2xpbmsoJnRyeC0+cnNsX2UxX2xpbmssIGFyZ3ZbMF0sIGFyZ3ZbMV0sIGFyZ3ZbMl0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfdHJ4X3JzbF9lMV90ZWksCisgICAgICBjZmdfdHJ4X3JzbF9lMV90ZWlfY21kLAorICAgICAgInJzbCBlMSB0ZWkgPDAtNjM+IiwKKyAgICAgICJTZXQgdGhlIFRFSSB0byBiZSB1c2VkIGZvciBSU0wiKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdnR5LT5pbmRleDsKKworCXRyeC0+cnNsX3RlaSA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ190cnhfcmZfbG9ja2VkLAorICAgICAgY2ZnX3RyeF9yZl9sb2NrZWRfY21kLAorICAgICAgInJmX2xvY2tlZCAoMHwxKSIsCisgICAgICAiVHVybiBvZmYgUkYgb2YgdGhlIFRSWC5cbiIpCit7CisJaW50IGxvY2tlZCA9IGF0b2koYXJndlswXSk7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSB2dHktPmluZGV4OworCisJZ3NtX3RyeF9sb2NrX3JmKHRyeCwgbG9ja2VkKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIHBlciBUUyBjb25maWd1cmF0aW9uICovCitERUZVTihjZmdfdHMsCisgICAgICBjZmdfdHNfY21kLAorICAgICAgInRpbWVzbG90IDwwLTc+IiwKKyAgICAgICJTZWxlY3QgYSBUaW1lc2xvdCB0byBjb25maWd1cmUiKQoreworCWludCB0c19uciA9IGF0b2koYXJndlswXSk7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSB2dHktPmluZGV4OworCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHM7CisKKwlpZiAodHNfbnIgPj0gVFJYX05SX1RTKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgQSBHU00gVFJYIG9ubHkgaGFzICV1IFRpbWVzbG90cyBwZXIgVFJYJXMiLAorCQkJVFJYX05SX1RTLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwl0cyA9ICZ0cngtPnRzW3RzX25yXTsKKworCXZ0eS0+aW5kZXggPSB0czsKKwl2dHktPm5vZGUgPSBUU19OT0RFOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfdHNfcGNoYW4sCisgICAgICBjZmdfdHNfcGNoYW5fY21kLAorICAgICAgInBoeXNfY2hhbl9jb25maWcgUENIQU4iLAorICAgICAgIlBoeXNpY2FsIENoYW5uZWwgY29uZmlndXJhdGlvbiAoVENIL1NEQ0NILy4uLikiKQoreworCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMgPSB2dHktPmluZGV4OworCWludCBwY2hhbmM7CisKKwlwY2hhbmMgPSBnc21fcGNoYW5fcGFyc2UoYXJndlswXSk7CisJaWYgKHBjaGFuYyA8IDApCisJCXJldHVybiBDTURfV0FSTklORzsKKworCXRzLT5wY2hhbiA9IHBjaGFuYzsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX3RzX2UxX3N1YnNsb3QsCisgICAgICBjZmdfdHNfZTFfc3Vic2xvdF9jbWQsCisgICAgICAiZTEgbGluZSBFMV9MSU5FIHRpbWVzbG90IDwxLTMxPiBzdWItc2xvdCAoMHwxfDJ8M3xmdWxsKSIsCisgICAgICAiRTEgc3ViLXNsb3QgY29ubmVjdGVkIHRvIHRoaXMgb24tYWlyIHRpbWVzbG90IikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzID0gdnR5LT5pbmRleDsKKworCXBhcnNlX2UxX2xpbmsoJnRzLT5lMV9saW5rLCBhcmd2WzBdLCBhcmd2WzFdLCBhcmd2WzJdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworZXh0ZXJuIGludCBic2NfdnR5X2luaXRfZXh0cmEoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpOworCitpbnQgYnNjX3Z0eV9pbml0KHN0cnVjdCBnc21fbmV0d29yayAqbmV0KQoreworCWdzbW5ldCA9IG5ldDsKKworCWNtZF9pbml0KDEpOworCXZ0eV9pbml0KCk7CisKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc2hvd19uZXRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc2hvd19idHNfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc2hvd190cnhfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc2hvd190c19jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X2xjaGFuX2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc2hvd19lMWRydl9jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X2UxbGluZV9jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X2UxdHNfY21kKTsKKworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X3BhZ2luZ19jbWQpOworCisJb3BlbmJzY192dHlfYWRkX2NtZHMoKTsKKworCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJmNmZ19uZXRfY21kKTsKKwlpbnN0YWxsX25vZGUoJm5ldF9ub2RlLCBjb25maWdfd3JpdGVfbmV0KTsKKwlpbnN0YWxsX2RlZmF1bHQoR1NNTkVUX05PREUpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfbmNjX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9tbmNfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X25hbWVfc2hvcnRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X25hbWVfbG9uZ19jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfYXV0aF9wb2xpY3lfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X3JlamVjdF9jYXVzZV9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfZW5jcnlwdGlvbl9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfbmVjaV9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfcnJscF9tb2RlX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9tbV9pbmZvX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9oYW5kb3Zlcl9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfaG9fd2luX3J4bGV2X2F2Z19jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfaG9fd2luX3J4cXVhbF9hdmdfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X2hvX3dpbl9yeGxldl9hdmdfbmVpZ2hfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X2hvX3B3cl9pbnRlcnZhbF9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfaG9fcHdyX2h5c3RlcmVzaXNfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X2hvX21heF9kaXN0YW5jZV9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfVDMxMDFfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X1QzMTAzX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9UMzEwNV9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfVDMxMDdfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X1QzMTA5X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9UMzExMV9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfVDMxMTNfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X1QzMTE1X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9UMzExN19jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfVDMxMTlfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X1QzMTQxX2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfYnRzX2NtZCk7CisJaW5zdGFsbF9ub2RlKCZidHNfbm9kZSwgY29uZmlnX3dyaXRlX2J0cyk7CisJaW5zdGFsbF9kZWZhdWx0KEJUU19OT0RFKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX3R5cGVfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2JhbmRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2NpX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19sYWNfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX3RzY19jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfYnNpY19jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfdW5pdF9pZF9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfc3RyZWFtX2lkX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19vbWxfZTFfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX29tbF9lMV90ZWlfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2NoYWxsb2NfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX3JhY2hfdHhfaW50ZWdlcl9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfcmFjaF9tYXhfdHJhbnNfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX3JhY2hfbm1fYl90aHJlc2hfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX3JhY2hfbm1fbGRhdmdfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2NlbGxfYmFycmVkX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19tc19tYXhfcG93ZXJfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX3Blcl9sb2NfdXBkX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19jZWxsX3Jlc2VsX2h5c3RfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX3J4bGV2X2FjY19taW5fY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2dwcnNfbW9kZV9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfZ3Byc19yYWNfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2dwcnNfYnZjaV9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfZ3Byc19uc2VpX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19ncHJzX25zdmNpX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19ncHJzX25zdmNfbHBvcnRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2dwcnNfbnN2Y19ycG9ydF9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfZ3Byc19uc3ZjX3JpcF9jbWQpOworCisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX3RyeF9jbWQpOworCWluc3RhbGxfbm9kZSgmdHJ4X25vZGUsIGR1bW15X2NvbmZpZ193cml0ZSk7CisJaW5zdGFsbF9kZWZhdWx0KFRSWF9OT0RFKTsKKwlpbnN0YWxsX2VsZW1lbnQoVFJYX05PREUsICZjZmdfdHJ4X2FyZmNuX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFRSWF9OT0RFLCAmY2ZnX3RyeF9ub21pbmFsX3Bvd2VyX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFRSWF9OT0RFLCAmY2ZnX3RyeF9tYXhfcG93ZXJfcmVkX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFRSWF9OT0RFLCAmY2ZnX3RyeF9yc2xfZTFfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVFJYX05PREUsICZjZmdfdHJ4X3JzbF9lMV90ZWlfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVFJYX05PREUsICZjZmdfdHJ4X3JmX2xvY2tlZF9jbWQpOworCisJaW5zdGFsbF9lbGVtZW50KFRSWF9OT0RFLCAmY2ZnX3RzX2NtZCk7CisJaW5zdGFsbF9ub2RlKCZ0c19ub2RlLCBkdW1teV9jb25maWdfd3JpdGUpOworCWluc3RhbGxfZGVmYXVsdChUU19OT0RFKTsKKwlpbnN0YWxsX2VsZW1lbnQoVFNfTk9ERSwgJmNmZ190c19wY2hhbl9jbWQpOworCWluc3RhbGxfZWxlbWVudChUU19OT0RFLCAmY2ZnX3RzX2UxX3N1YnNsb3RfY21kKTsKKworCWJzY192dHlfaW5pdF9leHRyYShuZXQpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy92dHlfaW50ZXJmYWNlX2NtZHMuYyBiL29wZW5ic2Mvc3JjL3Z0eV9pbnRlcmZhY2VfY21kcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmY2Q2NTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy92dHlfaW50ZXJmYWNlX2NtZHMuYwpAQCAtMCwwICsxLDI2MCBAQAorLyogT3BlbkJTQyBsb2dnaW5nIGhlbHBlciBmb3IgdGhlIFZUWSAqLworLyogKEMpIDIwMDktMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDktMjAxMCBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlcgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxvcGVuYnNjL3Z0eS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdGVsbmV0X2ludGVyZmFjZS5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKKyNpbmNsdWRlIDx2dHkvY29tbWFuZC5oPgorI2luY2x1ZGUgPHZ0eS9idWZmZXIuaD4KKyNpbmNsdWRlIDx2dHkvdnR5Lmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworc3RhdGljIHZvaWQgX3Z0eV9vdXRwdXQoc3RydWN0IGxvZ190YXJnZXQgKnRndCwgY29uc3QgY2hhciAqbGluZSkKK3sKKwlzdHJ1Y3QgdnR5ICp2dHkgPSB0Z3QtPnRndF92dHkudnR5OworCXZ0eV9vdXQodnR5LCAiJXMiLCBsaW5lKTsKKwkvKiBUaGlzIGlzIGFuIHVnbHkgaGFjaywgYnV0IHRoZXJlIGlzIG5vIGVhc3kgd2F5Li4uICovCisJaWYgKHN0cmNocihsaW5lLCAnXG4nKSkKKwkJdnR5X291dCh2dHksICJcciIpOworfQorCitzdHJ1Y3QgbG9nX3RhcmdldCAqbG9nX3RhcmdldF9jcmVhdGVfdnR5KHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlzdHJ1Y3QgbG9nX3RhcmdldCAqdGFyZ2V0OworCisJdGFyZ2V0ID0gbG9nX3RhcmdldF9jcmVhdGUoKTsKKwlpZiAoIXRhcmdldCkKKwkJcmV0dXJuIE5VTEw7CisKKwl0YXJnZXQtPnRndF92dHkudnR5ID0gdnR5OworCXRhcmdldC0+b3V0cHV0ID0gX3Z0eV9vdXRwdXQ7CisJcmV0dXJuIHRhcmdldDsKK30KKworREVGVU4oZW5hYmxlX2xvZ2dpbmcsCisgICAgICBlbmFibGVfbG9nZ2luZ19jbWQsCisgICAgICAibG9nZ2luZyBlbmFibGUiLAorICAgICAgIkVuYWJsZXMgbG9nZ2luZyB0byB0aGlzIHZ0eVxuIikKK3sKKwlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm47CisKKwljb25uID0gKHN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqKSB2dHktPnByaXY7CisJaWYgKGNvbm4tPmRiZykgeworCQl2dHlfb3V0KHZ0eSwgIkxvZ2dpbmcgYWxyZWFkeSBlbmFibGVkLiVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJY29ubi0+ZGJnID0gbG9nX3RhcmdldF9jcmVhdGVfdnR5KHZ0eSk7CisJaWYgKCFjb25uLT5kYmcpCisJCXJldHVybiBDTURfV0FSTklORzsKKworCWxvZ19hZGRfdGFyZ2V0KGNvbm4tPmRiZyk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihsb2dnaW5nX2ZsdHJfaW1zaSwKKyAgICAgIGxvZ2dpbmdfZmx0cl9pbXNpX2NtZCwKKyAgICAgICJsb2dnaW5nIGZpbHRlciBpbXNpIElNU0kiLAorICAgICAgIlByaW50IGFsbCBtZXNzYWdlcyByZWxhdGVkIHRvIGEgSU1TSVxuIikKK3sKKwlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm47CisKKwljb25uID0gKHN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqKSB2dHktPnByaXY7CisJaWYgKCFjb25uLT5kYmcpIHsKKwkJdnR5X291dCh2dHksICJMb2dnaW5nIHdhcyBub3QgZW5hYmxlZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWxvZ19zZXRfaW1zaV9maWx0ZXIoY29ubi0+ZGJnLCBhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGxvZ2dpbmdfZmx0cl9hbGwsCisgICAgICBsb2dnaW5nX2ZsdHJfYWxsX2NtZCwKKyAgICAgICJsb2dnaW5nIGZpbHRlciBhbGwgPDAtMT4iLAorICAgICAgIlByaW50IGFsbCBtZXNzYWdlcyB0byB0aGUgY29uc29sZVxuIikKK3sKKwlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm47CisKKwljb25uID0gKHN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqKSB2dHktPnByaXY7CisJaWYgKCFjb25uLT5kYmcpIHsKKwkJdnR5X291dCh2dHksICJMb2dnaW5nIHdhcyBub3QgZW5hYmxlZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWxvZ19zZXRfYWxsX2ZpbHRlcihjb25uLT5kYmcsIGF0b2koYXJndlswXSkpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obG9nZ2luZ191c2VfY2xyLAorICAgICAgbG9nZ2luZ191c2VfY2xyX2NtZCwKKyAgICAgICJsb2dnaW5nIGNvbG9yIDwwLTE+IiwKKyAgICAgICJVc2UgY29sb3IgZm9yIHByaW50aW5nIG1lc3NhZ2VzXG4iKQoreworCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubjsKKworCWNvbm4gPSAoc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICopIHZ0eS0+cHJpdjsKKwlpZiAoIWNvbm4tPmRiZykgeworCQl2dHlfb3V0KHZ0eSwgIkxvZ2dpbmcgd2FzIG5vdCBlbmFibGVkLiVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJbG9nX3NldF91c2VfY29sb3IoY29ubi0+ZGJnLCBhdG9pKGFyZ3ZbMF0pKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGxvZ2dpbmdfcHJudF90aW1lc3RhbXAsCisgICAgICBsb2dnaW5nX3BybnRfdGltZXN0YW1wX2NtZCwKKyAgICAgICJsb2dnaW5nIHRpbWVzdGFtcCA8MC0xPiIsCisgICAgICAiUHJpbnQgdGhlIHRpbWVzdGFtcCBvZiBlYWNoIG1lc3NhZ2VcbiIpCit7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uOworCisJY29ubiA9IChzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKikgdnR5LT5wcml2OworCWlmICghY29ubi0+ZGJnKSB7CisJCXZ0eV9vdXQodnR5LCAiTG9nZ2luZyB3YXMgbm90IGVuYWJsZWQuJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlsb2dfc2V0X3ByaW50X3RpbWVzdGFtcChjb25uLT5kYmcsIGF0b2koYXJndlswXSkpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogRklYTUU6IHRob3NlIGhhdmUgdG8gYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIGxvZyBsZXZlbHMgYW5kIGNhdGVnb3JpZXMgKi8KKyNkZWZpbmUgVlRZX0RFQlVHX0NBVEVHT1JJRVMgIihybGx8Y2N8bW18cnJ8cnNsfG5tfHNtc3xwYWd8bW5jY3xpbnB8bWl8bWlifG11eHxtZWFzfHNjY3B8bXNjfG1nY3B8aG98ZGJ8cmVmfGdwcnMpIgorI2RlZmluZSBWVFlfREVCVUdfTEVWRUxTICIoZXZlcnl0aGluZ3xkZWJ1Z3xpbmZvfG5vdGljZXxlcnJvcnxmYXRhbCkiCitERUZVTihsb2dnaW5nX2xldmVsLAorICAgICAgbG9nZ2luZ19sZXZlbF9jbWQsCisgICAgICAibG9nZ2luZyBsZXZlbCAiIFZUWV9ERUJVR19DQVRFR09SSUVTICIgIiBWVFlfREVCVUdfTEVWRUxTLAorICAgICAgIlNldCB0aGUgbG9nIGxldmVsIGZvciBhIHNwZWNpZmllZCBjYXRlZ29yeVxuIikKK3sKKwlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm47CisJaW50IGNhdGVnb3J5ID0gbG9nX3BhcnNlX2NhdGVnb3J5KGFyZ3ZbMF0pOworCWludCBsZXZlbCA9IGxvZ19wYXJzZV9sZXZlbChhcmd2WzFdKTsKKworCWNvbm4gPSAoc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICopIHZ0eS0+cHJpdjsKKwlpZiAoIWNvbm4tPmRiZykgeworCQl2dHlfb3V0KHZ0eSwgIkxvZ2dpbmcgd2FzIG5vdCBlbmFibGVkLiVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJaWYgKGNhdGVnb3J5IDwgMCkgeworCQl2dHlfb3V0KHZ0eSwgIkludmFsaWQgY2F0ZWdvcnkgYCVzJyVzIiwgYXJndlswXSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJaWYgKGxldmVsIDwgMCkgeworCQl2dHlfb3V0KHZ0eSwgIkludmFsaWQgbGV2ZWwgYCVzJyVzIiwgYXJndlsxXSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJY29ubi0+ZGJnLT5jYXRlZ29yaWVzW2NhdGVnb3J5XS5lbmFibGVkID0gMTsKKwljb25uLT5kYmctPmNhdGVnb3JpZXNbY2F0ZWdvcnldLmxvZ2xldmVsID0gbGV2ZWw7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGxvZ2dpbmdfc2V0X2NhdGVnb3J5X21hc2ssCisgICAgICBsb2dnaW5nX3NldF9jYXRlZ29yeV9tYXNrX2NtZCwKKyAgICAgICJsb2dnaW5nIHNldCBsb2cgbWFzayBNQVNLIiwKKyAgICAgICJEZWNpZGUgd2hpY2ggY2F0ZWdvcmllcyB0byBvdXRwdXQuXG4iKQoreworCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubjsKKworCWNvbm4gPSAoc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICopIHZ0eS0+cHJpdjsKKwlpZiAoIWNvbm4tPmRiZykgeworCQl2dHlfb3V0KHZ0eSwgIkxvZ2dpbmcgd2FzIG5vdCBlbmFibGVkLiVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJbG9nX3BhcnNlX2NhdGVnb3J5X21hc2soY29ubi0+ZGJnLCBhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGxvZ2dpbmdfc2V0X2xvZ19sZXZlbCwKKyAgICAgIGxvZ2dpbmdfc2V0X2xvZ19sZXZlbF9jbWQsCisgICAgICAibG9nZ2luZyBzZXQgbG9nIGxldmVsIDwwLTg+IiwKKyAgICAgICJTZXQgdGhlIGdsb2JhbCBsb2cgbGV2ZWwuIFRoZSB2YWx1ZSAwIGltcGxpZXMgbm8gZmlsdGVyaW5nLlxuIikKK3sKKwlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm47CisKKwljb25uID0gKHN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqKSB2dHktPnByaXY7CisJaWYgKCFjb25uLT5kYmcpIHsKKwkJdnR5X291dCh2dHksICJMb2dnaW5nIHdhcyBub3QgZW5hYmxlZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWxvZ19zZXRfbG9nX2xldmVsKGNvbm4tPmRiZywgYXRvaShhcmd2WzBdKSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihkaWFibGVfbG9nZ2luZywKKyAgICAgIGRpc2FibGVfbG9nZ2luZ19jbWQsCisgICAgICAibG9nZ2luZyBkaXNhYmxlIiwKKyAgICAgICJEaXNhYmxlcyBsb2dnaW5nIHRvIHRoaXMgdnR5XG4iKQoreworCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubjsKKworCWNvbm4gPSAoc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICopIHZ0eS0+cHJpdjsKKwlpZiAoIWNvbm4tPmRiZykgeworCQl2dHlfb3V0KHZ0eSwgIkxvZ2dpbmcgd2FzIG5vdCBlbmFibGVkLiVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJbG9nX2RlbF90YXJnZXQoY29ubi0+ZGJnKTsKKwl0YWxsb2NfZnJlZShjb25uLT5kYmcpOworCWNvbm4tPmRiZyA9IE5VTEw7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCit2b2lkIG9wZW5ic2NfdnR5X3ByaW50X3N0YXRpc3RpY3Moc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCkKK3sKKwl2dHlfb3V0KHZ0eSwgIkNoYW5uZWwgUmVxdWVzdHMgICAgICAgIDogJWx1IHRvdGFsLCAlbHUgbm8gY2hhbm5lbCVzIiwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5jaHJlcS50b3RhbCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuY2hyZXEubm9fY2hhbm5lbCksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIkNoYW5uZWwgRmFpbHVyZXMgICAgICAgIDogJWx1IHJmX2ZhaWx1cmVzLCAlbHUgcmxsIGZhaWx1cmVzJXMiLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmNoYW4ucmZfZmFpbCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuY2hhbi5ybGxfZXJyKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiUGFnaW5nICAgICAgICAgICAgICAgICAgOiAlbHUgYXR0ZW1wdGVkLCAlbHUgY29tcGxldGUsICVsdSBleHBpcmVkJXMiLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnBhZ2luZy5hdHRlbXB0ZWQpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnBhZ2luZy5jb21wbGV0ZWQpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnBhZ2luZy5leHBpcmVkKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiQlRTIGZhaWx1cmVzICAgICAgICAgICAgOiAlbHUgT01MLCAlbHUgUlNMJXMiLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmJ0cy5vbWxfZmFpbCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuYnRzLnJzbF9mYWlsKSwgVlRZX05FV0xJTkUpOworfQorCit2b2lkIG9wZW5ic2NfdnR5X2FkZF9jbWRzKCkKK3sKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmZW5hYmxlX2xvZ2dpbmdfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmZGlzYWJsZV9sb2dnaW5nX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmxvZ2dpbmdfZmx0cl9pbXNpX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmxvZ2dpbmdfZmx0cl9hbGxfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmbG9nZ2luZ191c2VfY2xyX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmxvZ2dpbmdfcHJudF90aW1lc3RhbXBfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmbG9nZ2luZ19zZXRfY2F0ZWdvcnlfbWFza19jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZsb2dnaW5nX2xldmVsX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmxvZ2dpbmdfc2V0X2xvZ19sZXZlbF9jbWQpOworCit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy92dHlfaW50ZXJmYWNlX2xheWVyMy5jIGIvb3BlbmJzYy9zcmMvdnR5X2ludGVyZmFjZV9sYXllcjMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWU1YmFlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvdnR5X2ludGVyZmFjZV9sYXllcjMuYwpAQCAtMCwwICsxLDU2OCBAQAorLyogT3BlbkJTQyBpbnRlcmZhY2UgdG8gcXVhZ2dhIFZUWSAqLworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8dnR5L2NvbW1hbmQuaD4KKyNpbmNsdWRlIDx2dHkvYnVmZmVyLmg+CisjaW5jbHVkZSA8dnR5L3Z0eS5oPgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lsZW50X2NhbGwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8xMS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZTFfaW5wdXQuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfbm0uaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc21fdXRpbHMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RiLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy92dHkuaD4KKworc3RhdGljIHN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0OworCitzdHJ1Y3QgY21kX25vZGUgc3Vic2NyX25vZGUgPSB7CisJU1VCU0NSX05PREUsCisJIiVzKHN1YnNjcmliZXIpIyIsCisJMSwKK307CisKK3N0YXRpYyBpbnQgZHVtbXlfY29uZmlnX3dyaXRlKHN0cnVjdCB2dHkgKnYpCit7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgc3RydWN0IGJ1ZmZlciAqYXJndl90b19idWZmZXIoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSwgaW50IGJhc2UpCit7CisJc3RydWN0IGJ1ZmZlciAqYiA9IGJ1ZmZlcl9uZXcoTlVMTCwgMTAyNCk7CisJaW50IGk7CisKKwlpZiAoIWIpCisJCXJldHVybiBOVUxMOworCisJZm9yIChpID0gYmFzZTsgaSA8IGFyZ2M7IGkrKykgeworCQlidWZmZXJfcHV0c3RyKGIsIGFyZ3ZbaV0pOworCQlidWZmZXJfcHV0YyhiLCAnICcpOworCX0KKwlidWZmZXJfcHV0YyhiLCAnXDAnKTsKKworCXJldHVybiBiOworfQorCitzdGF0aWMgaW50IGhleHBhcnNlKGNvbnN0IGNoYXIgKnN0ciwgdV9pbnQ4X3QgKmIsIGludCBtYXhfbGVuKQorCit7CisJaW50IGksIGwsIHY7CisKKwlsID0gc3RybGVuKHN0cik7CisJaWYgKChsJjEpIHx8ICgobD4+MSkgPiBtYXhfbGVuKSkKKwkJcmV0dXJuIC0xOworCisJbWVtc2V0KGIsIDB4MDAsIG1heF9sZW4pOworCisJZm9yIChpPTA7IGk8bDsgaSsrKSB7CisJCWNoYXIgYyA9IHN0cltpXTsKKwkJaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQorCQkJdiA9IGMgLSAnMCc7CisJCWVsc2UgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQorCQkJdiA9IDEwICsgKGMgLSAnYScpOworCQllbHNlIGlmIChjID49ICdBJyAmJiBjIDw9ICdGJykKKwkJCXYgPSAxMCArIChjIC0gJ2EnKTsKKwkJZWxzZQorCQkJcmV0dXJuIC0xOworCQliW2k+PjFdIHw9IHYgPDwgKGkmMSA/IDAgOiA0KTsKKwl9CisKKwlyZXR1cm4gaT4+MTsKK30KKworLyogcGVyLXN1YnNjcmliZXIgY29uZmlndXJhdGlvbiAqLworREVGVU4oY2ZnX3N1YnNjciwKKyAgICAgIGNmZ19zdWJzY3JfY21kLAorICAgICAgInN1YnNjcmliZXIgSU1TSSIsCisgICAgICAiU2VsZWN0IGEgU3Vic2NyaWJlciB0byBjb25maWd1cmVcbiIpCit7CisJY29uc3QgY2hhciAqaW1zaSA9IGFyZ3ZbMF07CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisKKwlzdWJzY3IgPSBzdWJzY3JfZ2V0X2J5X2ltc2koZ3NtbmV0LCBpbXNpKTsKKwlpZiAoIXN1YnNjcikgeworCQl2dHlfb3V0KHZ0eSwgIiUlIE5vIHN1YnNjcmliZXIgZm9yIElNU0kgJXMlcyIsCisJCQlpbXNpLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwkvKiB2dHlfZ29fcGFyZW50IHNob3VsZCBwdXQgdGhpcyBzdWJzY3JpYmVyICovCisJdnR5LT5pbmRleCA9IHN1YnNjcjsKKwl2dHktPm5vZGUgPSBTVUJTQ1JfTk9ERTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgc3Vic2NyX2R1bXBfZnVsbF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKwlpbnQgcmM7CisJc3RydWN0IGdzbV9hdXRoX2luZm8gYWluZm87CisJc3RydWN0IGdzbV9hdXRoX3R1cGxlIGF0dXBsZTsKKworCXZ0eV9vdXQodnR5LCAiICAgIElEOiAlbGx1LCBBdXRob3JpemVkOiAlZCVzIiwgc3Vic2NyLT5pZCwKKwkJc3Vic2NyLT5hdXRob3JpemVkLCBWVFlfTkVXTElORSk7CisJaWYgKHN1YnNjci0+bmFtZSkKKwkJdnR5X291dCh2dHksICIgICAgTmFtZTogJyVzJyVzIiwgc3Vic2NyLT5uYW1lLCBWVFlfTkVXTElORSk7CisJaWYgKHN1YnNjci0+ZXh0ZW5zaW9uKQorCQl2dHlfb3V0KHZ0eSwgIiAgICBFeHRlbnNpb246ICVzJXMiLCBzdWJzY3ItPmV4dGVuc2lvbiwKKwkJCVZUWV9ORVdMSU5FKTsKKwlpZiAoc3Vic2NyLT5pbXNpKQorCQl2dHlfb3V0KHZ0eSwgIiAgICBJTVNJOiAlcyVzIiwgc3Vic2NyLT5pbXNpLCBWVFlfTkVXTElORSk7CisJaWYgKHN1YnNjci0+dG1zaSAhPSBHU01fUkVTRVJWRURfVE1TSSkKKwkJdnR5X291dCh2dHksICIgICAgVE1TSTogJTA4WCVzIiwgc3Vic2NyLT50bXNpLAorCQkJVlRZX05FV0xJTkUpOworCisJcmMgPSBnZXRfYXV0aGluZm9fYnlfc3Vic2NyKCZhaW5mbywgc3Vic2NyKTsKKwlpZiAoIXJjKSB7CisJCXZ0eV9vdXQodnR5LCAiICAgIEEzQTggYWxnb3JpdGhtIGlkOiAlZCVzIiwKKwkJCWFpbmZvLmF1dGhfYWxnbywgVlRZX05FV0xJTkUpOworCQl2dHlfb3V0KHZ0eSwgIiAgICBBM0E4IEtpOiAlcyVzIiwKKwkJCWhleGR1bXAoYWluZm8uYTNhOF9raSwgYWluZm8uYTNhOF9raV9sZW4pLAorCQkJVlRZX05FV0xJTkUpOworCX0KKworCXJjID0gZ2V0X2F1dGh0dXBsZV9ieV9zdWJzY3IoJmF0dXBsZSwgc3Vic2NyKTsKKwlpZiAoIXJjKSB7CisJCXZ0eV9vdXQodnR5LCAiICAgIEEzQTggbGFzdCB0dXBsZSAodXNlZCAlZCB0aW1lcyk6JXMiLAorCQkJYXR1cGxlLnVzZV9jb3VudCwgVlRZX05FV0xJTkUpOworCQl2dHlfb3V0KHZ0eSwgIiAgICAgc2VxICMgOiAlZCVzIiwKKwkJCWF0dXBsZS5rZXlfc2VxLCBWVFlfTkVXTElORSk7CisJCXZ0eV9vdXQodnR5LCAiICAgICBSQU5EICA6ICVzJXMiLAorCQkJaGV4ZHVtcChhdHVwbGUucmFuZCwgc2l6ZW9mKGF0dXBsZS5yYW5kKSksCisJCQlWVFlfTkVXTElORSk7CisJCXZ0eV9vdXQodnR5LCAiICAgICBTUkVTICA6ICVzJXMiLAorCQkJaGV4ZHVtcChhdHVwbGUuc3Jlcywgc2l6ZW9mKGF0dXBsZS5zcmVzKSksCisJCQlWVFlfTkVXTElORSk7CisJCXZ0eV9vdXQodnR5LCAiICAgICBLYyAgICA6ICVzJXMiLAorCQkJaGV4ZHVtcChhdHVwbGUua2MsIHNpemVvZihhdHVwbGUua2MpKSwKKwkJCVZUWV9ORVdMSU5FKTsKKwl9CisKKwl2dHlfb3V0KHZ0eSwgIiAgICBVc2UgY291bnQ6ICV1JXMiLCBzdWJzY3ItPnVzZV9jb3VudCwgVlRZX05FV0xJTkUpOworfQorCisKKy8qIFN1YnNjcmliZXIgKi8KK0RFRlVOKHNob3dfc3Vic2NyLAorICAgICAgc2hvd19zdWJzY3JfY21kLAorICAgICAgInNob3cgc3Vic2NyaWJlciBbSU1TSV0iLAorCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IGEgc3Vic2NyaWJlclxuIikKK3sKKwljb25zdCBjaGFyICppbXNpOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCisJaWYgKGFyZ2MgPj0gMSkgeworCQlpbXNpID0gYXJndlswXTsKKwkJc3Vic2NyID0gc3Vic2NyX2dldF9ieV9pbXNpKGdzbW5ldCwgaW1zaSk7CisJCWlmICghc3Vic2NyKSB7CisJCQl2dHlfb3V0KHZ0eSwgIiUlIHVua25vd24gc3Vic2NyaWJlciVzIiwKKwkJCQlWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJc3Vic2NyX2R1bXBfZnVsbF92dHkodnR5LCBzdWJzY3IpOworCQlzdWJzY3JfcHV0KHN1YnNjcik7CisKKwkJcmV0dXJuIENNRF9TVUNDRVNTOworCX0KKworCS8qIEZJWE1FOiBpdGVyYXRlIG92ZXIgYWxsIHN1YnNjcmliZXJzID8gKi8KKwlyZXR1cm4gQ01EX1dBUk5JTkc7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKHNob3dfc3Vic2NyX2NhY2hlLAorICAgICAgc2hvd19zdWJzY3JfY2FjaGVfY21kLAorICAgICAgInNob3cgc3Vic2NyaWJlciBjYWNoZSIsCisJU0hPV19TVFIgIkRpc3BsYXkgY29udGVudHMgb2Ygc3Vic2NyaWJlciBjYWNoZVxuIikKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHN1YnNjciwgJmFjdGl2ZV9zdWJzY3JpYmVycywgZW50cnkpIHsKKwkJdnR5X291dCh2dHksICIgIFN1YnNjcmliZXI6JXMiLCBWVFlfTkVXTElORSk7CisJCXN1YnNjcl9kdW1wX2Z1bGxfdnR5KHZ0eSwgc3Vic2NyKTsKKwl9CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKHNtc19zZW5kX3BlbmQsCisgICAgICBzbXNfc2VuZF9wZW5kX2NtZCwKKyAgICAgICJzbXMgc2VuZCBwZW5kaW5nIiwKKyAgICAgICJTZW5kIGFsbCBwZW5kaW5nIFNNUyIpCit7CisJc3RydWN0IGdzbV9zbXMgKnNtczsKKwlpbnQgaWQgPSAwOworCisJd2hpbGUgKDEpIHsKKwkJc21zID0gZGJfc21zX2dldF91bnNlbnRfYnlfc3Vic2NyKGdzbW5ldCwgaWQpOworCQlpZiAoIXNtcykKKwkJCWJyZWFrOworCisJCWdzbTQxMV9zZW5kX3Ntc19zdWJzY3Ioc21zLT5yZWNlaXZlciwgc21zKTsKKworCQlpZCA9IHNtcy0+cmVjZWl2ZXItPmlkICsgMTsKKwl9CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0cnVjdCBnc21fc21zICpzbXNfZnJvbV90ZXh0KHN0cnVjdCBnc21fc3Vic2NyaWJlciAqcmVjZWl2ZXIsIGNvbnN0IGNoYXIgKnRleHQpCit7CisJc3RydWN0IGdzbV9zbXMgKnNtcyA9IHNtc19hbGxvYygpOworCisJaWYgKCFzbXMpCisJCXJldHVybiBOVUxMOworCisJaWYgKCFyZWNlaXZlci0+bGFjKSB7CisJCS8qIHN1YnNjcmliZXIgY3VycmVudGx5IG5vdCBhdHRhY2hlZCwgc3RvcmUgaW4gZGF0YWJhc2U/ICovCisJCXJldHVybiBOVUxMOworCX0KKworCXNtcy0+cmVjZWl2ZXIgPSBzdWJzY3JfZ2V0KHJlY2VpdmVyKTsKKwlzdHJuY3B5KHNtcy0+dGV4dCwgdGV4dCwgc2l6ZW9mKHNtcy0+dGV4dCktMSk7CisKKwkvKiBGSVhNRTogZG9uJ3QgdXNlIElEIDEgc3RhdGljICovCisJc21zLT5zZW5kZXIgPSBzdWJzY3JfZ2V0X2J5X2lkKGdzbW5ldCwgMSk7CisJc21zLT5yZXBseV9wYXRoX3JlcSA9IDA7CisJc21zLT5zdGF0dXNfcmVwX3JlcSA9IDA7CisJc21zLT51ZF9oZHJfaW5kID0gMDsKKwlzbXMtPnByb3RvY29sX2lkID0gMDsgLyogaW1wbGljaXQgKi8KKwlzbXMtPmRhdGFfY29kaW5nX3NjaGVtZSA9IDA7IC8qIGRlZmF1bHQgN2JpdCAqLworCXN0cm5jcHkoc21zLT5kZXN0X2FkZHIsIHJlY2VpdmVyLT5leHRlbnNpb24sIHNpemVvZihzbXMtPmRlc3RfYWRkciktMSk7CisJLyogR2VuZXJhdGUgdXNlcl9kYXRhICovCisJc21zLT51c2VyX2RhdGFfbGVuID0gZ3NtXzdiaXRfZW5jb2RlKHNtcy0+dXNlcl9kYXRhLCBzbXMtPnRleHQpOworCisJcmV0dXJuIHNtczsKK30KKworc3RhdGljIGludCBfc2VuZF9zbXNfYnVmZmVyKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqcmVjZWl2ZXIsCisJCQkgICAgIHN0cnVjdCBidWZmZXIgKmIsIHVfaW50OF90IHRwX3BpZCkKK3sKKwlzdHJ1Y3QgZ3NtX3NtcyAqc21zOworCisJc21zID0gc21zX2Zyb21fdGV4dChyZWNlaXZlciwgYnVmZmVyX2dldHN0cihiKSk7CisJc21zLT5wcm90b2NvbF9pZCA9IHRwX3BpZDsKKwlnc200MTFfc2VuZF9zbXNfc3Vic2NyKHJlY2VpdmVyLCBzbXMpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpnZXRfc3Vic2NyX2J5X2FyZ3YoY29uc3QgY2hhciAqdHlwZSwKKwkJCQkJCSBjb25zdCBjaGFyICppZCkKK3sKKwlpZiAoIXN0cmNtcCh0eXBlLCAiZXh0ZW5zaW9uIikpCisJCXJldHVybiBzdWJzY3JfZ2V0X2J5X2V4dGVuc2lvbihnc21uZXQsIGlkKTsKKwllbHNlIGlmICghc3RyY21wKHR5cGUsICJpbXNpIikpCisJCXJldHVybiBzdWJzY3JfZ2V0X2J5X2ltc2koZ3NtbmV0LCBpZCk7CisJZWxzZSBpZiAoIXN0cmNtcCh0eXBlLCAidG1zaSIpKQorCQlyZXR1cm4gc3Vic2NyX2dldF9ieV90bXNpKGdzbW5ldCwgYXRvaShpZCkpOworCWVsc2UgaWYgKCFzdHJjbXAodHlwZSwgImlkIikpCisJCXJldHVybiBzdWJzY3JfZ2V0X2J5X2lkKGdzbW5ldCwgYXRvaShpZCkpOworCisJcmV0dXJuIE5VTEw7Cit9CisjZGVmaW5lIFNVQlNDUl9UWVBFUyAiKGV4dGVuc2lvbnxpbXNpfHRtc2l8aWQpIgorCitERUZVTihzdWJzY3JpYmVyX3NlbmRfc21zLAorICAgICAgc3Vic2NyaWJlcl9zZW5kX3Ntc19jbWQsCisgICAgICAic3Vic2NyaWJlciAiIFNVQlNDUl9UWVBFUyAiIEVYVEVOIHNtcyBzZW5kIC5MSU5FIiwKKyAgICAgICJTZWxlY3Qgc3Vic2NyaWJlciBiYXNlZCBvbiBleHRlbnNpb24iKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gZ2V0X3N1YnNjcl9ieV9hcmd2KGFyZ3ZbMF0sIGFyZ3ZbMV0pOworCXN0cnVjdCBidWZmZXIgKmI7CisJaW50IHJjOworCisJaWYgKCFzdWJzY3IpIHsKKwkJdnR5X291dCh2dHksICIlJSBObyBzdWJzY3JpYmVyIGZvdW5kIGZvciAlcyAlcyVzIiwKKwkJCWFyZ3ZbMF0sIGFyZ3ZbMV0sIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKwliID0gYXJndl90b19idWZmZXIoYXJnYywgYXJndiwgMik7CisJcmMgPSBfc2VuZF9zbXNfYnVmZmVyKHN1YnNjciwgYiwgMCk7CisJYnVmZmVyX2ZyZWUoYik7CisKKwlzdWJzY3JfcHV0KHN1YnNjcik7CisKKwlyZXR1cm4gcmM7Cit9CisKK0RFRlVOKHN1YnNjcmliZXJfc2lsZW50X3NtcywKKyAgICAgIHN1YnNjcmliZXJfc2lsZW50X3Ntc19jbWQsCisgICAgICAic3Vic2NyaWJlciAiIFNVQlNDUl9UWVBFUyAiIEVYVEVOIHNpbGVudCBzbXMgc2VuZCAuTElORSIsCisgICAgICAiU2VsZWN0IHN1YnNjcmliZXIgYmFzZWQgb24gZXh0ZW5zaW9uIikKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IGdldF9zdWJzY3JfYnlfYXJndihhcmd2WzBdLCBhcmd2WzFdKTsKKwlzdHJ1Y3QgYnVmZmVyICpiOworCWludCByYzsKKworCWlmICghc3Vic2NyKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgTm8gc3Vic2NyaWJlciBmb3VuZCBmb3IgJXMgJXMlcyIsCisJCQlhcmd2WzBdLCBhcmd2WzFdLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwliID0gYXJndl90b19idWZmZXIoYXJnYywgYXJndiwgMik7CisJcmMgPSBfc2VuZF9zbXNfYnVmZmVyKHN1YnNjciwgYiwgNjQpOworCWJ1ZmZlcl9mcmVlKGIpOworCisJc3Vic2NyX3B1dChzdWJzY3IpOworCisJcmV0dXJuIHJjOworfQorCitERUZVTihzdWJzY3JpYmVyX3NpbGVudF9jYWxsX3N0YXJ0LAorICAgICAgc3Vic2NyaWJlcl9zaWxlbnRfY2FsbF9zdGFydF9jbWQsCisgICAgICAic3Vic2NyaWJlciAiIFNVQlNDUl9UWVBFUyAiIEVYVEVOIHNpbGVudCBjYWxsIHN0YXJ0IChhbnl8dGNoL2Z8dGNoL2FueXxzZGNjaCkiLAorICAgICAgIlN0YXJ0IGEgc2lsZW50IGNhbGwgdG8gYSBzdWJzY3JpYmVyIikKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IGdldF9zdWJzY3JfYnlfYXJndihhcmd2WzBdLCBhcmd2WzFdKTsKKwlpbnQgcmMsIHR5cGU7CisKKwlpZiAoIXN1YnNjcikgeworCQl2dHlfb3V0KHZ0eSwgIiUlIE5vIHN1YnNjcmliZXIgZm91bmQgZm9yICVzICVzJXMiLAorCQkJYXJndlswXSwgYXJndlsxXSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJaWYgKCFzdHJjbXAoYXJndlsyXSwgInRjaC9mIikpCisJCXR5cGUgPSBSU0xfQ0hBTk5FRURfVENIX0Y7CisJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAidGNoL2FueSIpKQorCQl0eXBlID0gUlNMX0NIQU5ORUVEX1RDSF9Gb3JIOworCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgInNkY2NoIikpCisJCXR5cGUgPSBSU0xfQ0hBTk5FRURfU0RDQ0g7CisJZWxzZQorCQl0eXBlID0gUlNMX0NIQU5ORUVEX0FOWTsJLyogRGVmYXVsdHMgdG8gQU5ZICovCisKKwlyYyA9IGdzbV9zaWxlbnRfY2FsbF9zdGFydChzdWJzY3IsIHZ0eSwgdHlwZSk7CisJaWYgKHJjIDw9IDApIHsKKwkJdnR5X291dCh2dHksICIlJSBTdWJzY3JpYmVyIG5vdCBhdHRhY2hlZCVzIiwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJc3Vic2NyX3B1dChzdWJzY3IpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJc3Vic2NyX3B1dChzdWJzY3IpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihzdWJzY3JpYmVyX3NpbGVudF9jYWxsX3N0b3AsCisgICAgICBzdWJzY3JpYmVyX3NpbGVudF9jYWxsX3N0b3BfY21kLAorICAgICAgInN1YnNjcmliZXIgIiBTVUJTQ1JfVFlQRVMgIiBFWFRFTiBzaWxlbnQgY2FsbCBzdG9wIiwKKyAgICAgICJTdG9wIGEgc2lsZW50IGNhbGwgdG8gYSBzdWJzY3JpYmVyIikKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IGdldF9zdWJzY3JfYnlfYXJndihhcmd2WzBdLCBhcmd2WzFdKTsKKwlpbnQgcmM7CisKKwlpZiAoIXN1YnNjcikgeworCQl2dHlfb3V0KHZ0eSwgIiUlIE5vIHN1YnNjcmliZXIgZm91bmQgZm9yICVzICVzJXMiLAorCQkJYXJndlswXSwgYXJndlsxXSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJcmMgPSBnc21fc2lsZW50X2NhbGxfc3RvcChzdWJzY3IpOworCWlmIChyYyA8IDApIHsKKwkJc3Vic2NyX3B1dChzdWJzY3IpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJc3Vic2NyX3B1dChzdWJzY3IpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfc3Vic2NyX25hbWUsCisgICAgICBjZmdfc3Vic2NyX25hbWVfY21kLAorICAgICAgIm5hbWUgTkFNRSIsCisgICAgICAiU2V0IHRoZSBuYW1lIG9mIHRoZSBzdWJzY3JpYmVyIikKK3sKKwljb25zdCBjaGFyICpuYW1lID0gYXJndlswXTsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IHZ0eS0+aW5kZXg7CisKKwlzdHJuY3B5KHN1YnNjci0+bmFtZSwgbmFtZSwgc2l6ZW9mKHN1YnNjci0+bmFtZSkpOworCisJZGJfc3luY19zdWJzY3JpYmVyKHN1YnNjcik7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19zdWJzY3JfZXh0ZW5zaW9uLAorICAgICAgY2ZnX3N1YnNjcl9leHRlbnNpb25fY21kLAorICAgICAgImV4dGVuc2lvbiBFWFRFTlNJT04iLAorICAgICAgIlNldCB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBzdWJzY3JpYmVyIikKK3sKKwljb25zdCBjaGFyICpuYW1lID0gYXJndlswXTsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IHZ0eS0+aW5kZXg7CisKKwlzdHJuY3B5KHN1YnNjci0+ZXh0ZW5zaW9uLCBuYW1lLCBzaXplb2Yoc3Vic2NyLT5leHRlbnNpb24pKTsKKworCWRiX3N5bmNfc3Vic2NyaWJlcihzdWJzY3IpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfc3Vic2NyX2F1dGhvcml6ZWQsCisgICAgICBjZmdfc3Vic2NyX2F1dGhvcml6ZWRfY21kLAorICAgICAgImF1dGggPDAtMT4iLAorICAgICAgIlNldCB0aGUgYXV0aG9yaXphdGlvbiBzdGF0dXMgb2YgdGhlIHN1YnNjcmliZXIiKQoreworCWludCBhdXRoID0gYXRvaShhcmd2WzBdKTsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IHZ0eS0+aW5kZXg7CisKKwlpZiAoYXV0aCkKKwkJc3Vic2NyLT5hdXRob3JpemVkID0gMTsKKwllbHNlCisJCXN1YnNjci0+YXV0aG9yaXplZCA9IDA7CisKKwlkYl9zeW5jX3N1YnNjcmliZXIoc3Vic2NyKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworI2RlZmluZSBBM0E4X0FMR19UWVBFUyAiKG5vbmV8Y29tcDEyOHYxKSIKKworREVGVU4oY2ZnX3N1YnNjcl9hM2E4LAorICAgICAgY2ZnX3N1YnNjcl9hM2E4X2NtZCwKKyAgICAgICJhM2E4ICIgQTNBOF9BTEdfVFlQRVMgIiBbS0ldIiwKKyAgICAgICJTZXQgYTNhOCBwYXJhbWV0ZXJzIGZvciB0aGUgc3Vic2NyaWJlciIpCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPSB2dHktPmluZGV4OworCWNvbnN0IGNoYXIgKmFsZ19zdHIgPSBhcmd2WzBdOworCWNvbnN0IGNoYXIgKmtpX3N0ciA9IGFyZ3ZbMV07CisJc3RydWN0IGdzbV9hdXRoX2luZm8gYWluZm87CisJaW50IHJjOworCisJaWYgKCFzdHJjYXNlY21wKGFsZ19zdHIsICJub25lIikpIHsKKwkJLyogSnVzdCBlcmFzZSAqLworCQlyYyA9IHNldF9hdXRoaW5mb19mb3Jfc3Vic2NyKE5VTEwsIHN1YnNjcik7CisJfSBlbHNlIGlmICghc3RyY2FzZWNtcChhbGdfc3RyLCAiY29tcDEyOHYxIikpIHsKKwkJLyogUGFyc2UgaGV4IHN0cmluZyBLaSAqLworCQlyYyA9IGhleHBhcnNlKGtpX3N0ciwgYWluZm8uYTNhOF9raSwgc2l6ZW9mKGFpbmZvLmEzYThfa2kpKTsKKwkJaWYgKHJjICE9IDE2KQorCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCisJCS8qIFNldCB0aGUgaW5mb3MgKi8KKwkJYWluZm8uYXV0aF9hbGdvID0gQVVUSF9BTEdPX0NPTVAxMjh2MTsKKwkJYWluZm8uYTNhOF9raV9sZW4gPSByYzsKKwkJcmMgPSBzZXRfYXV0aGluZm9fZm9yX3N1YnNjcigmYWluZm8sIHN1YnNjcik7CisJfSBlbHNlIHsKKwkJLyogVW5rbm93biBtZXRob2QgKi8KKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCXJldHVybiByYyA/IENNRF9XQVJOSU5HIDogQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgc2NhbGxfY2Jmbih1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgc2lnbmFsLAorCQkJdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSkKK3sKKwlzdHJ1Y3Qgc2NhbGxfc2lnbmFsX2RhdGEgKnNpZ2RhdGEgPSBzaWduYWxfZGF0YTsKKwlzdHJ1Y3QgdnR5ICp2dHkgPSBzaWdkYXRhLT5kYXRhOworCisJc3dpdGNoIChzaWduYWwpIHsKKwljYXNlIFNfU0NBTExfU1VDQ0VTUzoKKwkJdnR5X291dCh2dHksICIlJSBzaWxlbnQgY2FsbCBvbiBBUkZDTiAldSB0aW1lc2xvdCAldSVzIiwKKwkJCXNpZ2RhdGEtPmxjaGFuLT50cy0+dHJ4LT5hcmZjbiwgc2lnZGF0YS0+bGNoYW4tPnRzLT5uciwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJYnJlYWs7CisJY2FzZSBTX1NDQUxMX0VYUElSRUQ6CisJCXZ0eV9vdXQodnR5LCAiJSUgc2lsZW50IGNhbGwgZXhwaXJlZCBwYWdpbmclcyIsIFZUWV9ORVdMSU5FKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitERUZVTihzaG93X3N0YXRzLAorICAgICAgc2hvd19zdGF0c19jbWQsCisgICAgICAic2hvdyBzdGF0aXN0aWNzIiwKKwlTSE9XX1NUUiAiRGlzcGxheSBuZXR3b3JrIHN0YXRpc3RpY3NcbiIpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBnc21uZXQ7CisKKwlvcGVuYnNjX3Z0eV9wcmludF9zdGF0aXN0aWNzKHZ0eSwgbmV0KTsKKwl2dHlfb3V0KHZ0eSwgIkxvY2F0aW9uIFVwZGF0ZSAgICAgICAgIDogJWx1IGF0dGFjaCwgJWx1IG5vcm1hbCwgJWx1IHBlcmlvZGljJXMiLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmxvY191cGRfdHlwZS5hdHRhY2gpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmxvY191cGRfdHlwZS5ub3JtYWwpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmxvY191cGRfdHlwZS5wZXJpb2RpYyksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIklNU0kgRGV0YWNoIEluZGljYXRpb25zIDogJWx1JXMiLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmxvY191cGRfdHlwZS5kZXRhY2gpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJMb2NhdGlvbiBVcGRhdGUgUmVzcG9uc2U6ICVsdSBhY2NlcHQsICVsdSByZWplY3QlcyIsCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMubG9jX3VwZF9yZXNwLmFjY2VwdCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMubG9jX3VwZF9yZXNwLnJlamVjdCksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIkhhbmRvdmVyICAgICAgICAgICAgICAgIDogJWx1IGF0dGVtcHRlZCwgJWx1IG5vX2NoYW5uZWwsICVsdSB0aW1lb3V0LCAiCisJCSIlbHUgY29tcGxldGVkLCAlbHUgZmFpbGVkJXMiLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmhhbmRvdmVyLmF0dGVtcHRlZCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuaGFuZG92ZXIubm9fY2hhbm5lbCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuaGFuZG92ZXIudGltZW91dCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuaGFuZG92ZXIuY29tcGxldGVkKSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5oYW5kb3Zlci5mYWlsZWQpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJTTVMgTU8gICAgICAgICAgICAgICAgICA6ICVsdSBzdWJtaXR0ZWQsICVsdSBubyByZWNlaXZlciVzIiwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5zbXMuc3VibWl0dGVkKSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5zbXMubm9fcmVjZWl2ZXIpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJTTVMgTVQgICAgICAgICAgICAgICAgICA6ICVsdSBkZWxpdmVyZWQsICVsdSBubyBtZW1vcnksICVsdSBvdGhlciBlcnJvciVzIiwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5zbXMuZGVsaXZlcmVkKSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5zbXMucnBfZXJyX21lbSksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuc21zLnJwX2Vycl9vdGhlciksIFZUWV9ORVdMSU5FKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKworaW50IGJzY192dHlfaW5pdF9leHRyYShzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCkKK3sKKwlnc21uZXQgPSBuZXQ7CisKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19TQ0FMTCwgc2NhbGxfY2JmbiwgTlVMTCk7CisKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc2hvd19zdWJzY3JfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc2hvd19zdWJzY3JfY2FjaGVfY21kKTsKKworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzbXNfc2VuZF9wZW5kX2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc3Vic2NyaWJlcl9zZW5kX3Ntc19jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzdWJzY3JpYmVyX3NpbGVudF9zbXNfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc3Vic2NyaWJlcl9zaWxlbnRfY2FsbF9zdGFydF9jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzdWJzY3JpYmVyX3NpbGVudF9jYWxsX3N0b3BfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc2hvd19zdGF0c19jbWQpOworCisJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmY2ZnX3N1YnNjcl9jbWQpOworCWluc3RhbGxfbm9kZSgmc3Vic2NyX25vZGUsIGR1bW15X2NvbmZpZ193cml0ZSk7CisKKwlpbnN0YWxsX2RlZmF1bHQoU1VCU0NSX05PREUpOworCWluc3RhbGxfZWxlbWVudChTVUJTQ1JfTk9ERSwgJmNmZ19zdWJzY3JfbmFtZV9jbWQpOworCWluc3RhbGxfZWxlbWVudChTVUJTQ1JfTk9ERSwgJmNmZ19zdWJzY3JfZXh0ZW5zaW9uX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFNVQlNDUl9OT0RFLCAmY2ZnX3N1YnNjcl9hdXRob3JpemVkX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFNVQlNDUl9OT0RFLCAmY2ZnX3N1YnNjcl9hM2E4X2NtZCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2MvdGVzdHMvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL3Rlc3RzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMWI5MzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3Rlc3RzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEgQEAKK1NVQkRJUlMgPSBkZWJ1ZyBnc20wNDA4IGRiIGNoYW5uZWwgc2NjcApkaWZmIC0tZ2l0IGEvb3BlbmJzYy90ZXN0cy9jaGFubmVsL01ha2VmaWxlLmFtIGIvb3BlbmJzYy90ZXN0cy9jaGFubmVsL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3Mjk2NTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3Rlc3RzL2NoYW5uZWwvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxNSBAQAorSU5DTFVERVMgPSAkKGFsbF9pbmNsdWRlcykgLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUKK0FNX0NGTEFHUz0tV2FsbCAtZ2dkYjMgJChMSUJPU01PQ09SRV9DRkxBR1MpCisKK25vaW5zdF9QUk9HUkFNUyA9IGNoYW5uZWxfdGVzdAorCitjaGFubmVsX3Rlc3RfU09VUkNFUyA9IGNoYW5uZWxfdGVzdC5jIFwKKwkkKHRvcF9zcmNkaXIpL3NyYy9kYi5jIFwKKwkkKHRvcF9zcmNkaXIpL3NyYy9nc21fc3Vic2NyaWJlcl9iYXNlLmMgXAorCSQodG9wX3NyY2Rpcikvc3JjL2dzbV9zdWJzY3JpYmVyLmMgXAorCSQodG9wX3NyY2Rpcikvc3JjL2RlYnVnLmMgXAorCSQodG9wX3NyY2Rpcikvc3JjL2dzbV9kYXRhLmMgXAorCSQodG9wX3NyY2Rpcikvc3JjL2J0c19pcGFjY2Vzc19uYW5vYnRzLmMgXAorCSQodG9wX3NyY2Rpcikvc3JjL2J0c19zaWVtZW5zX2JzMTEuYworY2hhbm5lbF90ZXN0X0xEQUREID0gLWxkbCAtbGRiaSAkKExJQk9TTU9DT1JFX0xJQlMpCisKZGlmZiAtLWdpdCBhL29wZW5ic2MvdGVzdHMvY2hhbm5lbC9jaGFubmVsX3Rlc3QuYyBiL29wZW5ic2MvdGVzdHMvY2hhbm5lbC9jaGFubmVsX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTkwMDFjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy90ZXN0cy9jaGFubmVsL2NoYW5uZWxfdGVzdC5jCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisKKy8qIG91ciBoYW5kbGVyICovCitzdGF0aWMgaW50IHN1YnNjcl9jYih1bnNpZ25lZCBpbnQgaG9vaywgdW5zaWduZWQgaW50IGV2ZW50LCBzdHJ1Y3QgbXNnYiAqbXNnLCB2b2lkICpkYXRhLCB2b2lkICpwYXJhbSkKK3sKKwlhc3NlcnQoaG9vayA9PSAxMDEpOworCWFzc2VydChldmVudCA9PSAyMDApOworCWFzc2VydChtc2cgPT0gKHZvaWQqKTB4MTMyM0wpOworCWFzc2VydChkYXRhID09ICh2b2lkKikweDQyNDJMKTsKKwlhc3NlcnQocGFyYW0gPT0gKHZvaWQqKTB4MjM0MkwpOworCXByaW50ZigiUmVhY2hlZCwgZGlkbid0IGNyYXNoLCB0ZXN0IHBhc3NlZFxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qIG1vY2sgb2JqZWN0IGZvciB0ZXN0aW5nLCBkaXJlY3RseSBpbnZva2UgdGhlIGNiLi4uIG1heWJlIGxhdGVyIHRocm91Z2ggdGhlIHRpbWVyICovCit2b2lkIHBhZ2luZ19yZXF1ZXN0KHN0cnVjdCBnc21fYnRzICpidHMsIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyaWJlciwgaW50IHR5cGUsIGdzbV9jYmZuICpjYmZuLCB2b2lkICpkYXRhKQoreworCWNiZm4oMTAxLCAyMDAsICh2b2lkKikweDEzMjNMLCAodm9pZCopMHg0MjQyTCwgZGF0YSk7Cit9CisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0d29yazsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCisJcHJpbnRmKCJUZXN0aW5nIHRoZSBnc21fc3Vic2NyaWJlciBjaGFuIGxvZ2ljXG4iKTsKKworCS8qIENyZWF0ZSBhIGR1bW15IG5ldHdvcmsgKi8KKwluZXR3b3JrID0gZ3NtX25ldHdvcmtfaW5pdCgxLCAxLCBOVUxMKTsKKwlpZiAoIW5ldHdvcmspCisJCWV4aXQoMSk7CisJYnRzID0gZ3NtX2J0c19hbGxvYyhuZXR3b3JrLCBHU01fQlRTX1RZUEVfQlMxMSwgMCwgMCk7CisJYnRzLT5sb2NhdGlvbl9hcmVhX2NvZGUgPSAyMzsKKworCS8qIENyZWF0ZSBhIGR1bW15IHN1YnNjcmliZXIgKi8KKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IHN1YnNjcl9hbGxvYygpOworCXN1YnNjci0+bGFjID0gMjM7CisJc3Vic2NyLT5uZXQgPSBuZXR3b3JrOworCisJLyogQXNrIGZvciBhIGNoYW5uZWwuLi4gKi8KKwlzdWJzY3JfZ2V0X2NoYW5uZWwoc3Vic2NyLCBSU0xfQ0hBTk5FRURfVENIX0YsIHN1YnNjcl9jYiwgKHZvaWQqKTB4MjM0MkwpOworCisJd2hpbGUgKDEpIHsKKwkJYnNjX3NlbGVjdF9tYWluKDApOworCX0KK30KKwordm9pZCBubV9zdGF0ZV9ldmVudCgpIHt9Cit2b2lkIGlucHV0X2V2ZW50KCkge30KK3ZvaWQgc21zX2FsbG9jKCkge30KKworc3RydWN0IHRsdl9kZWZpbml0aW9uIG5tX2F0dF90bHZkZWY7CisKZGlmZiAtLWdpdCBhL29wZW5ic2MvdGVzdHMvZGIvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL3Rlc3RzL2RiL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYjkxODAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3Rlc3RzL2RiL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsOCBAQAorSU5DTFVERVMgPSAkKGFsbF9pbmNsdWRlcykgLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUKK0FNX0NGTEFHUz0tV2FsbCAtZ2dkYjMgJChMSUJPU01PQ09SRV9DRkxBR1MpCisKK25vaW5zdF9QUk9HUkFNUyA9IGRiX3Rlc3QKKworZGJfdGVzdF9TT1VSQ0VTID0gZGJfdGVzdC5jCitkYl90ZXN0X0xEQUREID0gJCh0b3BfYnVpbGRkaXIpL3NyYy9saWJic2MuYSAkKHRvcF9idWlsZGRpcikvc3JjL2xpYm1zYy5hICQodG9wX2J1aWxkZGlyKS9zcmMvbGliYnNjLmEgJChMSUJPU01PQ09SRV9MSUJTKSAtbGRsIC1sZGJpCisKZGlmZiAtLWdpdCBhL29wZW5ic2MvdGVzdHMvZGIvZGJfdGVzdC5jIGIvb3BlbmJzYy90ZXN0cy9kYi9kYl90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE2OGFjYgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvZGIvZGJfdGVzdC5jCkBAIC0wLDAgKzEsMTA2IEBACisvKiAoQykgMjAwOCBieSBKYW4gTHVlYmJlIDxqbHVlYmJlQGRlYmlhbi5vcmc+CisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPG9wZW5ic2MvZGIuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNkZWZpbmUgQ09NUEFSRShvcmlnaW5hbCwgY29weSkgXAorCWlmIChvcmlnaW5hbC0+aWQgIT0gY29weS0+aWQpIFwKKwkJZnByaW50ZihzdGRlcnIsICJJZHMgZG8gbm90IG1hdGNoIGluICVzOiVkICVsbHUgJWxsdVxuIiwgXAorCQkJX19GVU5DVElPTl9fLCBfX0xJTkVfXywgb3JpZ2luYWwtPmlkLCBjb3B5LT5pZCk7IFwKKwlpZiAob3JpZ2luYWwtPmxhYyAhPSBjb3B5LT5sYWMpIFwKKwkJZnByaW50ZihzdGRlcnIsICJMQUMgZG8gbm90IG1hdGNoIGluICVzOiVkICVkICVkXG4iLCBcCisJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBvcmlnaW5hbC0+bGFjLCBjb3B5LT5sYWMpOyBcCisJaWYgKG9yaWdpbmFsLT5hdXRob3JpemVkICE9IGNvcHktPmF1dGhvcml6ZWQpIFwKKwkJZnByaW50ZihzdGRlcnIsICJBdXRob3JpemUgZG8gbm90IG1hdGNoIGluICVzOiVkICVkICVkXG4iLCBcCisJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBvcmlnaW5hbC0+YXV0aG9yaXplZCwgXAorCQkJY29weS0+YXV0aG9yaXplZCk7IFwKKwlpZiAoc3RyY21wKG9yaWdpbmFsLT5pbXNpLCBjb3B5LT5pbXNpKSAhPSAwKSBcCisJCWZwcmludGYoc3RkZXJyLCAiSU1TSXMgZG8gbm90IG1hdGNoIGluICVzOiVkICclcycgJyVzJ1xuIiwgXAorCQkJX19GVU5DVElPTl9fLCBfX0xJTkVfXywgb3JpZ2luYWwtPmltc2ksIGNvcHktPmltc2kpOyBcCisJaWYgKG9yaWdpbmFsLT50bXNpICE9IGNvcHktPnRtc2kpIFwKKwkJZnByaW50ZihzdGRlcnIsICJUTVNJcyBkbyBub3QgbWF0Y2ggaW4gJXM6JWQgJyV1JyAnJXUnXG4iLCBcCisJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBvcmlnaW5hbC0+dG1zaSwgY29weS0+dG1zaSk7IFwKKwlpZiAoc3RyY21wKG9yaWdpbmFsLT5uYW1lLCBjb3B5LT5uYW1lKSAhPSAwKSBcCisJCWZwcmludGYoc3RkZXJyLCAibmFtZXMgZG8gbm90IG1hdGNoIGluICVzOiVkICclcycgJyVzJ1xuIiwgXAorCQkJX19GVU5DVElPTl9fLCBfX0xJTkVfXywgb3JpZ2luYWwtPm5hbWUsIGNvcHktPm5hbWUpOyBcCisJaWYgKHN0cmNtcChvcmlnaW5hbC0+ZXh0ZW5zaW9uLCBjb3B5LT5leHRlbnNpb24pICE9IDApIFwKKwkJZnByaW50ZihzdGRlcnIsICJuYW1lcyBkbyBub3QgbWF0Y2ggaW4gJXM6JWQgJyVzJyAnJXMnXG4iLCBcCisJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBvcmlnaW5hbC0+ZXh0ZW5zaW9uLCBjb3B5LT5leHRlbnNpb24pOyBcCisKK2ludCBtYWluKCkgeworCisJaWYgKGRiX2luaXQoImhsci5zcWxpdGUzIikpIHsKKwkJcHJpbnRmKCJEQjogRmFpbGVkIHRvIGluaXQgZGF0YWJhc2UuIFBsZWFzZSBjaGVjayB0aGUgb3B0aW9uIHNldHRpbmdzLlxuIik7CisJCXJldHVybiAxOworCX0JIAorCXByaW50ZigiREI6IERhdGFiYXNlIGluaXRpYWxpemVkLlxuIik7CisKKwlpZiAoZGJfcHJlcGFyZSgpKSB7CisJCXByaW50ZigiREI6IEZhaWxlZCB0byBwcmVwYXJlIGRhdGFiYXNlLlxuIik7CisJCXJldHVybiAxOworCX0KKwlwcmludGYoIkRCOiBEYXRhYmFzZSBwcmVwYXJlZC5cbiIpOworCisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICphbGljZSA9IE5VTEw7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICphbGljZV9kYjsKKworCWNoYXIgKmFsaWNlX2ltc2kgPSAiMzI0MzI0NTQzMjM0NSI7CisJYWxpY2UgPSBkYl9jcmVhdGVfc3Vic2NyaWJlcihOVUxMLCBhbGljZV9pbXNpKTsKKwlkYl9zeW5jX3N1YnNjcmliZXIoYWxpY2UpOworCWFsaWNlX2RiID0gZGJfZ2V0X3N1YnNjcmliZXIoTlVMTCwgR1NNX1NVQlNDUklCRVJfSU1TSSwgYWxpY2UtPmltc2kpOworCUNPTVBBUkUoYWxpY2UsIGFsaWNlX2RiKTsKKwlzdWJzY3JfcHV0KGFsaWNlX2RiKTsKKwlzdWJzY3JfcHV0KGFsaWNlKTsKKworCWFsaWNlX2ltc2kgPSAiMzY5MzI0NTQyMzQ0NSI7CisJYWxpY2UgPSBkYl9jcmVhdGVfc3Vic2NyaWJlcihOVUxMLCBhbGljZV9pbXNpKTsKKwlkYl9zdWJzY3JpYmVyX2Fzc29jX2ltZWkoYWxpY2UsICIxMjM0NTY3ODkwIik7CisJZGJfc3Vic2NyaWJlcl9hbGxvY190bXNpKGFsaWNlKTsKKwlhbGljZS0+bGFjPTQyOworCWRiX3N5bmNfc3Vic2NyaWJlcihhbGljZSk7CisJYWxpY2VfZGIgPSBkYl9nZXRfc3Vic2NyaWJlcihOVUxMLCBHU01fU1VCU0NSSUJFUl9JTVNJLCBhbGljZV9pbXNpKTsKKwlDT01QQVJFKGFsaWNlLCBhbGljZV9kYik7CisJc3Vic2NyX3B1dChhbGljZSk7CisJc3Vic2NyX3B1dChhbGljZV9kYik7CisKKwlhbGljZV9pbXNpID0gIjk5OTMyNDU0MjM0NDUiOworCWFsaWNlID0gZGJfY3JlYXRlX3N1YnNjcmliZXIoTlVMTCwgYWxpY2VfaW1zaSk7CisJZGJfc3Vic2NyaWJlcl9hbGxvY190bXNpKGFsaWNlKTsKKwlhbGljZS0+bGFjPTQyOworCWRiX3N5bmNfc3Vic2NyaWJlcihhbGljZSk7CisJZGJfc3Vic2NyaWJlcl9hc3NvY19pbWVpKGFsaWNlLCAiMTIzNDU2Nzg5MCIpOworCWRiX3N1YnNjcmliZXJfYXNzb2NfaW1laShhbGljZSwgIjY1NDM1NjA5MjAiKTsKKwlhbGljZV9kYiA9IGRiX2dldF9zdWJzY3JpYmVyKE5VTEwsIEdTTV9TVUJTQ1JJQkVSX0lNU0ksIGFsaWNlX2ltc2kpOworCUNPTVBBUkUoYWxpY2UsIGFsaWNlX2RiKTsKKwlzdWJzY3JfcHV0KGFsaWNlKTsKKwlzdWJzY3JfcHV0KGFsaWNlX2RiKTsKKworCWRiX2ZpbmkoKTsKKworCXJldHVybiAwOworfQorCisvKiBzdHVicyAqLwordm9pZCBpbnB1dF9ldmVudCh2b2lkKSB7fQordm9pZCBubV9zdGF0ZV9ldmVudCh2b2lkKSB7fQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy90ZXN0cy9kZWJ1Zy9NYWtlZmlsZS5hbSBiL29wZW5ic2MvdGVzdHMvZGVidWcvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQyM2ZkMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvZGVidWcvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw2IEBACitJTkNMVURFUyA9ICQoYWxsX2luY2x1ZGVzKSAtSSQodG9wX3NyY2RpcikvaW5jbHVkZQorQU1fQ0ZMQUdTPS1XYWxsICQoTElCT1NNT0NPUkVfQ0ZMQUdTKQorbm9pbnN0X1BST0dSQU1TID0gZGVidWdfdGVzdAorCitkZWJ1Z190ZXN0X1NPVVJDRVMgPSBkZWJ1Z190ZXN0LmMgJCh0b3Bfc3JjZGlyKS9zcmMvZGVidWcuYyAKK2RlYnVnX3Rlc3RfTERBREQgPSAkKExJQk9TTU9DT1JFX0xJQlMpCmRpZmYgLS1naXQgYS9vcGVuYnNjL3Rlc3RzL2RlYnVnL2RlYnVnX3Rlc3QuYyBiL29wZW5ic2MvdGVzdHMvZGVidWcvZGVidWdfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZTQ4MzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3Rlc3RzL2RlYnVnL2RlYnVnX3Rlc3QuYwpAQCAtMCwwICsxLDQzIEBACisvKiBzaW1wbGUgdGVzdCBmb3IgdGhlIGRlYnVnIGludGVyZmFjZSAqLworLyoKKyAqIChDKSAyMDA4LCAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKwlzdHJ1Y3QgbG9nX3RhcmdldCAqc3RkZXJyX3RhcmdldDsKKworCWxvZ19pbml0KCZsb2dfaW5mbyk7CisJc3RkZXJyX3RhcmdldCA9IGxvZ190YXJnZXRfY3JlYXRlX3N0ZGVycigpOworCWxvZ19hZGRfdGFyZ2V0KHN0ZGVycl90YXJnZXQpOworCWxvZ19zZXRfYWxsX2ZpbHRlcihzdGRlcnJfdGFyZ2V0LCAxKTsKKworCWxvZ19wYXJzZV9jYXRlZ29yeV9tYXNrKHN0ZGVycl90YXJnZXQsICJEUkxMIik7CisJREVCVUdQKERDQywgIllvdSBzaG91bGQgbm90IHNlZSB0aGlzXG4iKTsKKworCWxvZ19wYXJzZV9jYXRlZ29yeV9tYXNrKHN0ZGVycl90YXJnZXQsICJEUkxMOkRDQyIpOworCURFQlVHUChEUkxMLCAiWW91IHNob3VsZCBzZWUgdGhpc1xuIik7CisJREVCVUdQKERDQywgIllvdSBzaG91bGQgc2VlIHRoaXNcbiIpOworCURFQlVHUChETU0sICJZb3Ugc2hvdWxkIG5vdCBzZWUgdGhpc1xuIik7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2MvdGVzdHMvZ3NtMDQwOC9NYWtlZmlsZS5hbSBiL29wZW5ic2MvdGVzdHMvZ3NtMDQwOC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOThjNjczCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy90ZXN0cy9nc20wNDA4L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNiBAQAorSU5DTFVERVMgPSAkKGFsbF9pbmNsdWRlcykgLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUKK0FNX0NGTEFHUz0tV2FsbCAkKExJQk9TTU9DT1JFX0NGTEFHUykKK25vaW5zdF9QUk9HUkFNUyA9IGdzbTA0MDhfdGVzdAorCitnc20wNDA4X3Rlc3RfU09VUkNFUyA9IGdzbTA0MDhfdGVzdC5jCitnc20wNDA4X3Rlc3RfTERBREQgPSAkKHRvcF9idWlsZGRpcikvc3JjL2xpYmJzYy5hICQodG9wX2J1aWxkZGlyKS9zcmMvbGlibXNjLmEgJCh0b3BfYnVpbGRkaXIpL3NyYy9saWJic2MuYSAkKExJQk9TTU9DT1JFX0xJQlMpIC1sZGJpCmRpZmYgLS1naXQgYS9vcGVuYnNjL3Rlc3RzL2dzbTA0MDgvZ3NtMDQwOF90ZXN0LmMgYi9vcGVuYnNjL3Rlc3RzL2dzbTA0MDgvZ3NtMDQwOF90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg3ZDRlZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvZ3NtMDQwOC9nc20wNDA4X3Rlc3QuYwpAQCAtMCwwICsxLDExMiBAQAorLyogc2ltcGxlIHRlc3QgZm9yIHRoZSBnc20wNDA4IGZvcm1hdHRpbmcgZnVuY3Rpb25zICovCisvKgorICogKEMpIDIwMDggYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisKKyNkZWZpbmUgQ09NUEFSRShyZXN1bHQsIG9wLCB2YWx1ZSkgXAorICAgIGlmICghKChyZXN1bHQpIG9wICh2YWx1ZSkpKSB7XAorCWZwcmludGYoc3RkZXJyLCAiQ29tcGFyZSBmYWlsZWQuIFdhcyAleCBzaG91bGQgYmUgJXggaW4gJXM6JWRcbiIscmVzdWx0LCB2YWx1ZSwgX19GSUxFX18sIF9fTElORV9fKTsgXAorCWV4aXQoLTEpOyBcCisgICAgfQorCisjZGVmaW5lIENPTVBBUkVfU1RSKHJlc3VsdCwgdmFsdWUpIFwKKwlpZiAoc3RyY21wKHJlc3VsdCwgdmFsdWUpICE9IDApIHsgXAorCQlmcHJpbnRmKHN0ZGVyciwgIkNvbXBhcmUgZmFpbGVkLiBXYXMgJXMgc2hvdWxkIGJlICVzIGluICVzOiVkXG4iLHJlc3VsdCwgdmFsdWUsIF9fRklMRV9fLCBfX0xJTkVfXyk7IFwKKwkJZXhpdCgtMSk7IFwKKwl9CisKKy8qCisgKiBUZXN0IExvY2F0aW9uIEFyZWEgSWRlbnRpZmllciBmb3JtYXR0aW5nLiBUYWJsZSAxMC41LjMgb2YgMDQuMDgKKyAqLworc3RhdGljIHZvaWQgdGVzdF9sb2NhdGlvbl9hcmVhX2lkZW50aWZpZXIodm9pZCkKK3sKKyAgICBzdHJ1Y3QgZ3NtNDhfbG9jX2FyZWFfaWQgbGFpNDg7CisKKyAgICBwcmludGYoIlRlc3RpbmcgdGVzdCBsb2NhdGlvbiBhcmVhIGlkZW50aWZpZXJcbiIpOworCisgICAgLyoKKyAgICAgKiBUZXN0IHRoZSBkZWZhdWx0L3Rlc3Qgc2V0dXAuIENvbWluZyBmcm9tCisgICAgICogYnNjX2hhY2suYyBkdW1wcworICAgICAqLworICAgIGdzbTQ4X2dlbmVyYXRlX2xhaSgmbGFpNDgsIDEsIDEsIDEpOworICAgIENPTVBBUkUobGFpNDguZGlnaXRzWzBdLCA9PSwgMHgwMCk7CisgICAgQ09NUEFSRShsYWk0OC5kaWdpdHNbMV0sID09LCAweEYxKTsKKyAgICBDT01QQVJFKGxhaTQ4LmRpZ2l0c1syXSwgPT0sIDB4MTApOworICAgIENPTVBBUkUobGFpNDgubGFjLCA9PSwgaHRvbnMoMHgwMDAxKSk7CisKKyAgICBnc200OF9nZW5lcmF0ZV9sYWkoJmxhaTQ4LCA2MDIsIDEsIDE1KTsKKyAgICBDT01QQVJFKGxhaTQ4LmRpZ2l0c1swXSwgPT0sIDB4MDYpOworICAgIENPTVBBUkUobGFpNDguZGlnaXRzWzFdLCA9PSwgMHhGMik7CisgICAgQ09NUEFSRShsYWk0OC5kaWdpdHNbMl0sID09LCAweDEwKTsKKyAgICBDT01QQVJFKGxhaTQ4LmxhYywgPT0sIGh0b25zKDB4MDAwZikpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X21pX2Z1bmN0aW9uYWxpdHkodm9pZCkKK3sKKwljb25zdCBjaGFyICppbXNpX29kZCAgPSAiOTg3NjU0MzIxMDk4NzYzIjsKKwljb25zdCBjaGFyICppbXNpX2V2ZW4gPSAiOTg3NjU0MzIxMDk4NzY1NCI7CisJY29uc3QgdV9pbnQzMl90IHRtc2kgPSAweGZhYmVhY2QwOworCXVfaW50OF90IG1pWzEyOF07CisJdW5zaWduZWQgaW50IG1pX2xlbjsKKwljaGFyIG1pX3BhcnNlZFtHU000OF9NSV9TSVpFXTsKKworCXByaW50ZigiVGVzdGluZyBwYXJzaW5nIGFuZCBnZW5lcmF0aW5nIFRNU0kvSU1TSVxuIik7CisKKwkvKiB0bXNpIGNvZGUgKi8KKwltaV9sZW4gPSBnc200OF9nZW5lcmF0ZV9taWRfZnJvbV90bXNpKG1pLCB0bXNpKTsKKwlnc200OF9taV90b19zdHJpbmcobWlfcGFyc2VkLCBzaXplb2YobWlfcGFyc2VkKSwgbWkgKyAyLCBtaV9sZW4gLSAyKTsKKwlDT01QQVJFKCh1X2ludDMyX3Qpc3RydG91bChtaV9wYXJzZWQsIE5VTEwsIDEwKSwgPT0sIHRtc2kpOworCisJLyogaW1zaSBjb2RlICovCisJbWlfbGVuID0gZ3NtNDhfZ2VuZXJhdGVfbWlkX2Zyb21faW1zaShtaSwgaW1zaV9vZGQpOworCWdzbTQ4X21pX3RvX3N0cmluZyhtaV9wYXJzZWQsIHNpemVvZihtaV9wYXJzZWQpLCBtaSArIDIsIG1pX2xlbiAtMik7CisJcHJpbnRmKCJoZXg6ICVzXG4iLCBoZXhkdW1wKG1pLCBtaV9sZW4pKTsKKwlDT01QQVJFX1NUUihtaV9wYXJzZWQsIGltc2lfb2RkKTsKKworCW1pX2xlbiA9IGdzbTQ4X2dlbmVyYXRlX21pZF9mcm9tX2ltc2kobWksIGltc2lfZXZlbik7CisJZ3NtNDhfbWlfdG9fc3RyaW5nKG1pX3BhcnNlZCwgc2l6ZW9mKG1pX3BhcnNlZCksIG1pICsgMiwgbWlfbGVuIC0yKTsKKwlwcmludGYoImhleDogJXNcbiIsIGhleGR1bXAobWksIG1pX2xlbikpOworCUNPTVBBUkVfU1RSKG1pX3BhcnNlZCwgaW1zaV9ldmVuKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworCXRlc3RfbG9jYXRpb25fYXJlYV9pZGVudGlmaWVyKCk7CisJdGVzdF9taV9mdW5jdGlvbmFsaXR5KCk7CisKKwlleGl0KDApOworfQorCisKKworLyoKKyAqIFN0dWJzIHRvIGNvbXBpbGUgYW5kIGxpbmsKKyAqLwordm9pZCBpbnB1dF9ldmVudCh2b2lkKSB7fQordm9pZCBubV9zdGF0ZV9ldmVudCh2b2lkKSB7fQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy90ZXN0cy9zY2NwL01ha2VmaWxlLmFtIGIvb3BlbmJzYy90ZXN0cy9zY2NwL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNTY5M2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3Rlc3RzL3NjY3AvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw4IEBACitJTkNMVURFUyA9ICQoYWxsX2luY2x1ZGVzKSAtSSQodG9wX3NyY2RpcikvaW5jbHVkZQorQU1fQ0ZMQUdTPS1XYWxsIC1nZ2RiMyAkKExJQk9TTU9DT1JFX0NGTEFHUykKKworbm9pbnN0X1BST0dSQU1TID0gc2NjcF90ZXN0CisKK3NjY3BfdGVzdF9TT1VSQ0VTID0gc2NjcF90ZXN0LmMKK3NjY3BfdGVzdF9MREFERCA9ICQodG9wX2J1aWxkZGlyKS9zcmMvbGlic2NjcC5hICQodG9wX2J1aWxkZGlyKS9zcmMvbGliYnNjLmEgJChMSUJPU01PQ09SRV9MSUJTKQorCmRpZmYgLS1naXQgYS9vcGVuYnNjL3Rlc3RzL3NjY3Avc2NjcF90ZXN0LmMgYi9vcGVuYnNjL3Rlc3RzL3NjY3Avc2NjcF90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFlYjQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvc2NjcC9zY2NwX3Rlc3QuYwpAQCAtMCwwICsxLDg1MSBAQAorLyoKKyAqIFNDQ1AgdGVzdGluZyBjb2RlCisgKgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMDkgYnkgT24tV2F2ZXMKKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorCisjaW5jbHVkZSA8c2NjcC9zY2NwLmg+CisKKyNkZWZpbmUgTUlOKHgsIHkpICgoeCkgPCAoeSkgPyAoeCkgOiAoeSkpCisKKy8qIEJTQyAtPiBNU0MgKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBic3NtYXBfcmVzZXRbXSA9IHsKKwkweDA5LCAweDAwLCAweDAzLCAweDA1LCAweDA3LCAweDAyLCAweDQyLCAweGZlLAorCTB4MDIsIDB4NDIsIDB4ZmUsIDB4MDYsIDB4MDAsIDB4MDQsIDB4MzAsIDB4MDQsCisJMHgwMSwgMHgyMCwKK307CisKKy8qIE1TQyAtPiBCU0MgcmVzZXQgYWNrICovCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgYnNzbWFwX3Jlc2V0X2Fja1tdID0geworCTB4MDksIDB4MDAsIDB4MDMsIDB4MDcsIDB4MGIsIDB4MDQsIDB4NDMsIDB4MDEsCisJMHgwMCwgMHhmZSwgMHgwNCwgMHg0MywgMHg1YywgMHgwMCwgMHhmZSwgMHgwMywKKwkweDAwLCAweDAxLCAweDMxLAorfTsKKworLyogTVNDIC0+IEJTQyBwYWdpbmcsIGNvbm5lY3Rpb24gbGVzcyAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IGJzc21hcF9wYWdpbmdbXSA9IHsKKwkweDA5LCAweDAwLCAweDAzLCAweDA3LCAweDBiLCAweDA0LCAweDQzLCAweDAxLAorCTB4MDAsIDB4ZmUsIDB4MDQsIDB4NDMsIDB4NWMsIDB4MDAsIDB4ZmUsIDB4MTAsCisJMHgwMCwgMHgwZSwgMHg1MiwgMHgwOCwgMHgwOCwgMHgyOSwgMHg0NywgMHgxMCwKKwkweDAyLCAweDAxLCAweDMxLCAweDk3LCAweDYxLCAweDFhLCAweDAxLCAweDA2LAorfTsKKworLyogTVNDIC0+IEJTQyBwYWdpbmcsIFVEVCB3aXRob3V0IFBDICAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IGJzc21hcF91ZHRbXSA9IHsKKwkweDA5LCAweDAwLCAweDAzLCAweDA1LCAweDA3LCAweDAyLCAweDQyLCAweGZlLAorCTB4MDIsIDB4NDIsIDB4ZmUsIDB4MTAsIDB4MDAsIDB4MGUsIDB4NTIsIDB4MDgsCisJMHgwOCwgMHgyOSwgMHg0NywgMHgxMCwgMHgwMiwgMHgwMSwgMHgzMSwgMHg5NywKKwkweDYxLCAweDFhLCAweDAxLCAweDA2LAorfTsKKworLyogQlNDIC0+IE1TQyBjb25uZWN0aW9uIG9wZW4gKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBic3NtYXBfY3JbXSA9IHsKKwkweDAxLCAweDAxLCAweDAyLCAweDAzLCAweDAyLCAweDAyLCAweDA0LCAweDAyLAorCTB4NDIsIDB4ZmUsIDB4MGYsIDB4MWYsIDB4MDAsIDB4MWQsIDB4NTcsIDB4MDUsCisJMHgwOCwgMHgwMCwgMHg3MiwgMHhmNCwgMHg4MCwgMHgyMCwgMHgxMiwgMHhjMywKKwkweDUwLCAweDE3LCAweDEwLCAweDA1LCAweDI0LCAweDExLCAweDAzLCAweDMzLAorCTB4MTksIDB4YTIsIDB4MDgsIDB4MjksIDB4NDcsIDB4MTAsIDB4MDIsIDB4MDEsCisJMHgzMSwgMHg5NywgMHg2MSwgMHgwMAorfTsKKworLyogTVNDIC0+IEJTQyBjb25uZWN0aW9uIGNvbmZpcm0gKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBic3NtYXBfY2NbXSA9IHsKKwkweDAyLCAweDAxLCAweDAyLCAweDAzLCAweDAwLCAweDAwLCAweDAzLCAweDAyLCAweDAxLCAweDAwLAorfTsKKworLyogTVNDIC0+IEJTQyBEVEFQCisgKgorICogd2UgZmFrZSBhIGJpdCBhbmQgbWFrZSBpdCBCU0MgLT4gTVNDLi4uIHNvIHRoZQorICogcGF5bG9hZCBkb2VzIG5vdCBtYWtlIGFueSBzZW5zZS4uCisgKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBic3NtYXBfZHRhcFtdID0geworCTB4MDYsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDEsIDB4MGYsIDB4MDEsIDB4MDAsIDB4MGMsCisJMHgwMywgMHgwNSwgMHg1YywgMHgwOCwgMHgxMSwgMHg4MSwgMHgzMywgMHg2NiwgMHgwMiwgMHgxMywKKwkweDQ1LCAweGY0LAorfTsKKworLyogTVNDIC0+IEJTQyBjbGVhciBjb21tYW5kICovCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgYnNzbWFwX2NsZWFyW10gPSB7CisJMHgwNiwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMSwgMHgwNiwgMHgwMCwgMHgwNCwgMHgyMCwKKwkweDA0LCAweDAxLCAweDA5LAorfTsKKworLyogTVNDIC0+IEJTQyByZWxlYXNlZCAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IGJzc21hcF9yZWxlYXNlZFtdID0geworCTB4MDQsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDAsIDB4MDEsIDB4MGYsCisJMHgwMiwgMHgyMywgMHg0MiwgMHgwMCwKK307CisKKy8qIEJTQyAtPiBNU0MgcmVsZWFzZWQgKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBic3NtYXBfcmVsZWFzZV9jb21wbGV0ZVtdID0geworCTB4MDUsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDMKK307CisKK3N0cnVjdCB0ZXN0X2RhdGEgeworCWludCBsZW5ndGg7CisJY29uc3QgdV9pbnQ4X3QgKmRhdGE7CisJaW50IHBheWxvYWRfc3RhcnQ7CisJaW50IHBheWxvYWRfbGVuZ3RoOworCXVfaW50OF90IGZpcnN0X2J5dGU7CisKKyAgICAgICAgLyogaW4gY2FzZSBpdCBzaG91bGQgdHJpZ2dlciBhIHNjY3AgcmVzcG9uc2UgKi8KKwlpbnQgd3JpdGU7CisJY29uc3QgdV9pbnQ4X3QgICpyZXNwb25zZTsKKwlpbnQgcmVzcG9uc2VfbGVuZ3RoOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0ZXN0X2RhdGEgdGVzdF9kYXRhW10gPSB7CisJeworCQkubGVuZ3RoCQk9IEFSUkFZX1NJWkUoYnNzbWFwX3Jlc2V0KSwKKwkJLmRhdGEJCT0gJmJzc21hcF9yZXNldFswXSwKKwkJLnBheWxvYWRfc3RhcnQJPSAxMiwKKwkJLnBheWxvYWRfbGVuZ3RoID0gQVJSQVlfU0laRShic3NtYXBfcmVzZXQpIC0gMTIsCisJCS5maXJzdF9ieXRlCT0gMHgwLAorCX0sCisJeworCQkubGVuZ3RoCQk9IEFSUkFZX1NJWkUoYnNzbWFwX3Jlc2V0X2FjayksCisJCS5kYXRhCQk9ICZic3NtYXBfcmVzZXRfYWNrWzBdLAorCQkucGF5bG9hZF9zdGFydAk9IDE2LAorCQkucGF5bG9hZF9sZW5ndGggPSBBUlJBWV9TSVpFKGJzc21hcF9yZXNldF9hY2spIC0gMTYsCisJCS5maXJzdF9ieXRlCT0gMHgwLAorCX0sCisJeworCQkubGVuZ3RoCQk9IEFSUkFZX1NJWkUoYnNzbWFwX3BhZ2luZyksCisJCS5kYXRhCQk9ICZic3NtYXBfcGFnaW5nWzBdLAorCQkucGF5bG9hZF9zdGFydAk9IDE2LAorCQkucGF5bG9hZF9sZW5ndGggPSBBUlJBWV9TSVpFKGJzc21hcF9wYWdpbmcpIC0gMTYsCisJCS5maXJzdF9ieXRlCT0gMHgwLAorCX0sCisJeworCQkubGVuZ3RoCQk9IEFSUkFZX1NJWkUoYnNzbWFwX2NyKSwKKwkJLmRhdGEJCT0gJmJzc21hcF9jclswXSwKKwkJLnBheWxvYWRfc3RhcnQJPSAxMiwKKwkJLyogMHgwMCBpcyBlbmQgb2Ygb3B0aW9uYWwgZGF0YSwgc3VidHJhY3QgdGhpcyBieXRlICovCisJCS5wYXlsb2FkX2xlbmd0aCA9IDMxLAorCQkuZmlyc3RfYnl0ZQk9IDB4MCwKKworCQkvKiB0aGUgY29ubmVjdGlvbiByZXF1ZXN0IHNob3VsZCB0cmlnZ2VyIGEgY29ubmVjdGlvbiBjb25maXJtICovCisJCS53cml0ZQkJPSAxLAorCQkucmVzcG9uc2UJPSAmYnNzbWFwX2NjWzBdLAorCQkucmVzcG9uc2VfbGVuZ3RoPSBBUlJBWV9TSVpFKGJzc21hcF9jYyksCisJfSwKKwl7CisJCS5sZW5ndGgJCT0gQVJSQVlfU0laRShic3NtYXBfZHRhcCksCisJCS5kYXRhCQk9ICZic3NtYXBfZHRhcFswXSwKKwkJLnBheWxvYWRfc3RhcnQJPSA3LAorCQkucGF5bG9hZF9sZW5ndGggPSAxNSwKKwkJLmZpcnN0X2J5dGUJPSAweDAxLAorCX0sCisJeworCQkubGVuZ3RoCQk9IEFSUkFZX1NJWkUoYnNzbWFwX2NsZWFyKSwKKwkJLmRhdGEJCT0gJmJzc21hcF9jbGVhclswXSwKKwkJLnBheWxvYWRfc3RhcnQJPSA3LAorCQkucGF5bG9hZF9sZW5ndGggPSA2LAorCQkuZmlyc3RfYnl0ZQk9IDB4MDAsCisJfSwKKwl7CisJCS5sZW5ndGgJCT0gQVJSQVlfU0laRShic3NtYXBfcmVsZWFzZWQpLAorCQkuZGF0YQkJPSAmYnNzbWFwX3JlbGVhc2VkWzBdLAorCQkucGF5bG9hZF9sZW5ndGggPSAyLAorCQkucGF5bG9hZF9zdGFydCAgPSAxMSwKKwkJLmZpcnN0X2J5dGUJPSAweDIzLAorCisJCS53cml0ZQkJPSAxLAorCQkucmVzcG9uc2UJPSAmYnNzbWFwX3JlbGVhc2VfY29tcGxldGVbMF0sCisJCS5yZXNwb25zZV9sZW5ndGg9IEFSUkFZX1NJWkUoYnNzbWFwX3JlbGVhc2VfY29tcGxldGUpLAorCX0sCit9OworCisvKiB3ZSB3aWxsIHNlbmQgVURUcyBhbmQgdmVyaWZ5IHRoZXkgbG9vayBsaWtlIHRoaXMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGVzdF9kYXRhIHNlbmRfZGF0YVtdID0geworCXsKKwkJLmxlbmd0aAkJPSBBUlJBWV9TSVpFKGJzc21hcF91ZHQpLAorCQkuZGF0YQkJPSAmYnNzbWFwX3VkdFswXSwKKwkJLnBheWxvYWRfc3RhcnQJPSAxMiwKKwkJLnBheWxvYWRfbGVuZ3RoID0gQVJSQVlfU0laRShic3NtYXBfdWR0KSAtIDEyLAorCQkuZmlyc3RfYnl0ZQk9IDB4MCwKKwl9LAorCXsKKwkJLmxlbmd0aAkJPSBBUlJBWV9TSVpFKGJzc21hcF9yZXNldCksCisJCS5kYXRhCQk9ICZic3NtYXBfcmVzZXRbMF0sCisJCS5wYXlsb2FkX3N0YXJ0CT0gMTIsCisJCS5wYXlsb2FkX2xlbmd0aCA9IEFSUkFZX1NJWkUoYnNzbWFwX3Jlc2V0KSAtIDEyLAorCQkuZmlyc3RfYnl0ZQk9IDB4MCwKKwl9LAorfTsKKworc3RydWN0IGNvbm5lY3Rpb25fdGVzdCB7CisJLyogc2hvdWxkIHRoZSBjb25uZWN0aW9uIGJlIHJlZnVzZWQ/ICovCisJaW50IHJlZnVzZTsKKworCWludCB3aXRoX2RhdGE7CisKKwkvKiBvbiB3aGljaCBzaWRlIHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uPyAqLworCWludCBjbG9zZV9zaWRlOworCWludCBjbG9zZV9jYXVzZTsKK307CisKKy8qIHNjY3AgY29ubmVjdGlvbiBoYW5kbGluZyB3ZSB3YW50IHRvIHRlc3QgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29ubmVjdGlvbl90ZXN0IGNvbm5lY3Rpb25fdGVzdHNbXSA9IHsKKwl7CisJCS5yZWZ1c2UJPSAxLAorCX0sCisJeworCQkucmVmdXNlCT0gMSwKKwkJLndpdGhfZGF0YSA9IDEsCisJfSwKKwl7CisJCS5yZWZ1c2UgPSAwLAorCQkuY2xvc2Vfc2lkZSA9IDAsCisJCS5jbG9zZV9jYXVzZSA9IDUsCisJfSwKKwl7CisJCS5yZWZ1c2UgPSAwLAorCQkuY2xvc2Vfc2lkZSA9IDAsCisJCS5jbG9zZV9jYXVzZSA9IDUsCisJCS53aXRoX2RhdGEgPSAxLAorCX0sCisJeworCQkucmVmdXNlID0gMCwKKwkJLmNsb3NlX3NpZGUgPSAxLAorCQkuY2xvc2VfY2F1c2UgPSA1LAorCX0sCisJeworCQkucmVmdXNlID0gMCwKKwkJLmNsb3NlX3NpZGUgPSAxLAorCQkuY2xvc2VfY2F1c2UgPSA1LAorCQkud2l0aF9kYXRhID0gMSwKKwl9LAorfTsKKworc3RydWN0IHNjY3BfcGFyc2VfaGVhZGVyX3Jlc3VsdCB7CisJLyogcmVzdWx0cyAqLworCWludCBtc2dfdHlwZTsKKwlpbnQgd2FudGVkX2xlbjsKKwlpbnQgc3JjX3NzbjsKKwlpbnQgZHN0X3NzbjsKKworCWludCBoYXNfc3JjX3JlZiwgaGFzX2RzdF9yZWY7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSBzcmNfcmVmOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgZHN0X3JlZjsKKworCS8qIHRoZSBpbnB1dCAqLworCWNvbnN0IHVfaW50OF90ICppbnB1dDsKKwlpbnQgaW5wdXRfbGVuOworfTsKKworc3RhdGljIGNvbnN0IHVfaW50OF90IGl0X3Rlc3RbXSA9IHsKKzB4MTAsIDB4MDEsIDB4MDcsIAorMHg5NCwgMHgwMSwgMHgwNCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCB9OworCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgcHJvdG9fZXJyW10gPSB7CisweDBmLCAweDBjLCAweDA0LCAweDAwLCAweDAwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzY2NwX3BhcnNlX2hlYWRlcl9yZXN1bHQgcGFyc2VfcmVzdWx0W10gPSB7CisJeworCQkubXNnX3R5cGUJPSBTQ0NQX01TR19UWVBFX0lULAorCQkud2FudGVkX2xlbgk9IDAsCisJCS5zcmNfc3NuCT0gLTEsCisJCS5kc3Rfc3NuCT0gLTEsCisJCS5oYXNfc3JjX3JlZgk9IDEsCisJCS5oYXNfZHN0X3JlZgk9IDEsCisKKwkJLnNyY19yZWYJPSB7CisJCQkub2N0ZXQxID0gMHgwMSwKKwkJCS5vY3RldDIgPSAweDA0LAorCQkJLm9jdGV0MyA9IDB4MDAKKwkJfSwKKwkJLmRzdF9yZWYJPSB7CisJCQkub2N0ZXQxID0gMHgwMSwKKwkJCS5vY3RldDIgPSAweDA3LAorCQkJLm9jdGV0MyA9IDB4OTQsCisJCX0sCisKKwkJLmlucHV0CQk9IGl0X3Rlc3QsCisJCS5pbnB1dF9sZW4JPSBzaXplb2YoaXRfdGVzdCksCisJfSwKKwl7CisJCS5tc2dfdHlwZQk9IFNDQ1BfTVNHX1RZUEVfRVJSLAorCQkud2FudGVkX2xlbgk9IDAsCisJCS5zcmNfc3NuCT0gLTEsCisJCS5kc3Rfc3NuCT0gLTEsCisJCS5oYXNfc3JjX3JlZgk9IDAsCisJCS5oYXNfZHN0X3JlZgk9IDEsCisJCS5kc3RfcmVmCT0geworCQkJLm9jdGV0MSA9IDB4MGMsCisJCQkub2N0ZXQyID0gMHgwNCwKKwkJCS5vY3RldDMgPSAweDAwLAorCQl9LAorCQkuaW5wdXQJCT0gcHJvdG9fZXJyLAorCQkuaW5wdXRfbGVuCT0gc2l6ZW9mKHByb3RvX2VyciksCisJfSwKK307CisKKworLyogdGVzdGluZyBwcm9jZWR1cmU6CisgKgktIHdlIHdpbGwgdXNlIHNjY3Bfd3JpdGUgYW5kIHNlZSB3aGF0IHdpbGwgYmUgc2V0IGluIHRoZQorICoJICBvdXRnb2luZyBjYWxsYmFjaworICoJLSB3ZSB3aWxsIGNhbGwgc2NjcF9zeXN0ZW1faW5jb21pbmcgYW5kIHNlZSB3aGljaCBjYWxscworICoJICBhcmUgbWFkZS4gQW5kIHRoZW4gY29tcGFyZSBpdCB0byB0aGUgb25lcyB3ZSBleHBlY3QuIFdlCisgKgkgIHdhbnQgdGhlIHBheWxvYWQgdG8gYXJyaXZlLCBvciBjYWxsYmFja3MgdG8gYmUgY2FsbGVkLgorICoJLSB3ZSB3aWxsIHVzZSBzY2NwX2Nvbm5lY3Rpb25fc29ja2V0IGFuZCBzY2NwX2Nvbm5lY3Rpb25fd3JpdGUKKyAqCSAgYW5kIHZlcmlmeSBzdGF0ZSBoYW5kbGluZyBvZiBjb25uZWN0aW9ucworICovCisKK3N0YXRpYyBpbnQgY3VycmVudF90ZXN0OworCisvKgorICogdGVzdCBzdGF0ZS4uLgorICovCitzdGF0aWMgaW50IGNhbGxlZCAgPSAwOworc3RhdGljIGludCBtYXRjaGVkID0gMDsKK3N0YXRpYyBpbnQgd3JpdGVfY2FsbGVkID0gMDsKKworI2RlZmluZSBGQUlMKHgsIGFyZ3MuLi4pIHByaW50ZigiRkFJTFVSRSBpbiAlczolZDogIiB4LCBfX0ZJTEVfXywgX19MSU5FX18sICMjIGFyZ3MpCisKKy8qCisgKiB3cml0aW5nIHRoZXNlIHBhY2tldHMgYW5kIGV4cGVjdGluZyBhIHJlc3VsdAorICovCitpbnQgc2NjcF9yZWFkX2NiKHN0cnVjdCBtc2diICpkYXRhLCB1bnNpZ25lZCBsZW4sIHZvaWQgKmNvbnRleHQpCit7CisJdV9pbnQxNl90IHBheWxvYWRfbGVuZ3RoID0gdGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0ucGF5bG9hZF9sZW5ndGg7CisJY29uc3QgdV9pbnQ4X3QgKmdvdCwgKndhbnRlZDsKKwlpbnQgaTsKKworCWNhbGxlZCA9IDE7CisKKwlpZiAobXNnYl9sM2xlbihkYXRhKSA8IGxlbikgeworCQkvKiB0aGlzIHNob3VsZCBuZXZlciBiZSByZWFjaGVkICovCisJCUZBSUwoIlNvbWV0aGluZyBob3JyaWJsZSBoYXBwZW5lZC4uIGludmFsaWQgcGFja2V0Li5cbiIpOworCQlleGl0KC0xKTsKKwl9CisKKwlpZiAobGVuID09IDAgfHwgbGVuICE9IHBheWxvYWRfbGVuZ3RoKSB7CisJCUZBSUwoImxlbmd0aCBtaXNtYXRjaDogZ290OiAlZCB3YW50ZWQ6ICVkXG4iLCBtc2diX2wzbGVuKGRhdGEpLCBwYXlsb2FkX2xlbmd0aCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoZGF0YS0+bDNoWzBdICE9ICB0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5maXJzdF9ieXRlKSB7CisJCUZBSUwoIlRoZSBmaXJzdCBieXRlcyBvZiBsMyBkbyBub3QgbWF0Y2g6IDB4JXggMHgleFxuIiwKKwkJCWRhdGEtPmwzaFswXSwgdGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0uZmlyc3RfYnl0ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlnb3QgPSAmZGF0YS0+bDNoWzBdOworCXdhbnRlZCA9IHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLmRhdGEgKyB0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5wYXlsb2FkX3N0YXJ0OworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisJCWlmIChnb3RbaV0gIT0gd2FudGVkW2ldKSB7CisJCQlGQUlMKCJGYWlsZWQgdG8gY29tcGFyZSBieXRlLiBHb3Q6IDB4JXggV2FudGVkOiAweCV4IGF0ICVkXG4iLAorCQkJICAgICBnb3RbaV0sIHdhbnRlZFtpXSwgaSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwltYXRjaGVkID0gMTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBzY2NwX3dyaXRlX2NiKHN0cnVjdCBtc2diICpkYXRhLCB2b2lkICpjdHgpCit7CisJaW50IGkgPSAwOworCWNvbnN0IHVfaW50OF90ICpnb3QsICp3YW50ZWQ7CisKKwlpZiAodGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0ucmVzcG9uc2UgPT0gTlVMTCkgeworCQlGQUlMKCJEaWRuJ3QgZXhwZWN0IHdyaXRlIGNhbGxiYWNrXG4iKTsKKwkJZ290byBleGl0OworCX0gZWxzZSBpZiAodGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0ucmVzcG9uc2VfbGVuZ3RoICE9IG1zZ2JfbDJsZW4oZGF0YSkpIHsKKwkJRkFJTCgiU2l6ZSBkb2VzIG5vdCBtYXRjaC4gR290OiAlZCBXYW50ZWQ6ICVkXG4iLAorCQkgICAgIG1zZ2JfbDJsZW4oZGF0YSksIHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLnJlc3BvbnNlX2xlbmd0aCk7CisJfQorCisJZ290ID0gJmRhdGEtPmwyaFswXTsKKwl3YW50ZWQgPSB0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5yZXNwb25zZTsKKworCWZvciAoaSA9IDA7IGkgPCBtc2diX2wybGVuKGRhdGEpOyArK2kpIHsKKwkJaWYgKGdvdFtpXSAhPSB3YW50ZWRbaV0pIHsKKwkJCUZBSUwoIkZhaWxlZCB0byBjb21wYXJlIGJ5dGUuIEdvdDogMHgleCBXYW50ZWQ6IDB4JXggYXQgJWRcbiIsCisJCQkgICAgIGdvdFtpXSwgd2FudGVkW2ldLCBpKTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCX0KKworCXdyaXRlX2NhbGxlZCA9IDE7CisKK2V4aXQ6CisJbXNnYl9mcmVlKGRhdGEpOworfQorCit2b2lkIHNjY3BfY19yZWFkKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBtc2diICptc2diLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXNjY3BfcmVhZF9jYihtc2diLCBsZW4sIGNvbm5lY3Rpb24tPmRhdGFfY3R4KTsKK30KKwordm9pZCBzY2NwX2Nfc3RhdGUoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgaW50IG9sZF9zdGF0ZSkKK3sKKwlpZiAoY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZSA+PSBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVMRUFTRV9DT01QTEVURSkKKwkJc2NjcF9jb25uZWN0aW9uX2ZyZWUoY29ubmVjdGlvbik7Cit9CisKK2ludCBzY2NwX2FjY2VwdF9jYihzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCB2b2lkICp1c2VyX2RhdGEpCit7CisJY2FsbGVkID0gMTsKKwl1bnNpZ25lZCBpbnQgcmVmID0gMDsKKwlyZWYgfD0gY29ubmVjdGlvbi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLm9jdGV0MSA8PCAyNDsKKwlyZWYgfD0gY29ubmVjdGlvbi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLm9jdGV0MiA8PCAxNjsKKwlyZWYgfD0gY29ubmVjdGlvbi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLm9jdGV0MyA8PCAgODsKKwlyZWYgPSBudG9obChyZWYpOworCisJY29ubmVjdGlvbi0+ZGF0YV9jYiA9IHNjY3BfY19yZWFkOworCWNvbm5lY3Rpb24tPnN0YXRlX2NiID0gc2NjcF9jX3N0YXRlOworCisJLyogYWNjZXB0IHRoaXMgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2NjcF91ZHRfd3JpdGVfY2Ioc3RydWN0IG1zZ2IgKmRhdGEsIHZvaWQgKmNvbnRleHQpCit7CisJY29uc3QgdV9pbnQ4X3QgKmdvdCwgKndhbnRlZDsKKwlpbnQgaTsKKworCXdyaXRlX2NhbGxlZCA9IDE7CisKKwlpZiAoc2VuZF9kYXRhW2N1cnJlbnRfdGVzdF0ubGVuZ3RoICE9IG1zZ2JfbDJsZW4oZGF0YSkpIHsKKwkJRkFJTCgiU2l6ZSBkb2VzIG5vdCBtYXRjaC4gR290OiAlZCBXYW50ZWQ6ICVkXG4iLAorCQkgICAgIG1zZ2JfbDJsZW4oZGF0YSksIHNlbmRfZGF0YVtjdXJyZW50X3Rlc3RdLmxlbmd0aCk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlnb3QgPSAmZGF0YS0+bDJoWzBdOworCXdhbnRlZCA9IHNlbmRfZGF0YVtjdXJyZW50X3Rlc3RdLmRhdGE7CisKKwlmb3IgKGkgPSAwOyBpIDwgbXNnYl9sMmxlbihkYXRhKTsgKytpKSB7CisJCWlmIChnb3RbaV0gIT0gd2FudGVkW2ldKSB7CisJCQlGQUlMKCJGYWlsZWQgdG8gY29tcGFyZSBieXRlLiBHb3Q6IDB4JXggV2FudGVkOiAweCV4IGF0ICVkXG4iLAorCQkJICAgICBnb3RbaV0sIHdhbnRlZFtpXSwgaSk7CisJCQlnb3RvIGV4aXQ7CisJCX0KKwl9CisKKwltYXRjaGVkID0gMTsKKworZXhpdDoKKwltc2diX2ZyZWUoZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfc2NjcF9zeXN0ZW0odm9pZCkKK3sKKwlzY2NwX3N5c3RlbV9pbml0KHNjY3Bfd3JpdGVfY2IsIE5VTEwpOworCXNjY3Bfc2V0X3JlYWQoJnNjY3Bfc3NuX2Jzc2FwLCBzY2NwX3JlYWRfY2IsIE5VTEwpOworCXNjY3BfY29ubmVjdGlvbl9zZXRfaW5jb21pbmcoJnNjY3Bfc3NuX2Jzc2FwLCBzY2NwX2FjY2VwdF9jYiwgTlVMTCk7CisKKwlmb3IgKGN1cnJlbnRfdGVzdCA9IDA7IGN1cnJlbnRfdGVzdCA8IEFSUkFZX1NJWkUodGVzdF9kYXRhKTsgKytjdXJyZW50X3Rlc3QpIHsKKwkJdW5zaWduZWQgaW50IGxlbmd0aCA9IHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLmxlbmd0aDsKKwkJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2NfaGVhZHJvb20obGVuZ3RoICsgMiwgMiwgX19mdW5jX18pOworCQltc2ctPmwyaCA9IG1zZ2JfcHV0KG1zZywgbGVuZ3RoKTsKKwkJbWVtY3B5KG1zZy0+bDJoLCB0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5kYXRhLCBsZW5ndGgpOworCisJCWNhbGxlZCA9IG1hdGNoZWQgPSB3cml0ZV9jYWxsZWQgPSAwOworCQlwcmludGYoIlRlc3RpbmcgcGFja2V0OiAlZFxuIiwgY3VycmVudF90ZXN0KTsKKwkJc2NjcF9zeXN0ZW1faW5jb21pbmcobXNnKTsKKworCQlpZiAoIWNhbGxlZCB8fCAhbWF0Y2hlZCB8fCAodGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0ud3JpdGUgIT0gd3JpdGVfY2FsbGVkKSkKKwkJCUZBSUwoImN1cnJlbnQgdGVzdDogJWQgY2FsbGVkOiAlZCBtYXRjaGVkOiAlZCB3cml0ZTogJWRcbiIsCisJCQkgICAgIGN1cnJlbnRfdGVzdCwgY2FsbGVkLCBtYXRjaGVkLCB3cml0ZV9jYWxsZWQpOworCisJCW1zZ2JfZnJlZShtc2cpOworCX0KK30KKworLyogdGVzdCBzZW5kaW5nIG9mIHVkdCAqLworc3RhdGljIHZvaWQgdGVzdF9zY2NwX3NlbmRfdWR0KHZvaWQpCit7CisJc2NjcF9zeXN0ZW1faW5pdChzY2NwX3VkdF93cml0ZV9jYiwgTlVMTCk7CisJc2NjcF9zZXRfcmVhZChOVUxMLCBOVUxMLCBOVUxMKTsKKwlzY2NwX2Nvbm5lY3Rpb25fc2V0X2luY29taW5nKE5VTEwsIE5VTEwsIE5VTEwpOworCisJZm9yIChjdXJyZW50X3Rlc3QgPSAwOyBjdXJyZW50X3Rlc3QgPCBBUlJBWV9TSVpFKHNlbmRfZGF0YSk7ICsrY3VycmVudF90ZXN0KSB7CisJCWNvbnN0IHN0cnVjdCB0ZXN0X2RhdGEgKnRlc3QgPSAmc2VuZF9kYXRhW2N1cnJlbnRfdGVzdF07CisKKwkJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2ModGVzdC0+cGF5bG9hZF9sZW5ndGgsIF9fZnVuY19fKTsKKwkJbXNnLT5sM2ggPSBtc2diX3B1dChtc2csIHRlc3QtPnBheWxvYWRfbGVuZ3RoKTsKKwkJbWVtY3B5KG1zZy0+bDNoLCB0ZXN0LT5kYXRhICsgdGVzdC0+cGF5bG9hZF9zdGFydCwgdGVzdC0+cGF5bG9hZF9sZW5ndGgpOworCisJCW1hdGNoZWQgPSB3cml0ZV9jYWxsZWQgPSAwOworCQlwcmludGYoIlRlc3RpbmcgcGFja2V0OiAlZFxuIiwgY3VycmVudF90ZXN0KTsKKwkJc2NjcF93cml0ZShtc2csICZzY2NwX3Nzbl9ic3NhcCwgJnNjY3Bfc3NuX2Jzc2FwLCAwKTsKKworCQlpZiAoIW1hdGNoZWQgfHwgIXdyaXRlX2NhbGxlZCkKKwkJCUZBSUwoImN1cnJlbnQgdGVzdDogJWQgbWF0Y2hlZDogJWQgd3JpdGU6ICVkXG4iLAorCQkJICAgICBjdXJyZW50X3Rlc3QsIG1hdGNoZWQsIHdyaXRlX2NhbGxlZCk7CisKKwkJbXNnYl9mcmVlKG1zZyk7CisJfQorfQorCisvKiBzZW5kIHVkdCBmcm9tIG9uZSBlbmQgdG8gYW5vdGhlciAqLworc3RhdGljIHVuc2lnbmVkIGludCB0ZXN0X3ZhbHVlID0gMHgyNDQyOworc3RhdGljIGludCBzY2NwX3VkdF9yZWFkKHN0cnVjdCBtc2diICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuLCB2b2lkICpjb250ZXh0KQoreworCXVuc2lnbmVkIGludCAqdmFsOworCisJaWYgKGxlbiAhPSA0KSB7CisJCUZBSUwoIldyb25nIHNpemU6ICVkXG4iLCBtc2diX2wzbGVuKGRhdGEpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXZhbCA9ICh1bnNpZ25lZCBpbnQqKWRhdGEtPmwzaDsKKwltYXRjaGVkID0gdGVzdF92YWx1ZSA9PSAqdmFsOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNjY3Bfd3JpdGVfbG9vcChzdHJ1Y3QgbXNnYiAqZGF0YSwgdm9pZCAqY29udGV4dCkKK3sKKwkvKiBzZW5kIGl0IGJhY2sgdG8gdXMgKi8KKwlzY2NwX3N5c3RlbV9pbmNvbWluZyhkYXRhKTsKKwltc2diX2ZyZWUoZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfc2NjcF91ZHRfY29tbXVuaWNhdGlvbih2b2lkKQoreworCXN0cnVjdCBtc2diICpkYXRhOworCXVuc2lnbmVkIGludCAqdmFsOworCisJc2NjcF9zeXN0ZW1faW5pdChzY2NwX3dyaXRlX2xvb3AsIE5VTEwpOworCXNjY3Bfc2V0X3JlYWQoJnNjY3Bfc3NuX2Jzc2FwLCBzY2NwX3VkdF9yZWFkLCBOVUxMKTsKKwlzY2NwX2Nvbm5lY3Rpb25fc2V0X2luY29taW5nKE5VTEwsIE5VTEwsIE5VTEwpOworCisKKwlkYXRhID0gbXNnYl9hbGxvYyg0LCAidGVzdCBkYXRhIik7CisJZGF0YS0+bDNoID0gJmRhdGEtPmRhdGFbMF07CisJdmFsID0gKHVuc2lnbmVkIGludCAqKW1zZ2JfcHV0KGRhdGEsIDQpOworCSp2YWwgPSB0ZXN0X3ZhbHVlOworCisJbWF0Y2hlZCA9IDA7CisJc2NjcF93cml0ZShkYXRhLCAmc2NjcF9zc25fYnNzYXAsICZzY2NwX3Nzbl9ic3NhcCwgMCk7CisKKwlpZiAoIW1hdGNoZWQpCisJICAgIEZBSUwoIlRhbGtpbmcgd2l0aCB1cyBkaWRuJ3Qgd29ya1xuIik7CisKKwltc2diX2ZyZWUoZGF0YSk7Cit9CisKKworLyogY29ubmVjdGlvbiB0ZXN0aW5nLi4uIG9wZW4sIHNlbmQsIGNsb3NlICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbm5lY3Rpb25fdGVzdCAqY3VycmVudF9jb25fdGVzdDsKK3N0YXRpYyBzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpvdXRnb2luZ19jb247CitzdGF0aWMgc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqaW5jb21pbmdfY29uOworc3RhdGljIGludCBvdXRnb2luZ19kYXRhLCBpbmNvbWluZ19kYXRhLCBpbmNvbWluZ19zdGF0ZSwgb3V0Z29pbmdfc3RhdGU7CisKK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqdGVzdF9kYXRhMSwgKnRlc3RfZGF0YTIsICp0ZXN0X2RhdGEzOworCitzdGF0aWMgdm9pZCBzY2NwX2Nvbm5faW5fc3RhdGUoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubiwgaW50IG9sZF9zdGF0ZSkKK3sKKwlwcmludGYoIlx0aW5jb21lOiAlZCAtPiAlZFxuIiwgb2xkX3N0YXRlLCBjb25uLT5jb25uZWN0aW9uX3N0YXRlKTsKKwlpZiAoY29ubi0+Y29ubmVjdGlvbl9zdGF0ZSA+PSBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVMRUFTRV9DT01QTEVURSkgeworCQlpZiAoY29ubiA9PSBpbmNvbWluZ19jb24pIHsKKwkJCXNjY3BfY29ubmVjdGlvbl9mcmVlKGNvbm4pOworCQkJaW5jb21pbmdfY29uID0gTlVMTDsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgc2NjcF9jb25uX2luX2RhdGEoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubiwgc3RydWN0IG1zZ2IgKm1zZywgdW5zaWduZWQgaW50IGxlbikKK3sKKwkvKiBjb21wYXJlIHRoZSBkYXRhICovCisJKytpbmNvbWluZ19kYXRhOworCXByaW50ZigiXHRpbmNvbWluZyBkYXRhOiAlZFxuIiwgbGVuKTsKKworCS8qIGNvbXBhcmUgdGhlIGRhdGEgKi8KKwlpZiAobGVuICE9IDQpIHsKKwkJRkFJTCgiTGVuZ3RoIG9mIHBhY2tldCBpcyB3cm9uZzogJXUgJXVcbiIsIG1zZ2JfbDNsZW4obXNnKSwgbGVuKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpbmNvbWluZ19kYXRhID09IDEpIHsKKwkJaWYgKG1lbWNtcChtc2ctPmwzaCwgdGVzdF9kYXRhMS0+bDNoLCBsZW4pICE9IDApIHsKKwkJCUZBSUwoIkNvbXBhcmluZyB0aGUgZGF0YSBmYWlsZWQ6ICVkXG4iLCBpbmNvbWluZ19kYXRhKTsKKwkJCWluY29taW5nX3N0YXRlID0gMDsKKwkJCXByaW50ZigiR290OiAgICAlc1xuIiwgaGV4ZHVtcChtc2ctPmwzaCwgbGVuKSk7CisJCQlwcmludGYoIldhbnRlZDogJXNcbiIsIGhleGR1bXAodGVzdF9kYXRhMS0+bDNoLCBsZW4pKTsKKworCQl9CisJfSBlbHNlIGlmIChpbmNvbWluZ19kYXRhID09IDIpIHsKKwkJaWYgKG1lbWNtcChtc2ctPmwzaCwgdGVzdF9kYXRhMi0+bDNoLCBsZW4pICE9IDApIHsKKwkJCUZBSUwoIkNvbXBhcmluZyB0aGUgZGF0YSBmYWlsZWQ6ICVkXG4iLCBpbmNvbWluZ19kYXRhKTsKKwkJCWluY29taW5nX3N0YXRlID0gMDsKKwkJCXByaW50ZigiR290OiAgICAlc1xuIiwgaGV4ZHVtcChtc2ctPmwzaCwgbGVuKSk7CisJCQlwcmludGYoIldhbnRlZDogJXNcbiIsIGhleGR1bXAodGVzdF9kYXRhMi0+bDNoLCBsZW4pKTsKKwkJfQorCX0KKworCS8qIHNlbmRpbmcgb3V0IGRhdGEgKi8KKwlpZiAoaW5jb21pbmdfZGF0YSA9PSAyKSB7CisJCXByaW50ZigiXHRSZXR1cm5pbmcgZGF0YTNcbiIpOworCQlzY2NwX2Nvbm5lY3Rpb25fd3JpdGUoY29ubiwgdGVzdF9kYXRhMyk7CisJfQorfQorCitzdGF0aWMgaW50IHNjY3BfY29ubl9hY2NlcHQoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubiwgdm9pZCAqY3R4KQoreworCXByaW50ZigiXHRhY2NlcHQ6ICVwXG4iLCBjb25uKTsKKwljb25uLT5zdGF0ZV9jYiA9IHNjY3BfY29ubl9pbl9zdGF0ZTsKKwljb25uLT5kYXRhX2NiID0gc2NjcF9jb25uX2luX2RhdGE7CisKKwlpZiAoY3VycmVudF9jb25fdGVzdC0+cmVmdXNlKQorCQlyZXR1cm4gLTE7CisKKwlpbmNvbWluZ19jb24gPSBjb25uOworCXJldHVybiAwOworfQorCisvKiBjYWxsYmFja3MgZm9yIHRoZSBvdXRnb2luZyBzaWRlICovCitzdGF0aWMgdm9pZCBzY2NwX2Nvbm5fb3V0X3N0YXRlKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm4sIGludCBvbGRfc3RhdGUpCit7CisJcHJpbnRmKCJcdG91dGdvaW5nOiAlcCAlZCAtPiAlZFxuIiwgY29ubiwgb2xkX3N0YXRlLCBjb25uLT5jb25uZWN0aW9uX3N0YXRlKTsKKworCWlmIChjb25uLT5jb25uZWN0aW9uX3N0YXRlID49IFNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUxFQVNFX0NPTVBMRVRFKSB7CisJCWlmIChjb25uID09IG91dGdvaW5nX2NvbikgeworCQkJc2NjcF9jb25uZWN0aW9uX2ZyZWUoY29ubik7CisJCQlvdXRnb2luZ19jb24gPSBOVUxMOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBzY2NwX2Nvbm5fb3V0X2RhdGEoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubiwgc3RydWN0IG1zZ2IgKm1zZywgdW5zaWduZWQgaW50IGxlbikKK3sKKwkrK291dGdvaW5nX2RhdGE7CisJcHJpbnRmKCJcdG91dGdvaW5nIGRhdGE6ICVwICVkXG4iLCBjb25uLCBsZW4pOworCisJaWYgKGxlbiAhPSA0KQorCQlGQUlMKCJMZW5ndGggb2YgcGFja2V0IGlzIHdyb25nOiAldSAldVxuIiwgbXNnYl9sM2xlbihtc2cpLCBsZW4pOworCisJaWYgKG91dGdvaW5nX2RhdGEgPT0gMSkgeworCQlpZiAobWVtY21wKG1zZy0+bDNoLCB0ZXN0X2RhdGEzLT5sM2gsIGxlbikgIT0gMCkgeworCQkJRkFJTCgiQ29tcGFyaW5nIHRoZSBkYXRhIGZhaWxlZFxuIik7CisJCQlvdXRnb2luZ19zdGF0ZSA9IDA7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRvX3Rlc3Rfc2NjcF9jb25uZWN0aW9uKGNvbnN0IHN0cnVjdCBjb25uZWN0aW9uX3Rlc3QgKnRlc3QpCit7CisJaW50IHJldDsKKworCWN1cnJlbnRfY29uX3Rlc3QgPSB0ZXN0OworCW91dGdvaW5nX2NvbiA9IGluY29taW5nX2NvbiA9IDA7CisKKwlvdXRnb2luZ19jb24gPSBzY2NwX2Nvbm5lY3Rpb25fc29ja2V0KCk7CisJaWYgKCFvdXRnb2luZ19jb24pIHsKKwkJRkFJTCgiQ29ubmVjdGlvbiBpcyBOVUxMXG4iKTsKKwkJcmV0dXJuOworCX0KKworCW91dGdvaW5nX2Nvbi0+c3RhdGVfY2IgPSBzY2NwX2Nvbm5fb3V0X3N0YXRlOworCW91dGdvaW5nX2Nvbi0+ZGF0YV9jYiA9IHNjY3BfY29ubl9vdXRfZGF0YTsKKwlvdXRnb2luZ19kYXRhID0gaW5jb21pbmdfZGF0YSA9IDA7CisJaW5jb21pbmdfc3RhdGUgPSBvdXRnb2luZ19zdGF0ZSA9IDE7CisKKwkvKiBzdGFydCB0ZXN0aW5nICovCisJaWYgKHRlc3QtPndpdGhfZGF0YSkgeworCQlpZiAoc2NjcF9jb25uZWN0aW9uX2Nvbm5lY3Qob3V0Z29pbmdfY29uLCAmc2NjcF9zc25fYnNzYXAsIHRlc3RfZGF0YTEpICE9IDApCisJCQlGQUlMKCJCaW5kaW5nIGZhaWxlZFxuIik7CisJfSBlbHNlIHsKKwkJKytpbmNvbWluZ19kYXRhOworCQlpZiAoc2NjcF9jb25uZWN0aW9uX2Nvbm5lY3Qob3V0Z29pbmdfY29uLCAmc2NjcF9zc25fYnNzYXAsIE5VTEwpICE9IDApCisJCQlGQUlMKCJCaW5kaW5nIGZhaWxlZFxuIik7CisJfQorCisJaWYgKHRlc3QtPnJlZnVzZSkgeworCQlpZiAob3V0Z29pbmdfY29uKQorCQkJRkFJTCgiT3V0Z29pbmcgY29ubmVjdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHJlZnVzZWQuXG4iKTsKKwl9IGVsc2UgeworCQlpZiAoIWluY29taW5nX2NvbikKKwkJCUZBSUwoIkNyZWF0aW5nIGluY29taW5nIGRpZG4ndCB3b3JrLlxuIik7CisKKwkJcHJpbnRmKCJcdFdyaXRpbmcgdGVzdCBkYXRhMlxuIik7CisJCXNjY3BfY29ubmVjdGlvbl93cml0ZShvdXRnb2luZ19jb24sIHRlc3RfZGF0YTIpOworCQlzY2NwX2Nvbm5lY3Rpb25fc2VuZF9pdChvdXRnb2luZ19jb24pOworCisJCS8qIGNsb3NpbmcgY29ubmVjdGlvbiAqLworCQlpZiAodGVzdC0+Y2xvc2Vfc2lkZSA9PSAwKQorCQkJcmV0ID0gc2NjcF9jb25uZWN0aW9uX2Nsb3NlKG91dGdvaW5nX2NvbiwgMCk7CisJCWVsc2UKKwkJCXJldCA9IHNjY3BfY29ubmVjdGlvbl9jbG9zZShpbmNvbWluZ19jb24sIDApOworCisJCWlmIChyZXQgIT0gMCkKKwkJCUZBSUwoIkNsb3NpbmcgdGhlIGNvbm5lY3Rpb24gZmFpbGVkXG4iKTsKKwl9CisKKwkvKiBvdXRnb2luZyBzaG91bGQgYmUgZ29uZSBub3cgKi8KKwlpZiAob3V0Z29pbmdfY29uKQorCQlGQUlMKCJPdXRnb2luZyBjb25uZWN0aW9uIHdhcyBub3QgcHJvcGVybHkgY2xvc2VkXG4iKTsKKworCWlmIChpbmNvbWluZ19jb24pCisJCUZBSUwoIkluY29taW5nIGNvbm5lY3Rpb24gd2FzIG5vdCBwcm9wZXJ5IGNsb3NlZC5cbiIpOworCisJaWYgKHRlc3QtPnJlZnVzZSA9PSAwKSB7CisJCWlmIChvdXRnb2luZ19kYXRhICE9IDEgfHwgaW5jb21pbmdfZGF0YSAhPSAyKSB7CisJCQlGQUlMKCJEYXRhIHNlbmRpbmcgZmFpbGVkOiAlZC8lZCAlZC8lZFxuIiwKKwkJCSAgICAgb3V0Z29pbmdfZGF0YSwgMSwKKwkJCSAgICAgaW5jb21pbmdfZGF0YSwgMik7CisJCX0KKwl9CisKKwlpZiAoIWluY29taW5nX3N0YXRlIHx8ICFvdXRnb2luZ19zdGF0ZSkKKwkJRkFJTCgiRmFpbHVyZSB3aXRoIHRoZSBzdGF0ZSB0cmFuc2l0aW9uLiAlZCAlZFxuIiwKKwkJICAgICBvdXRnb2luZ19zdGF0ZSwgaW5jb21pbmdfc3RhdGUpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3NjY3BfY29ubmVjdGlvbih2b2lkKQoreworCXNjY3Bfc3lzdGVtX2luaXQoc2NjcF93cml0ZV9sb29wLCBOVUxMKTsKKwlzY2NwX3NldF9yZWFkKE5VTEwsIE5VTEwsIE5VTEwpOworCXNjY3BfY29ubmVjdGlvbl9zZXRfaW5jb21pbmcoJnNjY3Bfc3NuX2Jzc2FwLCBzY2NwX2Nvbm5fYWNjZXB0LCBOVUxMKTsKKworCXRlc3RfZGF0YTEgPSBtc2diX2FsbG9jKDQsICJkYXRhMSIpOworCXRlc3RfZGF0YTEtPmwzaCA9IG1zZ2JfcHV0KHRlc3RfZGF0YTEsIDQpOworCSooKHVuc2lnbmVkIGludCopdGVzdF9kYXRhMS0+bDNoKSA9IDB4MjM0MjExMjI7CisKKwl0ZXN0X2RhdGEyID0gbXNnYl9hbGxvYyg0LCAiZGF0YTIiKTsKKwl0ZXN0X2RhdGEyLT5sM2ggPSBtc2diX3B1dCh0ZXN0X2RhdGEyLCA0KTsKKwkqKCh1bnNpZ25lZCBpbnQqKXRlc3RfZGF0YTItPmwzaCkgPSAweDQyMjMyMjExOworCisJdGVzdF9kYXRhMyA9IG1zZ2JfYWxsb2MoNCwgImRhdGEzIik7CisJdGVzdF9kYXRhMy0+bDNoID0gbXNnYl9wdXQodGVzdF9kYXRhMywgNCk7CisJKigodW5zaWduZWQgaW50Kil0ZXN0X2RhdGEzLT5sM2gpID0gMHgyMzIzZmY1NTsKKworCisJZm9yIChjdXJyZW50X3Rlc3QgPSAwOyBjdXJyZW50X3Rlc3QgPCBBUlJBWV9TSVpFKGNvbm5lY3Rpb25fdGVzdHMpOyArK2N1cnJlbnRfdGVzdCkgeworCQlwcmludGYoIlRlc3RpbmcgJWQgcmVmdXNlOiAlZCB3aXRoX2RhdGE6ICVkXG4iLAorCQkJY3VycmVudF90ZXN0LCBjb25uZWN0aW9uX3Rlc3RzW2N1cnJlbnRfdGVzdF0ucmVmdXNlLAorCQkJY29ubmVjdGlvbl90ZXN0c1tjdXJyZW50X3Rlc3RdLndpdGhfZGF0YSk7CisJCWRvX3Rlc3Rfc2NjcF9jb25uZWN0aW9uKCZjb25uZWN0aW9uX3Rlc3RzW2N1cnJlbnRfdGVzdF0pOworCX0KKworCW1zZ2JfZnJlZSh0ZXN0X2RhdGExKTsKKwltc2diX2ZyZWUodGVzdF9kYXRhMik7CisJbXNnYl9mcmVlKHRlc3RfZGF0YTMpOworfQorCisvKiBpbnZhbGlkIGlucHV0ICovCitzdGF0aWMgdm9pZCB0ZXN0X3NjY3Bfc3lzdGVtX2NyYXNoKHZvaWQpCit7CisJcHJpbnRmKCJ0cnlpbmcgdG8gcHJvdm9rZSBhIGNyYXNoIHdpdGggaW52YWxpZCBpbnB1dFxuIik7CisJc2NjcF9zZXRfcmVhZCgmc2NjcF9zc25fYnNzYXAsIHNjY3BfcmVhZF9jYiwgTlVMTCk7CisJc2NjcF9jb25uZWN0aW9uX3NldF9pbmNvbWluZygmc2NjcF9zc25fYnNzYXAsIHNjY3BfYWNjZXB0X2NiLCBOVUxMKTsKKworCWZvciAoY3VycmVudF90ZXN0ID0gMDsgY3VycmVudF90ZXN0IDwgQVJSQVlfU0laRSh0ZXN0X2RhdGEpOyArK2N1cnJlbnRfdGVzdCkgeworCQlpbnQgb3JpZ2luYWxfbGVuZ3RoID0gdGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0ubGVuZ3RoOworCQlpbnQgbGVuZ3RoID0gb3JpZ2luYWxfbGVuZ3RoICsgMjsKKwkJaW50IGk7CisKKwkJcHJpbnRmKCJUZXN0aW5nIHBhY2tldDogJWRcbiIsIGN1cnJlbnRfdGVzdCk7CisKKwkJZm9yIChpID0gbGVuZ3RoOyBpID49IDA7IC0taSkgeworCQkJdW5zaWduZWQgaW50IGxlbmd0aCA9IE1JTih0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5sZW5ndGgsIGkpOworCQkJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2NfaGVhZHJvb20obGVuZ3RoICsgMiwgMiwgX19mdW5jX18pOworCQkJbXNnLT5sMmggPSBtc2diX3B1dChtc2csIGxlbmd0aCk7CisJCQltZW1jcHkobXNnLT5sMmgsIHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLmRhdGEsIGxlbmd0aCk7CisJCQlzY2NwX3N5c3RlbV9pbmNvbWluZyhtc2cpOworCQkJbXNnYl9mcmVlKG1zZyk7CisJCX0KKwl9CisKKwlwcmludGYoInN1cnZpdmVkXG4iKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9zY2NwX3BhcnNpbmcodm9pZCkKK3sKKwlmb3IgKGN1cnJlbnRfdGVzdCA9IDA7IGN1cnJlbnRfdGVzdCA8IEFSUkFZX1NJWkUocGFyc2VfcmVzdWx0KTsgKytjdXJyZW50X3Rlc3QpIHsKKwkJc3RydWN0IG1zZ2IgKm1zZzsKKwkJc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0IHJlc3VsdDsKKworCQltc2cgPSBtc2diX2FsbG9jX2hlYWRyb29tKDEwMjQsIDEyOCwgInBhcnNlLXRlc3QiKTsKKwkJbXNnYl9wdXQobXNnLCAxKTsKKwkJbXNnLT5sMmggPSBtc2diX3B1dChtc2csIHBhcnNlX3Jlc3VsdFtjdXJyZW50X3Rlc3RdLmlucHV0X2xlbik7CisJCW1lbWNweShtc2ctPmwyaCwgcGFyc2VfcmVzdWx0W2N1cnJlbnRfdGVzdF0uaW5wdXQsIG1zZ2JfbDJsZW4obXNnKSk7CisKKwkJbWVtc2V0KCZyZXN1bHQsIDAsIHNpemVvZihyZXN1bHQpKTsKKwkJaWYgKHNjY3BfcGFyc2VfaGVhZGVyKG1zZywgJnJlc3VsdCkgIT0gMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gc2NjcCBwYXJzZSB0ZXN0OiAlZFxuIiwgY3VycmVudF90ZXN0KTsKKwkJfSBlbHNlIHsKKwkJCWlmIChwYXJzZV9yZXN1bHRbY3VycmVudF90ZXN0XS53YW50ZWRfbGVuICE9IHJlc3VsdC5kYXRhX2xlbikgeworCQkJCWZwcmludGYoc3RkZXJyLCAiVW5leHBlY3RlZCBkYXRhIGxlbmd0aC5cbiIpOworCQkJCWFib3J0KCk7CisJCQl9CisKKwkJCWlmIChwYXJzZV9yZXN1bHRbY3VycmVudF90ZXN0XS5oYXNfc3JjX3JlZikgeworCQkJCWlmIChtZW1jbXAocmVzdWx0LnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsCisJCQkJCSAgICZwYXJzZV9yZXN1bHRbY3VycmVudF90ZXN0XS5zcmNfcmVmLAorCQkJCQkgICBzaXplb2Yoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSkpICE9IDApIHsKKwkJCQkJZnByaW50ZihzdGRlcnIsICJTUkMgUkVGIGRpZCBub3QgbWF0Y2hcbiIpOworCQkJCQlhYm9ydCgpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKHBhcnNlX3Jlc3VsdFtjdXJyZW50X3Rlc3RdLmhhc19kc3RfcmVmKSB7CisJCQkJaWYgKG1lbWNtcChyZXN1bHQuZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCQkJCQkgICAmcGFyc2VfcmVzdWx0W2N1cnJlbnRfdGVzdF0uZHN0X3JlZiwKKwkJCQkJICAgc2l6ZW9mKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UpKSAhPSAwKSB7CisJCQkJCWZwcmludGYoc3RkZXJyLCAiRFNUIFJFRiBkaWQgbm90IG1hdGNoXG4iKTsKKwkJCQkJYWJvcnQoKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChwYXJzZV9yZXN1bHRbY3VycmVudF90ZXN0XS5zcmNfc3NuICE9IC0xKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJOb3QgaW1wbGVtZW50ZWQuXG4iKTsKKwkJCQlhYm9ydCgpOworCQkJfQorCisJCQlpZiAocGFyc2VfcmVzdWx0W2N1cnJlbnRfdGVzdF0uZHN0X3NzbiAhPSAtMSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiTm90IGltcGxlbWVudGVkLlxuIik7CisJCQkJYWJvcnQoKTsKKwkJCX0KKwkJfQorCisJCW1zZ2JfZnJlZShtc2cpOworCX0KK30KKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJdGVzdF9zY2NwX3N5c3RlbSgpOworCXRlc3Rfc2NjcF9zZW5kX3VkdCgpOworCXRlc3Rfc2NjcF91ZHRfY29tbXVuaWNhdGlvbigpOworCXRlc3Rfc2NjcF9jb25uZWN0aW9uKCk7CisJdGVzdF9zY2NwX3N5c3RlbV9jcmFzaCgpOworCXRlc3Rfc2NjcF9wYXJzaW5nKCk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZGJfc3RvcmVfY291bnRlcigpIHt9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3Rlc3RzL3Ntcy50eHQgYi9vcGVuYnNjL3Rlc3RzL3Ntcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZjODg1YgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvc21zLnR4dApAQCAtMCwwICsxLDUwIEBACiswMyAwMiAwMSAwYSAwMiA0MyAwYiAwMCAxZCAzOSAwMSAxYSAwMCAwMSAwMCAwNyA5MSA1NSAxMSAxOCAzMSAyOCAwMCAwZSAzMSAyMCAwNCA4MSAyMSA0MyAwMCAwMCBmZiAwNCBkNCBmMiA5YyAwZQorCiswMyAwMiAwMSAwYSAwMiA0MyAwYiAwMCAxZCAtCiszOSAtIFRyYW5zYWN0aW9uSUQgMywgU01TIG1lc3NhZ2VzCTo6IGdoLT5wcm90b19kaXNjcgorMDEgLSBDUC1EQVRBCQkJCTo6IGdoLT5tc2dfdHlwZQorMWEgLSBMZW5ndGg6IDI2CQkJCTo6IGdoLT5kYXRhWzBdCiswMCAtIE1USSAwIFJQLURBVEEgKG1zLT5uKQorMDEgLSBNUiAxCiswMCAtIFJQLU9BCiswNyAtIFJQLURBIChTTVNDIExlbmd0aCkKKzkxIC0gSW50ZXJuYXRpb25hbCBObywgTnVtYmVyaW5nIFBsYW4KKzU1IDExIDE4IDMxIDI4IDAwIC0gNTUxMTgxMTM4MjAwCiswZSAtIFJQLVVEIGxlbiAoMTQpCisKK1RQRFUgKDE0IGJ5dGUpOgorMzEgLSBNVEkoMDEpLCBWUEYoMjpyZWxhdGl2ZSksIE1NUygwKSwgU1JJKDEpLCBVREhJKDApLCBSUCgwKQorMjAgLSBNZXNzYWdlIFJlZmVyZW5jZQorMDQgLSBEQSBsZW5ndGgKKzgxIC0gTnVtYmVyaW5nIFBsYW4sIE5hdGlvbmFsIG51bWJlcgorMjEgNDMgLSBEQSAxMjM0CiswMCAtIFBJRAorMDAgLSBEQ1MKK2ZmIC0gVmFsaWRpdHkgcGVyaW9kCiswNCAtIFVzZXIgRGF0YSBsZW5ndGggKDA0KQorZDQgZjIgOWMgMGUgLSBnc21fZGVmYXVsdCA3Yml0IGVuY29kZWQgIlRlc3QiICg0IGJ5dGUpCisKKzAzIDAyIDAxIDBhIDAyIDQzIDBiIDAwIDlmIDA5IDAxIDljIDAwIGRhIDAwIDA3IDkxIDg4IDk2IDEzIDAwIDAwIDk5IDkwIDExIDdiIDA0IDgxIDIyIDIyIDAwIDA4IGZmIDg2IDZjIDM4IDhjIDUwIDkyIDgwIDg4IDRjIDAwIDRkIDAwIDRkIDAwIDQxIDZhIDE5IDY3IDAzIDc0IDA2IDhjIGExIDdkIGIyIDAwIDIwIDAwIDIwIDUxIDY4IDc0IDAzIDk5IDk2IDUyIDc1IDdkIGIyIDhkIGVmIDZhIDE5IDY3IDAzIGZmIDBjIDZhIDE5IDY3IDAzIDk2IGY2IDk4IGE4IDk2IGFhIGZmIDAxIDhiIDkzIDYwIGE4IDgwIDcwIDY2IDBlIDUxIDMyIDg0IGM0IGZmIDBjIDk3IDQ4IDZkIDNiIDYyIDk1IDhjIGM3IGZmIDAxIDczIGZlIDU3IDI4IDUyIGEwIDUxIDY1IDkwIDAxIDk2IDUwIDkxIGNmIDU5IDI3IDgwIDZmIDc2IGRmIDZkIDBiIDU3IGZhIDk2IDhhIDkxIDc3IDVlIDYzIDUzIDYxIGZmIDBjIDhhIGNiIDRlIDBhIDdkIGIyIDY0IDFjIDVjIDBiIDMwIDBjIDZhIDE5IDY3IDAzIDMwIDBkCisKKzAzIDAyIDAxIDBhIDAyIDQzIDBiIDAwIDlmIC0gbG93ZXIgbGV2ZWxzCiswOSAtIFRyYW5zYWN0aW9uSUQgMCwgU01TIG1lc3NhZ2VzCiswMSAtIENQLURBVEEKKzljIC0gTGVuZ3RoOiAoMTU2KQorMDAgLSBNVEkgMCBSUC1EQVRBIChtcy0+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+cGF5bG9hZF9sZW4sIHVzZXJkYXRhKTsKKworCXJldHVybiBzaXplb2Yoc3RydWN0IHVieF9oZHIpICsgaGRyLT5wYXlsb2FkX2xlbiArIDI7Cit9CisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL3VieC5oIGIvcnJscC1lcGhlbWVyaXMvdWJ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI2NDM4NgotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL3VieC5oCkBAIC0wLDAgKzEsMjMyIEBACisvKgorICogdWJ4LmgKKyAqCisgKiBIZWFkZXIgZm9yIFVCWCByZWxhdGVkIHN0dWZmCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSAgU3lsdmFpbiBNdW5hdXQgPHRudEAyNDZ0TnQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBfX1VCWF9IX18KKyNkZWZpbmUgX19VQlhfSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiBDb25zdGFudHMgdXNlZCBpbiBVQlggKi8KKworCS8qIFN5bmMgYnl0ZXMgKHR3byBmaXJzdCBieXRlcyBvZiBlYWNoIG1lc3NhZ2UpICovCisjZGVmaW5lIFVCWF9TWU5DMAkJMHhiNQorI2RlZmluZSBVQlhfU1lOQzEJCTB4NjIKKworCS8qIFVCWCBtZXNzYWdlcyBjbGFzc2VzICovCisjZGVmaW5lIFVCWF9DTEFTU19OQVYJCTB4MDEKKyNkZWZpbmUgVUJYX0NMQVNTX1JYTQkJMHgwMgorI2RlZmluZSBVQlhfQ0xBU1NfSU5GCQkweDA0CisjZGVmaW5lIFVCWF9DTEFTU19BQ0sJCTB4MDUKKyNkZWZpbmUgVUJYX0NMQVNTX0NGRwkJMHgwNgorI2RlZmluZSBVQlhfQ0xBU1NfVVBECQkweDA5CisjZGVmaW5lIFVCWF9DTEFTU19NT04JCTB4MGEKKyNkZWZpbmUgVUJYX0NMQVNTX0FJRAkJMHgwYgorI2RlZmluZSBVQlhfQ0xBU1NfVElNCQkweDBkCisKKwkvKiBVQlggbWVzc2FnZXMgdHlwZSBJRCAoYnkgY2xhc3MpICovCisjZGVmaW5lIFVCWF9OQVZfUE9TRUNFRgkJMHgwMQorI2RlZmluZSBVQlhfTkFWX1BPU0xMSAkJMHgwMgorI2RlZmluZSBVQlhfTkFWX1NUQVRVUwkJMHgwMworI2RlZmluZSBVQlhfTkFWX0RPUAkJMHgwNAorI2RlZmluZSBVQlhfTkFWX1NPTAkJMHgwNgorI2RlZmluZSBVQlhfTkFWX1BPU1VUTQkJMHgwOAorI2RlZmluZSBVQlhfTkFWX1ZFTEVDRUYJCTB4MTEKKyNkZWZpbmUgVUJYX05BVl9WRUxORUQJCTB4MTIKKyNkZWZpbmUgVUJYX05BVl9USU1FR1BTCQkweDIwCisjZGVmaW5lIFVCWF9OQVZfVElNRVVUQwkJMHgyMQorI2RlZmluZSBVQlhfTkFWX0NMT0NLCQkweDIyCisjZGVmaW5lIFVCWF9OQVZfU1ZJTkZPCQkweDMwCisjZGVmaW5lIFVCWF9OQVZfREdQUwkJMHgzMQorI2RlZmluZSBVQlhfTkFWX1NCQVMJCTB4MzIKKyNkZWZpbmUgVUJYX05BVl9FS0ZTVEFUVVMJMHg0MAorCisjZGVmaW5lIFVCWF9SWE1fUkFXCQkweDEwCisjZGVmaW5lIFVCWF9SWE1fU0ZSQgkJMHgxMQorI2RlZmluZSBVQlhfUlhNX1NWU0kJCTB4MjAKKyNkZWZpbmUgVUJYX1JYTV9TVlNJX0dQUwkweDIwCisjZGVmaW5lIFVCWF9SWE1fQUxNCQkweDMwCisjZGVmaW5lIFVCWF9SWE1fRVBICQkweDMxCisjZGVmaW5lIFVCWF9SWE1fUE9TUkVRCQkweDQwCisKKyNkZWZpbmUgVUJYX0lORl9FUlJPUgkJMHgwMAorI2RlZmluZSBVQlhfSU5GX1dBUk5JTkcJCTB4MDEKKyNkZWZpbmUgVUJYX0lORl9OT1RJQ0UJCTB4MDIKKyNkZWZpbmUgVUJYX0lORl9URVNUCQkweDAzCisjZGVmaW5lIFVCWF9JTkZfREVCVUcJCTB4MDQKKyNkZWZpbmUgVUJYX0lORl9VU0VSCQkweDA3CisKKyNkZWZpbmUgVUJYX0FDS19OQUsJCTB4MDAKKyNkZWZpbmUgVUJYX0FDS19BQ0sJCTB4MDEKKworI2RlZmluZSBVQlhfQ0ZHX1BSVAkJMHgwMAorI2RlZmluZSBVQlhfQ0ZHX1VTQgkJMHgxYgorI2RlZmluZSBVQlhfQ0ZHX01TRwkJMHgwMQorI2RlZmluZSBVQlhfQ0ZHX05NRUEJCTB4MTcKKyNkZWZpbmUgVUJYX0NGR19SQVRFCQkweDA4CisjZGVmaW5lIFVCWF9DRkdfQ0ZHCQkweDA5CisjZGVmaW5lIFVCWF9DRkdfVFAJCTB4MDcKKyNkZWZpbmUgVUJYX0NGR19OQVYyCQkweDFhCisjZGVmaW5lIFVCWF9DRkdfREFUCQkweDA2CisjZGVmaW5lIFVCWF9DRkdfSU5GCQkweDAyCisjZGVmaW5lIFVCWF9DRkdfUlNUCQkweDA0CisjZGVmaW5lIFVCWF9DRkdfUlhNCQkweDExCisjZGVmaW5lIFVCWF9DRkdfQU5UCQkweDEzCisjZGVmaW5lIFVCWF9DRkdfRlhOCQkweDBlCisjZGVmaW5lIFVCWF9DRkdfU0JBUwkJMHgxNgorI2RlZmluZSBVQlhfQ0ZHX0xJQwkJMHg4MAorI2RlZmluZSBVQlhfQ0ZHX1RNCQkweDEwCisjZGVmaW5lIFVCWF9DRkdfVE0yCQkweDE5CisjZGVmaW5lIFVCWF9DRkdfVE1PREUJCTB4MWQKKyNkZWZpbmUgVUJYX0NGR19FS0YJCTB4MTIKKworI2RlZmluZSBVQlhfVVBEX0RPV05MCQkweDAxCisjZGVmaW5lIFVCWF9VUERfVVBMT0FECQkweDAyCisjZGVmaW5lIFVCWF9VUERfRVhFQwkJMHgwMworI2RlZmluZSBVQlhfVVBEX01FTUNQWQkJMHgwNAorCisjZGVmaW5lIFVCWF9NT05fU0NIRAkJMHgwMQorI2RlZmluZSBVQlhfTU9OX0lPCQkweDAyCisjZGVmaW5lIFVCWF9NT05fSVBDCQkweDAzCisjZGVmaW5lIFVCWF9NT05fVkVSCQkweDA0CisjZGVmaW5lIFVCWF9NT05fRVhDRVBUCQkweDA1CisjZGVmaW5lIFVCWF9NT05fTVNHUFAJCTB4MDYKKyNkZWZpbmUgVUJYX01PTl9SWEJVRgkJMHgwNworI2RlZmluZSBVQlhfTU9OX1RYQlVGCQkweDA4CisjZGVmaW5lIFVCWF9NT05fSFcJCTB4MDkKKyNkZWZpbmUgVUJYX01PTl9VU0IJCTB4MGEKKworI2RlZmluZSBVQlhfQUlEX1JFUQkJMHgwMAorI2RlZmluZSBVQlhfQUlEX0lOSQkJMHgwMQorI2RlZmluZSBVQlhfQUlEX0hVSQkJMHgwMgorI2RlZmluZSBVQlhfQUlEX0RBVEEJCTB4MTAKKyNkZWZpbmUgVUJYX0FJRF9BTE0JCTB4MzAKKyNkZWZpbmUgVUJYX0FJRF9FUEgJCTB4MzEKKworI2RlZmluZSBVQlhfVElNX1RQCQkweDAxCisjZGVmaW5lIFVCWF9USU1fVE0JCTB4MDIKKyNkZWZpbmUgVUJYX1RJTV9UTTIJCTB4MDMKKyNkZWZpbmUgVUJYX1RJTV9TVklOCQkweDA0CisKKworLyogSGVhZGVyICovCitzdHJ1Y3QgdWJ4X2hkciB7CisgICAgICAgIHVpbnQ4X3QgIHN5bmNbMl07CisgICAgICAgIHVpbnQ4X3QgIG1zZ19jbGFzczsKKyAgICAgICAgdWludDhfdCAgbXNnX2lkOworICAgICAgICB1aW50MTZfdCBwYXlsb2FkX2xlbjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworLyogUGF5bG9hZCBmb3JtYXRzIChzb21lIG9mIHRoZW0pICovCitzdHJ1Y3QgdWJ4X25hdl9wb3NsbGggeworCXVpbnQzMl90IGl0b3c7CisJaW50MzJfdCAgbG9uOwkvKiBzY2FsaW5nIDFlLTcgKi8KKwlpbnQzMl90ICBsYXQ7CS8qIHNjYWxpbmcgMWUtNyAqLworCWludDMyX3QgIGhlaWdodDsvKiBtbSAqLworCWludDMyX3QgIGhzbDsJLyogbW0gKi8KKwl1aW50MzJfdCBoYWNjOwkvKiBtbSAqLworCXVpbnQzMl90IHZhY2M7CS8qIG1tICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgdWJ4X2FpZF9pbmkgeworCWludDMyX3QgIHg7CisJaW50MzJfdCAgeTsKKwlpbnQzMl90ICB6OworCXVpbnQzMl90IHBvc2FjYzsKKwl1aW50MTZfdCB0bV9jZmc7CisJdWludDE2X3Qgd247CisJdWludDMyX3QgdG93OworCWludDMyX3QgIHRvd19uczsKKwl1aW50MzJfdCB0YWNjX21zOworCXVpbnQzMl90IHRhY2NfbnM7CisJaW50MzJfdCAgY2xrZDsKKwl1aW50MzJfdCBjbGtkYWNjOworCXVpbnQzMl90IGZsYWdzOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHVieF9haWRfaHVpIHsKKwl1aW50MzJfdCBoZWFsdGg7CisJZG91YmxlICAgdXRjX2ExOworCWRvdWJsZSAgIHV0Y19hMDsKKwlpbnQzMl90ICB1dGNfdG90OworCWludDE2X3QgIHV0Y193bnQ7CisJaW50MTZfdCAgdXRjX2xzOworCWludDE2X3QgIHV0Y193bmY7CisJaW50MTZfdCAgdXRjX2RuOworCWludDE2X3QgIHV0Y19sc2Y7CisJaW50MTZfdCAgdXRjX3NwYXJlOworCWZsb2F0ICAgIGtsb2JfYTA7CisJZmxvYXQgICAga2xvYl9hMTsKKwlmbG9hdCAgICBrbG9iX2EyOworCWZsb2F0ICAgIGtsb2JfYTM7CisJZmxvYXQgICAga2xvYl9iMDsKKwlmbG9hdCAgICBrbG9iX2IxOworCWZsb2F0ICAgIGtsb2JfYjI7CisJZmxvYXQgICAga2xvYl9iMzsKKwl1aW50MzJfdCBmbGFnczsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCB1YnhfYWlkX2FsbSB7CisJdWludDMyX3Qgc3ZfaWQ7CisJdWludDMyX3QgZ3BzX3dlZWs7CisJdWludDMyX3QgYWxtX3dvcmRzWzhdOwkvKiBQcmVzZW50IG9ubHkgaWYgJ2dwc193ZWVrJyAhPSAwICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgdWJ4X2FpZF9lcGggeworCXVpbnQzMl90IHN2X2lkOworCXVpbnQzMl90IHByZXNlbnQ7CisJdWludDMyX3QgZXBoX3dvcmRzWzI0XTsJLyogUHJlc2VudCBvbmx5IGlmICdwcmVzZW50JyAhPSAwICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKy8qIE1lc3NhZ2UgaGFuZGxlciAqLwordHlwZWRlZiB2b2lkICgqdWJ4X21zZ19oYW5kbGVyX3QpKAorCXN0cnVjdCB1YnhfaGRyICpoZHIsIHZvaWQgKnBheWxvYWQsIGludCBwYXlsb2FkX2xlbiwgdm9pZCAqdXNlcmRhdGEpOworCitzdHJ1Y3QgdWJ4X2Rpc3BhdGNoX2VudHJ5IHsKKwl1aW50OF90IG1zZ19jbGFzczsKKwl1aW50OF90IG1zZ19pZDsKKwl1YnhfbXNnX2hhbmRsZXJfdCBoYW5kbGVyOworfTsKKworI2RlZmluZSBVQlhfRElTUEFUQ0goa2xzLGlkLGhkbCkgewkJXAorCS5tc2dfY2xhc3MgPSBVQlhfQ0xBU1NfICMjIGtscyAsCVwKKwkubXNnX2lkID0gVUJYXyAjIyBrbHMgIyMgXyAjIyBpZCwJXAorCS5oYW5kbGVyID0gKGhkbCksCQkJXAorfQorCisKKy8qIE1ldGhvZHMgKi8KK2ludCB1YnhfbXNnX2Rpc3BhdGNoKHN0cnVjdCB1YnhfZGlzcGF0Y2hfZW50cnkgKmR0LAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLCBpbnQgbGVuLCB2b2lkICp1c2VyZGF0YSk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fVUJYX0hfXyAqLworCmRpZmYgLS1naXQgYS93aXJlc2hhcmsvYWJpc19vbWwucGF0Y2ggYi93aXJlc2hhcmsvYWJpc19vbWwucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAxMzIxMQotLS0gL2Rldi9udWxsCisrKyBiL3dpcmVzaGFyay9hYmlzX29tbC5wYXRjaApAQCAtMCwwICsxLDIyMDkgQEAKK0Zyb20gNTg1NzUxOGJlODc2NDFmZGFiNDVlNTkzYmM5ZmQ1ZWY1NTk1ZTYxOSBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KK0RhdGU6IE1vbiwgMTkgQXByIDIwMTAgMTM6MjM6NTEgKzA4MDAKK1N1YmplY3Q6IFtQQVRDSCAxLzJdIEFkZCB0aGUgQWJpcyBPTUwgcGF0Y2guCisKKy0tLQorIGVwYW4vZGlzc2VjdG9ycy9NYWtlZmlsZS5jb21tb24gICAgICAgfCAgICAxICsKKyBlcGFuL2Rpc3NlY3RvcnMvcGFja2V0LWdzbV9hYmlzX29tbC5jIHwgMTM4MiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKyBlcGFuL2Rpc3NlY3RvcnMvcGFja2V0LWdzbV9hYmlzX29tbC5oIHwgIDc4NyArKysrKysrKysrKysrKysrKysrCisgMyBmaWxlcyBjaGFuZ2VkLCAyMTcwIGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGVwYW4vZGlzc2VjdG9ycy9wYWNrZXQtZ3NtX2FiaXNfb21sLmMKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1nc21fYWJpc19vbWwuaAorCitkaWZmIC0tZ2l0IGEvZXBhbi9kaXNzZWN0b3JzL01ha2VmaWxlLmNvbW1vbiBiL2VwYW4vZGlzc2VjdG9ycy9NYWtlZmlsZS5jb21tb24KK2luZGV4IGRiYzM3MjYuLjk4ZGNkYzMgMTAwNjQ0CistLS0gYS9lcGFuL2Rpc3NlY3RvcnMvTWFrZWZpbGUuY29tbW9uCisrKysgYi9lcGFuL2Rpc3NlY3RvcnMvTWFrZWZpbGUuY29tbW9uCitAQCAtNDgxLDYgKzQ4MSw3IEBAIERJU1NFQ1RPUl9TUkMgPSBcCisgCXBhY2tldC1nc21fYV9nbS5jCQlcCisgCXBhY2tldC1nc21fYV9ycC5jCQlcCisgCXBhY2tldC1nc21fYV9yci5jCVwKKysJcGFja2V0LWdzbV9hYmlzX29tbC5jCVwKKyAJcGFja2V0LWdzbV9pcGEuYwlcCisgCXBhY2tldC1nc21fYnNzbGFwLmMJCVwKKyAJcGFja2V0LWdzbV9ic3NtYXBfbGUuYwlcCitkaWZmIC0tZ2l0IGEvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1nc21fYWJpc19vbWwuYyBiL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtZ3NtX2FiaXNfb21sLmMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi5mYTQ2YWI1CistLS0gL2Rldi9udWxsCisrKysgYi9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LWdzbV9hYmlzX29tbC5jCitAQCAtMCwwICsxLDEzODIgQEAKKysvKiBwYWNrZXQtYWJpc19vbWwuYworKyAqIFJvdXRpbmVzIGZvciBwYWNrZXQgZGlzc2VjdGlvbiBvZiBHU00gQS1iaXMgb3ZlciBJUCAoM0dQUCBUUyAxMi4yMSkKKysgKiBDb3B5cmlnaHQgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorKyAqIENvcHlyaWdodCAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKysgKiBiYXNlZCBvbiBBLWJpcyBPTUwgY29kZSBpbiBPcGVuQlNDCisrICoKKysgKiAkSWQkCisrICoKKysgKiBXaXJlc2hhcmsgLSBOZXR3b3JrIHRyYWZmaWMgYW5hbHl6ZXIKKysgKiBCeSBHZXJhbGQgQ29tYnMgPGdlcmFsZEB3aXJlc2hhcmsub3JnPgorKyAqIENvcHlyaWdodCAxOTk4IEdlcmFsZCBDb21icworKyAqCisrICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisrICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKysgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKysgKgorKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisrICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisrICoKKysgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisrICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKysgKi8KKysKKysjaWZkZWYgSEFWRV9DT05GSUdfSAorKyMgaW5jbHVkZSAiY29uZmlnLmgiCisrI2VuZGlmCisrCisrI2luY2x1ZGUgPGdsaWIuaD4KKysKKysjaW5jbHVkZSA8ZXBhbi9wYWNrZXQuaD4KKysjaW5jbHVkZSA8ZXBhbi9lbWVtLmg+CisrI2luY2x1ZGUgPGVwYW4vbGFwZF9zYXBpLmg+CisrI2luY2x1ZGUgPGVwYW4vcHJlZnMuaD4KKysKKysjaW5jbHVkZSAicGFja2V0LWdzbV9hYmlzX29tbC5oIgorKyNpbmNsdWRlICJwYWNrZXQtZ3NtX2FfY29tbW9uLmgiCisrCisrLyogaW5pdGlhbGl6ZSB0aGUgcHJvdG9jb2wgYW5kIHJlZ2lzdGVyZWQgZmllbGRzICovCisrc3RhdGljIGludCBwcm90b19hYmlzX29tbCA9IC0xOworKworKy8qIE9NTCBoZWFkZXIgKi8KKytzdGF0aWMgaW50IGhmX29tbF9tc2dfZGlzYyA9IC0xOworK3N0YXRpYyBpbnQgaGZfb21sX3BsYWNlbWVudCA9IC0xOworK3N0YXRpYyBpbnQgaGZfb21sX3NlcXVlbmNlID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfbGVuZ3RoID0gLTE7CisrLyogRk9NIGhlYWRlciAqLworK3N0YXRpYyBpbnQgaGZfb21sX2ZvbV9tc2d0eXBlID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfZm9tX29iamNsYXNzID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfZm9tX2luc3RfYnRzID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfZm9tX2luc3RfdHJ4ID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfZm9tX2luc3RfdHMgPSAtMTsKKytzdGF0aWMgaW50IGhmX29tbF9mb21fYXR0cl90YWcgPSAtMTsKKytzdGF0aWMgaW50IGhmX29tbF9mb21fYXR0cl9sZW4gPSAtMTsKKytzdGF0aWMgaW50IGhmX29tbF9mb21fYXR0cl92YWwgPSAtMTsKKysvKiBGT00gYXR0cmlidXRlcyAqLworK3N0YXRpYyBpbnQgaGZfYXR0cl9hZG1fc3RhdGUgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfYXJmY24gPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfb3Blcl9zdGF0ZSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9hdmFpbF9zdGF0ZSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9ldmVudF90eXBlID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX3NldmVyaXR5ID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2JjY2hfYXJmY24gPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfYnNpYyA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl90ZXN0X25vID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX3RzYyA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl90ZWkgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfYWNoX2J0c3AgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfYWNoX3RzbG90ID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2FjaF9zc2xvdCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9nc21fdGltZSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9jaGFuX2NvbWIgPSAtMTsKKysvKiBJcGFjY2VzcyAqLworK3N0YXRpYyBpbnQgaGZfb21sX2lwYV90cmVzX2F0dHJfdGFnID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfaXBhX3RyZXNfYXR0cl9sZW4gPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3Rlc3RfcmVzID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9yeGxldiA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfYl9yeGxldiA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfYXJmY24gPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX2ZfcXVhbCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfZl9lcnIgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX3J4cXVhbCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfZnJhbWVfb2ZmcyA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfZnJhbWVucl9vZmZzID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9ic2ljID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9jZWxsX2lkID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9zaTIgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX3NpMmJpcyA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfc2kydGVyID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9jaGFuX2Rlc2MgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3JzbF9pcCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfcnNsX3BvcnQgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3ByaW1fb21sX2lwID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9wcmltX29tbF9wb3J0ID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9sb2NhdGlvbl9uYW1lID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV91bml0X2lkID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV91bml0X25hbWUgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX252X2ZsYWdzID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9udl9tYXNrID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9uc2xfc3BvcnQgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX25zbF9kYWRkciA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfbnNsX2Rwb3J0ID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9uc2VpID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9uc3ZjaSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfYnZjaSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfcmFjID0gLTE7CisrCisrLyogaW5pdGlhbGl6ZSB0aGUgc3VidHJlZSBwb2ludGVycyAqLworK3N0YXRpYyBpbnQgZXR0X29tbCA9IC0xOworK3N0YXRpYyBpbnQgZXR0X29tbF9mb20gPSAtMTsKKytzdGF0aWMgaW50IGV0dF9vbWxfZm9tX2F0dCA9IC0xOworKworKy8qIERlY29kZSB0aGluZ3MgYXMgbmFub0JUUyB0cmFjZXMgKi8KKytzdGF0aWMgZ2Jvb2xlYW4gZ2xvYmFsX29tbF91c2VfbmFub19idHMgPSBGQUxTRTsKKysKKytzdGF0aWMgcHJvdG9fdHJlZSAqdG9wX3RyZWU7CisrCisrLyogVFMgMTIuMjEgQ2hhcHRlciA4LjEgLyBUUyAwOC41OSAqLworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX21zZ19kaXNjX3ZhbHNbXSA9IHsKKysJeyBBQklTX09NX01ESVNDX0ZPTSwJIkZvcm1hdHRlZCBPJk0iIH0sCisrCXsgQUJJU19PTV9NRElTQ19NTUksCSJNTUkgVHJhbnNmZXIiIH0sCisrCXsgQUJJU19PTV9NRElTQ19UUkFVLAkiVFJBVSBPJk0iIH0sCisrCXsgQUJJU19PTV9NRElTQ19NQU5VRiwJIk1hbnVmYWN0dXJlciBzcGVjaWZpYyIgfSwKKyt9OworKworKy8qIFRTIDEyLjIxIENoYXB0ZXIgOC4xLjEgKi8KKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIG9tbF9wbGFjZW1lbnRfdmFsc1tdID0geworKwl7IEFCSVNfT01fUExBQ0VNRU5UX09OTFksCSJPbmx5IiB9LAorKwl7IEFCSVNfT01fUExBQ0VNRU5UX0ZJUlNULAkiRmlyc3QiIH0sCisrCXsgQUJJU19PTV9QTEFDRU1FTlRfTUlERExFLAkiTWlkZGxlIiB9LAorKwl7IEFCSVNfT01fUExBQ0VNRU5UX0xBU1QsCSJMYXN0IiB9LAorK307CisrCisrLyogVFMgMTIuMjEgQ2hhcHRlciA5LjIgKi8KKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIG9tbF9mb21fbXNndHlwZV92YWxzW10gPSB7CisrCXsgTk1fTVRfTE9BRF9JTklULAkJIlNvZnR3YXJlIExvYWQgSW5pdCIgfSwKKysJeyBOTV9NVF9MT0FEX0lOSVRfQUNLLAkJIlNvZnR3YXJlIExvYWQgSW5pdCBBQ0siIH0sCisrCXsgTk1fTVRfTE9BRF9JTklUX05BQ0ssCQkiU29mdHdhcmUgTG9hZCBJbml0IE5BQ0siIH0sCisrCXsgTk1fTVRfTE9BRF9TRUcsCQkiU29mdHdhcmUgTG9hZCBTZWdtZW50IiB9LAorKwl7IE5NX01UX0xPQURfU0VHX0FDSywJCSJTb2Z0d2FyZSBMb2FkIFNlZ21lbnQgQUNLIiB9LAorKwl7IE5NX01UX0xPQURfRU5ELAkJIlNvZnR3YXJlIExvYWQgRW5kIiB9LAorKwl7IE5NX01UX0xPQURfRU5EX0FDSywJCSJTb2Z0d2FyZSBMb2FkIEVuZCBBQ0siIH0sCisrCXsgTk1fTVRfTE9BRF9FTkRfTkFDSywJCSJTb2Z0d2FyZSBMb2FkIEVuZCBOQUNLIiB9LAorKwl7IE5NX01UX1NXX0FDVF9SRVEsCQkiU29mdHdhcmUgQWN0aXZhdGUgUmVxdWVzdCIgfSwKKysJeyBOTV9NVF9TV19BQ1RfUkVRX0FDSywJCSJTb2Z0d2FyZSBBY3RpdmF0ZSBSZXF1ZXN0IEFDSyIgfSwKKysJeyBOTV9NVF9TV19BQ1RfUkVRX05BQ0ssCSJTb2Z0d2FyZSBBY3RpdmF0ZSBSZXF1ZXN0IE5BQ0siIH0sCisrCXsgTk1fTVRfQUNUSVZBVEVfU1csCQkiQWN0aXZhdGUgU29mdHdhcmUiIH0sCisrCXsgTk1fTVRfQUNUSVZBVEVfU1dfQUNLLAkiQWN0aXZhdGUgU29mdHdhcmUgQUNLIiB9LAorKwl7IE5NX01UX0FDVElWQVRFX1NXX05BQ0ssCSJBY3RpdmF0ZSBTb2Z0d2FyZSBOQUNLIiB9LAorKwl7IE5NX01UX1NXX0FDVElWQVRFRF9SRVAsCSJTb2Z0d2FyZSBBY3RpdmF0ZWQgUmVwb3J0IiB9LAorKwl7IE5NX01UX0VTVEFCTElTSF9URUksCQkiRXN0YWJsaXNoIFRFSSIgfSwKKysJeyBOTV9NVF9FU1RBQkxJU0hfVEVJX0FDSywJIkVzdGFibGlzaCBURUkgQUNLIiB9LAorKwl7IE5NX01UX0VTVEFCTElTSF9URUlfTkFDSywJIkVzdGFibGlzaCBURUkgTkFDSyIgfSwKKysJeyBOTV9NVF9DT05OX1RFUlJfU0lHTiwJCSJDb25uZWN0IFRlcnJlc3RyaWFsIFNpZ25hbGxpbmciIH0sCisrCXsgTk1fTVRfQ09OTl9URVJSX1NJR05fQUNLLAkiQ29ubmVjdCBUZXJyZXN0cmlhbCBTaWduYWxsaW5nIEFDSyIgfSwKKysJeyBOTV9NVF9DT05OX1RFUlJfU0lHTl9OQUNLLAkiQ29ubmVjdCBUZXJyZXN0cmlhbCBTaWduYWxsaW5nIE5BQ0siIH0sCisrCXsgTk1fTVRfRElTQ19URVJSX1NJR04sCQkiRGlzY29ubmVjdCBUZXJyZXN0cmlhbCBTaWduYWxsaW5nIiB9LAorKwl7IE5NX01UX0RJU0NfVEVSUl9TSUdOX0FDSywJIkRpc2Nvbm5lY3QgVGVycmVzdHJpYWwgU2lnbmFsbGluZyBBQ0siIH0sCisrCXsgTk1fTVRfRElTQ19URVJSX1NJR05fTkFDSywJIkRpc2Nvbm5lY3QgVGVycmVzdHJpYWwgU2lnbmFsbGluZyBOQUNLIiB9LAorKwl7IE5NX01UX0NPTk5fVEVSUl9UUkFGLAkJIkNvbm5lY3QgVGVycmVzdHJpYWwgVHJhZmZpYyIgfSwKKysJeyBOTV9NVF9DT05OX1RFUlJfVFJBRl9BQ0ssCSJDb25uZWN0IFRlcnJlc3RyaWFsIFRyYWZmaWMgQUNLIiB9LAorKwl7IE5NX01UX0NPTk5fVEVSUl9UUkFGX05BQ0ssCSJDb25uZWN0IFRlcnJlc3RyaWFsIFRyYWZmaWMgTkFDSyIgfSwKKysJeyBOTV9NVF9ESVNDX1RFUlJfVFJBRiwJCSJEaXNjb25uZWN0IFRlcnJlc3RyaWFsIFRyYWZmaWMiIH0sCisrCXsgTk1fTVRfRElTQ19URVJSX1RSQUZfQUNLLAkiRGlzY29ubmVjdCBUZXJyZXN0cmlhbCBUcmFmZmljIEFDSyIgfSwKKysJeyBOTV9NVF9ESVNDX1RFUlJfVFJBRl9OQUNLLAkiRGlzY29ubmVjdCBUZXJyZXN0cmlhbCBUcmFmZmljIE5BQ0siIH0sCisrCXsgTk1fTVRfQ09OTl9NRFJPUF9MSU5LLAkiQ29ubmVjdCBNdWx0aS1Ecm9wIExpbmsiIH0sCisrCXsgTk1fTVRfQ09OTl9NRFJPUF9MSU5LX0FDSywJIkNvbm5lY3QgTXVsdGktRHJvcCBMaW5rIEFDSyIgfSwKKysJeyBOTV9NVF9DT05OX01EUk9QX0xJTktfTkFDSywJIkNvbm5lY3QgTXVsdGktRHJvcCBMaW5rIE5BQ0siIH0sCisrCXsgTk1fTVRfRElTQ19NRFJPUF9MSU5LLAkiRGlzY29ubmVjdCBNdWx0aS1Ecm9wIExpbmsiIH0sCisrCXsgTk1fTVRfRElTQ19NRFJPUF9MSU5LX0FDSywJIkRpc2Nvbm5lY3QgTXVsdGktRHJvcCBMaW5rIEFDSyIgfSwKKysJeyBOTV9NVF9ESVNDX01EUk9QX0xJTktfTkFDSywJIkRpc2Nvbm5lY3QgTXVsdGktRHJvcCBMaW5rIE5BQ0siIH0sCisrCXsgTk1fTVRfU0VUX0JUU19BVFRSLAkJIlNldCBCVFMgQXR0cmlidXRlcyIgfSwKKysJeyBOTV9NVF9TRVRfQlRTX0FUVFJfQUNLLAkiU2V0IEJUUyBBdHRyaWJ1dGVzIEFDSyIgfSwKKysJeyBOTV9NVF9TRVRfQlRTX0FUVFJfTkFDSywJIlNldCBCVFMgQXR0cmlidXRlcyBOQUNLIiB9LAorKwl7IE5NX01UX1NFVF9SQURJT19BVFRSLAkJIlNldCBSYWRpbyBDYXJyaWVyIEF0dHJpYnV0ZXMiIH0sCisrCXsgTk1fTVRfU0VUX1JBRElPX0FUVFJfQUNLLAkiU2V0IFJhZGlvIENhcnJpZXIgQXR0cmlidXRlcyBBQ0siIH0sCisrCXsgTk1fTVRfU0VUX1JBRElPX0FUVFJfTkFDSywJIlNldCBSYWRpbyBDYXJyaWVyIEF0dHJpYnV0ZXMgTkFDSyIgfSwKKysJeyBOTV9NVF9TRVRfQ0hBTl9BVFRSLAkJIlNldCBDaGFubmVsIEF0dHJpYnV0ZXMiIH0sCisrCXsgTk1fTVRfU0VUX0NIQU5fQVRUUl9BQ0ssCSJTZXQgQ2hhbm5lbCBBdHRyaWJ1dGVzIEFDSyIgfSwKKysJeyBOTV9NVF9TRVRfQ0hBTl9BVFRSX05BQ0ssCSJTZXQgQ2hhbm5lbCBBdHRyaWJ1dGVzIE5BQ0siIH0sCisrCXsgTk1fTVRfUEVSRl9URVNULAkJIlBlcmZvcm0gVGVzdCIgfSwKKysJeyBOTV9NVF9QRVJGX1RFU1RfQUNLLAkJIlBlcmZvcm0gVGVzdCBBQ0siIH0sCisrCXsgTk1fTVRfUEVSRl9URVNUX05BQ0ssCQkiUGVyZm9ybSBUZXN0IE5BQ0siIH0sCisrCXsgTk1fTVRfVEVTVF9SRVAsCQkiVGVzdCBSZXBvcnQiIH0sCisrCXsgTk1fTVRfU0VORF9URVNUX1JFUCwJCSJTZW5kIFRlc3QgUmVwb3J0IiB9LAorKwl7IE5NX01UX1NFTkRfVEVTVF9SRVBfQUNLLAkiU2VuZCBUZXN0IFJlcG9ydCBBQ0siIH0sCisrCXsgTk1fTVRfU0VORF9URVNUX1JFUF9OQUNLLAkiU2VuZCBUZXN0IFJlcG9ydCBOQUNLIiB9LAorKwl7IE5NX01UX1NUT1BfVEVTVCwJCSJTdG9wIFRlc3QiIH0sCisrCXsgTk1fTVRfU1RPUF9URVNUX0FDSywJCSJTdG9wIFRlc3QgQUNLIiB9LAorKwl7IE5NX01UX1NUT1BfVEVTVF9OQUNLLAkJIlN0b3AgVGVzdCBOQUNLIiB9LAorKwl7IE5NX01UX1NUQVRFQ0hHX0VWRU5UX1JFUCwJIlN0YXRlIENoYW5nZWQgRXZlbnQgUmVwb3J0IiB9LAorKwl7IE5NX01UX0ZBSUxVUkVfRVZFTlRfUkVQLAkiRmFpbHVyZSBFdmVudCBSZXBvcnQiIH0sCisrCXsgTk1fTVRfU1RPUF9FVkVOVF9SRVAsCQkiU3RvcCBTZW5kaW5nIEV2ZW50IFJlcG9ydHMiIH0sCisrCXsgTk1fTVRfU1RPUF9FVkVOVF9SRVBfQUNLLAkiU3RvcCBTZW5kaW5nIEV2ZW50IFJlcG9ydHMgQUNLIiB9LAorKwl7IE5NX01UX1NUT1BfRVZFTlRfUkVQX05BQ0ssCSJTdG9wIFNlbmRpbmcgRXZlbnQgUmVwb3J0cyBOQUNLIiB9LAorKwl7IE5NX01UX1JFU1RfRVZFTlRfUkVQLAkJIlJlc3RhcnQgU2VuZGluZyBFdmVudCBSZXBvcnRzIiB9LAorKwl7IE5NX01UX1JFU1RfRVZFTlRfUkVQX0FDSywJIlJlc3RhcnQgU2VuZGluZyBFdmVudCBSZXBvcnRzIEFDSyIgfSwKKysJeyBOTV9NVF9SRVNUX0VWRU5UX1JFUF9OQUNLLAkiUmVzdGFydCBTZW5kaW5nIEV2ZW50IFJlcG9ydHMgTkFDSyIgfSwKKysJeyBOTV9NVF9DSEdfQURNX1NUQVRFLAkJIkNoYW5nZSBBZG1pbmlzdHJhdGl2ZSBTdGF0ZSIgfSwKKysJeyBOTV9NVF9DSEdfQURNX1NUQVRFX0FDSywJIkNoYW5nZSBBZG1pbmlzdHJhdGl2ZSBTdGF0ZSBBQ0siIH0sCisrCXsgTk1fTVRfQ0hHX0FETV9TVEFURV9OQUNLLAkiQ2hhbmdlIEFkbWluaXN0cmF0aXZlIFN0YXRlIE5BQ0siIH0sCisrCXsgTk1fTVRfQ0hHX0FETV9TVEFURV9SRVEsCSJDaGFuZ2UgQWRtaW5pc3RyYXRpdmUgU3RhdGUgUmVxdWVzdCIgfSwKKysJeyBOTV9NVF9DSEdfQURNX1NUQVRFX1JFUV9BQ0ssCSJDaGFuZ2UgQWRtaW5pc3RyYXRpdmUgU3RhdGUgUmVxdWVzdCBBQ0siIH0sCisrCXsgTk1fTVRfQ0hHX0FETV9TVEFURV9SRVFfTkFDSywJIkNoYW5nZSBBZG1pbmlzdHJhdGl2ZSBTdGF0ZSBSZXF1ZXN0IE5BQ0siIH0sCisrCXsgTk1fTVRfUkVQX09VVFNUX0FMQVJNUywJIlJlcG9ydCBPdXRzdGFuZGluZyBBbGFybXMiIH0sCisrCXsgTk1fTVRfUkVQX09VVFNUX0FMQVJNU19BQ0ssCSJSZXBvcnQgT3V0c3RhbmRpbmcgQWxhcm1zIEFDSyIgfSwKKysJeyBOTV9NVF9SRVBfT1VUU1RfQUxBUk1TX05BQ0ssCSJSZXBvcnQgT3V0c3RhbmRpbmcgQWxhcm1zIE5BQ0siIH0sCisrCXsgTk1fTVRfQ0hBTkdFT1ZFUiwJCSJDaGFuZ2VvdmVyIiB9LAorKwl7IE5NX01UX0NIQU5HRU9WRVJfQUNLLAkJIkNoYW5nZW92ZXIgQUNLIiB9LAorKwl7IE5NX01UX0NIQU5HRU9WRVJfTkFDSywJIkNoYW5nZW92ZXIgTkFDSyIgfSwKKysJeyBOTV9NVF9PUFNUQVJULAkJIk9wc3RhcnQiIH0sCisrCXsgTk1fTVRfT1BTVEFSVF9BQ0ssCQkiT3BzdGFydCBBQ0siIH0sCisrCXsgTk1fTVRfT1BTVEFSVF9OQUNLLAkJIk9wc3RhcnQgTkFDSyIgfSwKKysJeyBOTV9NVF9SRUlOSVQsCQkJIlJlaW5pdGlhbGl6ZSIgfSwKKysJeyBOTV9NVF9SRUlOSVRfQUNLLAkJIlJlaW5pdGlhbGl6ZSBBQ0siIH0sCisrCXsgTk1fTVRfUkVJTklUX05BQ0ssCQkiUmVpbml0aWFsaXplIE5BQ0siIH0sCisrCXsgTk1fTVRfU0VUX1NJVEVfT1VULAkJIlNldCBTaXRlIE91dHB1dHMiIH0sCisrCXsgTk1fTVRfU0VUX1NJVEVfT1VUX0FDSywJIlNldCBTaXRlIE91dHB1dHMgQUNLIiB9LAorKwl7IE5NX01UX1NFVF9TSVRFX09VVF9OQUNLLAkiU2V0IFNpdGUgT3V0cHV0cyBOQUNLIiB9LAorKwl7IE5NX01UX0NIR19IV19DT05GLAkJIkNoYW5nZSBIVyBDb25maWd1cmF0aW9uIiB9LAorKwl7IE5NX01UX0NIR19IV19DT05GX0FDSywJIkNoYW5nZSBIVyBDb25maWd1cmF0aW9uIEFDSyIgfSwKKysJeyBOTV9NVF9DSEdfSFdfQ09ORl9OQUNLLAkiQ2hhbmdlIEhXIENvbmZpZ3VyYXRpb24gTkFDSyIgfSwKKysJeyBOTV9NVF9NRUFTX1JFU19SRVEsCQkiTWVhc3VyZW1lbnQgUmVzdWx0IFJlcXVlc3QiIH0sCisrCXsgTk1fTVRfTUVBU19SRVNfUkVTUCwJCSJNZWFzdXJlbWVudCBSZXN1bHQgUmVzcG9uc2UiIH0sCisrCXsgTk1fTVRfU1RPUF9NRUFTLAkJIlN0b3AgTWVhc3VyZW1lbnQiIH0sCisrCXsgTk1fTVRfU1RBUlRfTUVBUywJCSJTdGFydCBNZWFzdXJlbWVudCIgfSwKKysJeyBOTV9NVF9HRVRfQVRUUiwJCSJHZXQgQXR0cmlidXRlcyIgfSwKKysJeyBOTV9NVF9HRVRfQVRUUl9SRVNQLAkJIkdldCBBdHRyaWJ1dGVzIFJlc3BvbnNlIiB9LAorKwl7IE5NX01UX0dFVF9BVFRSX05BQ0ssCQkiR2V0IEF0dHJpYnV0ZXMgTkFDSyIgfSwKKysJeyBOTV9NVF9TRVRfQUxBUk1fVEhSRVMsCSJTZXQgQWxhcm0gVGhyZXNob2xkIiB9LAorKwl7IE5NX01UX1NFVF9BTEFSTV9USFJFU19BQ0ssCSJTZXQgQWxhcm0gVGhyZXNob2xkIEFDSyIgfSwKKysJeyBOTV9NVF9TRVRfQUxBUk1fVEhSRVNfTkFDSywJIlNldCBBbGFybSBUaHJlc2hvbGQgTkFDSyIgfSwKKysJLyogcHJvcHJpZXRhcnksIG5vdCBpbiB0aGUgc3RhbmRhcmQgKi8KKysJeyBOTV9NVF9JUEFDQ19SRVNUQVJULAkJIklQQSBSZXN0YXJ0IiB9LAorKwl7IE5NX01UX0lQQUNDX1JFU1RBUlRfQUNLLAkiSVBBIFJlc3RhcnQgQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX1JTTF9DT05ORUNULAkiSVBBIFJTTCBDb25uZWN0IiB9LAorKwl7IE5NX01UX0lQQUNDX1JTTF9DT05ORUNUX0FDSywJIklQQSBSU0wgQ29ubmVjdCBBQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfUlNMX0NPTk5FQ1RfTkFDSywJIklQQSBSU0wgQ29ubmVjdCBOQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX1JTTF9ESVNDT05ORUNULAkiSVBBIFJTTCBEaXNjb25uZWN0IiB9LAorKwl7IE5NX01UX0lQQUNDX1JTTF9ESVNDT05ORUNUX0FDSywgIklQQSBSU0wgRGlzY29ubmVjdCBBQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfUlNMX0RJU0NPTk5FQ1RfTkFDSywgIklQQSBSU0wgRGlzY29ubmVjdCBOQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX0NPTk5fVFJBRiwJIklQQSBDb25uZWN0IFRyYWZmaWMiIH0sCisrCXsgTk1fTVRfSVBBQ0NfQ09OTl9UUkFGX0FDSywJIklQQSBDb25uZWN0IFRyYWZmaWMgQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX0NPTk5fVFJBRl9OQUNLLAkiSVBBIENvbm5lY3QgVHJhZmZpYyBOQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX0RJU0NfVFJBRiwJIklQQSBEaXNjb25uZWN0IFRyYWZmaWMiIH0sCisrCXsgTk1fTVRfSVBBQ0NfRElTQ19UUkFGX0FDSywJIklQQSBEaXNjb25uZWN0IFRyYWZmaWMgQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX0RJU0NfVFJBRl9OQUNLLAkiSVBBIERpc2Nvbm5lY3QgVHJhZmZpYyBOQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX0RFRl9CT09UX1NXLAkiSVBBIERlZmF1bHQgQm9vdCBTb2Z0d2FyZSIgfSwKKysJeyBOTV9NVF9JUEFDQ19ERUZfQk9PVF9TV19BQ0ssCSJJUEEgRGVmYXVsdCBCb290IFNvZnR3YXJlIEFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19ERUZfQk9PVF9TV19OQUNLLAkiSVBBIERlZmF1bHQgQm9vdCBTb2Z0d2FyZSBOQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX1NFVF9OVkFUVFIsCSJJUEEgU2V0IE5WUkFNIEF0dHJpYnV0ZXMiIH0sCisrCXsgTk1fTVRfSVBBQ0NfU0VUX05WQVRUUl9BQ0ssCSJJUEEgU2V0IE5WUkFNIEF0dHJpYnV0ZXMgQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX1NFVF9OVkFUVFJfTkFDSywJIklQQSBTZXQgTlZSQU0gQXR0cmlidXRlcyBOQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX0dFVF9OVkFUVFIsCSJJUEEgR2V0IE5WUkFNIEF0dHJpYnV0ZXMiIH0sCisrCXsgTk1fTVRfSVBBQ0NfR0VUX05WQVRUUl9BQ0ssCSJJUEEgR2V0IE5WUkFNIEF0dHJpYnV0ZXMgQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX0dFVF9OVkFUVFJfTkFDSywJIklQQSBHZXQgTlZSQU0gQXR0cmlidXRlcyBOQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX1NFVF9BVFRSLAkJIklQQSBTZXQgQXR0cmlidXRlcyIgfSwKKysJeyBOTV9NVF9JUEFDQ19TRVRfQVRUUl9BQ0ssCSJJUEEgU2V0IEF0dHJpYnV0ZXMgQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX1NFVF9BVFRSX05BQ0ssCSJJUEEgU2V0IEF0dHJpYnV0ZXMgTkFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19BVFRSX0NIR19FVlQsCSJJUEEgQXR0cmlidXRlIENoYW5nZSBFdmVudCIgfSwKKysJeyBOTV9NVF9JUEFDQ19TV19ERUFDVCwJCSJJUEEgU29mdHdhcmUgRGVhY3RpdmF0ZSIgfSwKKysJeyBOTV9NVF9JUEFDQ19TV19ERUFDVF9BQ0ssCSJJUEEgU29mdHdhcmUgRGVhY3RpdmF0ZSBBQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfU1dfREVBQ1RfTkFDSywJIklQQSBTb2Z0d2FyZSBEZWFjdGl2YXRlIE5BQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfTUVBU19SRVNfUkVRX05BQ0ssIklQQSBNZWFzdXJlbWVudCBSZXN1bHQgUmVxdWVzdCBOQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX1NUQVJUX01FQVNfTkFDSywJIklQQSBTdGFydCBNZWFzdXJlbWVudCBOQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX1NUT1BfTUVBU19OQUNLLAkiSVBBIFN0b3AgTWVhc3VyZW1lbnQgTkFDSyIgfSwKKysJeyBOTV9NVF9CUzExX1JFU0VUX1JFU09VUkNFLAkiU0lFIFJlc2V0IFJlc291cmNlIiB9LAorKwl7IE5NX01UX0JTMTFfQkVHSU5fREJfVFgsCSJTSUUgQmVnaW4gRGF0YWJhc2UgVHJhbnNtaXNzaW9uIiB9LAorKwl7IE5NX01UX0JTMTFfQkVHSU5fREJfVFhfQUNLLAkiU0lFIEJlZ2luIERhdGFiYXNlIFRyYW5zbWlzc2lvbiBBQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9CRUdJTl9EQl9UWF9OQUNLLAkiU0lFIEJlZ2luIERhdGFiYXNlIFRyYW5zbWlzc2lvbiBOQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfRU5EX0RCX1RYLAkJIlNJRSBFbmQgRGF0YWJhc2UgVHJhbnNtaXNzaW9uIiB9LAorKwl7IE5NX01UX0JTMTFfRU5EX0RCX1RYX0FDSywJIlNJRSBFbmQgRGF0YWJhc2UgVHJhbnNtaXNzaW9uIEFDSyIgfSwKKysJeyBOTV9NVF9CUzExX0VORF9EQl9UWF9OQUNLLAkiU0lFIEVuZCBEYXRhYmFzZSBUcmFuc21pc3Npb24gTkFDSyIgfSwKKysJeyBOTV9NVF9CUzExX0NSRUFURV9PQkosCSJTSUUgQ3JlYXRlIE9iamVjdCIgfSwKKysJeyBOTV9NVF9CUzExX0NSRUFURV9PQkpfQUNLLAkiU0lFIENyZWF0ZSBPYmplY3QgQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfQ1JFQVRFX09CSl9OQUNLLAkiU0lFIENyZWF0ZSBPYmplY3QgTkFDSyIgfSwKKysJeyBOTV9NVF9CUzExX0RFTEVURV9PQkosCSJTSUUgRGVsZXRlIE9iamVjdCIgfSwKKysJeyBOTV9NVF9CUzExX0RFTEVURV9PQkpfQUNLLAkiU0lFIERlbGV0ZSBPYmplY3QgQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfREVMRVRFX09CSl9OQUNLLAkiU0lFIERlbGV0ZSBPYmplY3QgTkFDSyIgfSwKKysJeyBOTV9NVF9CUzExX0dFVF9TVEFURSwJCSJTSUUgR2V0IFN0YXRlIiB9LAorKwl7IE5NX01UX0JTMTFfR0VUX1NUQVRFX0FDSywJIlNJRSBHZXQgU3RhdGUgQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfTE1UX0xPR09OLAkJIlNJRSBMTVQgTG9nb24iIH0sCisrCXsgTk1fTVRfQlMxMV9MTVRfTE9HT05fQUNLLAkiU0lFIExNVCBMb2dvbiBBQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9SRVNUQVJULAkJIlNJRSBSZXN0YXJ0IiB9LAorKwl7IE5NX01UX0JTMTFfUkVTVEFSVF9BQ0ssCSJTSUUgUmVzdGFydCBBQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9ESVNDT05ORUNULAkiU0lFIERpc2Nvbm5lY3QgQlRTIiB9LAorKwl7IE5NX01UX0JTMTFfRElTQ09OTkVDVF9BQ0ssCSJTSUUgRGlzY29ubmVjdCBCVFMgQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfTE1UX0xPR09GRiwJIlNJRSBMTVQgTG9nb2ZmIiB9LAorKwl7IE5NX01UX0JTMTFfTE1UX0xPR09GRl9BQ0ssCSJTSUUgTE1UIExvZ29mZiBBQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9SRUNPTk5FQ1QsCQkiU0lFIFJlY29ubmVjdCBCVFMiIH0sCisrCXsgTk1fTVRfQlMxMV9SRUNPTk5FQ1RfQUNLLAkiU0lFIFJlY29ubmVjdCBCVFMgQUNLIiB9LAorK307CisrCisrLyogVFMgMTIuMjEgU2VjdGlvbiA5LjI6IE9iamVjdCBDbGFzcyAqLworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX2ZvbV9vYmpjbGFzc192YWxzW10gPSB7CisrCXsgTk1fT0NfU0lURV9NQU5BR0VSLAkJIkJUUyBTaXRlIE1hbmFnZXIiIH0sCisrCXsgTk1fT0NfQlRTLAkJCSJCVFMiIH0sCisrCXsgTk1fT0NfUkFESU9fQ0FSUklFUiwJCSJSYWRpbyBDYXJyaWVyIiB9LAorKwl7IE5NX09DX0NIQU5ORUwsCQkiUmFkaW8gQ2hhbm5lbCIgfSwKKysJeyBOTV9PQ19CQVNFQl9UUkFOU0MsCQkiQmFzZWJhbmQgVHJhbnNjZWl2ZXIiIH0sCisrCS8qIHByb3ByaWV0YXJ5LCB2ZW5kb3Igc3BlY2lmaWMgKi8KKysJeyBOTV9PQ19CUzExX0FESkMsCQkiU0lFIEFkamFjZW5kIENoYW5uZWwiIH0sCisrCXsgTk1fT0NfQlMxMV9IQU5ET1ZFUiwJCSJTSUUgSGFuZG92ZXIiIH0sCisrCXsgTk1fT0NfQlMxMV9QV1JfQ1RSTCwJCSJTSUUgUG93ZXIgQ29udHJvbCIgfSwKKysJeyBOTV9PQ19CUzExX0JUU0UsCQkiU0lFIEJUU0UiIH0sCisrCXsgTk1fT0NfQlMxMV9SQUNLLAkJIlNJRSBSYWNrIiB9LAorKwl7IE5NX09DX0JTMTEsCQkJIlNJRSBTaWVtZW5zSFciIH0sCisrCXsgTk1fT0NfQlMxMV9URVNULAkJIlNJRSBUZXN0IiB9LAorKwl7IE5NX09DX0JTMTFfRU5WQUJUU0UsCQkiU0lFIEVudmFCVFNFIiB9LAorKwl7IE5NX09DX0JTMTFfQlBPUlQsCQkiU0lFIEJQb3J0IiB9LAorKwl7IE5NX09DX0dQUlNfTlNFLAkJIkdQUlMgTlNFIiB9LAorKwl7IE5NX09DX0dQUlNfQ0VMTCwJCSJHUFJTIENlbGwiIH0sCisrCXsgTk1fT0NfR1BSU19OU1ZDMCwJCSJHUFJTIE5TVkMwIiB9LAorKwl7IE5NX09DX0dQUlNfTlNWQzEsCQkiR1BSUyBOU1ZDMSIgfSwKKysJeyBOTV9PQ19OVUxMLAkJCSJOVUxMIiB9LAorK307CisrCisrLyogVFMgMTIuMjEgU2VjdGlvbiA5LjQ6IEF0dHJpYnV0ZXMgKi8KKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIG9tbF9mb21fYXR0cl92YWxzW10gPSB7CisrCXsgTk1fQVRUX0FCSVNfQ0hBTk5FTCwJCSJBLWJpcyBDaGFubmVsIiB9LAorKwl7IE5NX0FUVF9BRERfSU5GTywJCSJBZGRpdGlvbmFsIEluZm9ybWF0aW9uIiB9LAorKwl7IE5NX0FUVF9BRERfVEVYVCwJCSJBZGRpdGlvbmFsIFRleHQiIH0sCisrCXsgTk1fQVRUX0FETV9TVEFURSwJCSJBZG1pbmlzdHJhdGl2ZSBTdGF0ZSIgfSwKKysJeyBOTV9BVFRfQVJGQ05fTElTVCwJCSJBUkZDTiBMaXN0IiB9LAorKwl7IE5NX0FUVF9BVVRPTl9SRVBPUlQsCQkiQXV0b25vbW91c2x5IFJlcG9ydCIgfSwKKysJeyBOTV9BVFRfQVZBSUxfU1RBVFVTLAkJIkF2YWlsYWJpbGl0eSBTdGF0dXMiIH0sCisrCXsgTk1fQVRUX0JDQ0hfQVJGQ04sCQkiQkNDSCBBUkZDTiIgfSwKKysJeyBOTV9BVFRfQlNJQywJCQkiQlNJQyIgfSwKKysJeyBOTV9BVFRfQlRTX0FJUl9USU1FUiwJCSJCVFMgQWlyIFRpbWVyIiB9LAorKwl7IE5NX0FUVF9DQ0NIX0xfSV9QLAkJIkNDQ0ggTG9hZCBJbmRpY2F0aW9uIFBlcmlvZCIgfSwKKysJeyBOTV9BVFRfQ0NDSF9MX1QsCQkiQ0NDSCBMb2FkIFRocmVzaG9sZCIgfSwKKysJeyBOTV9BVFRfQ0hBTl9DT01CLAkJIkNoYW5uZWwgQ29tYmluYXRpb24iIH0sCisrCXsgTk1fQVRUX0NPTk5fRkFJTF9DUklULAkiQ29ubmVjdGlvbiBGYWlsIENyaXRlcmlvbiIgfSwKKysJeyBOTV9BVFRfREVTVCwJCQkiRGVzdGluYXRpb24iIH0sCisrCXsgTk1fQVRUX0VWRU5UX1RZUEUsCQkiRXZlbnQgVHlwZSIgfSwKKysJeyBOTV9BVFRfRklMRV9JRCwJCSJGaWxlIElEIiB9LAorKwl7IE5NX0FUVF9GSUxFX1ZFUlNJT04sCQkiRmlsZSBWZXJzaW9uIiB9LAorKwl7IE5NX0FUVF9HU01fVElNRSwJCSJHU00gVGltZSIgfSwKKysJeyBOTV9BVFRfSFNOLAkJCSJIU04iIH0sCisrCXsgTk1fQVRUX0hXX0NPTkZJRywJCSJIVyBDb25maWd1cmF0aW9uIiB9LAorKwl7IE5NX0FUVF9IV19ERVNDLAkJIkhXIERlc2NyaXB0aW9uIiB9LAorKwl7IE5NX0FUVF9JTlRBVkVfUEFSQU0sCQkiSW50YXZlIFBhcmFtZXRlciIgfSwKKysJeyBOTV9BVFRfSU5URVJGX0JPVU5ELAkJIkludGVyZmVyZW5jZSBCb3VuZGFyaWVzIiB9LAorKwl7IE5NX0FUVF9MSVNUX1JFUV9BVFRSLAkJIkxpc3Qgb2YgcmVxdWlyZWQgQXR0cmlidXRlcyIgfSwKKysJeyBOTV9BVFRfTUFJTywJCQkiTUFJTyIgfSwKKysJeyBOTV9BVFRfTUFOVUZfU1RBVEUsCQkiTWFudWZhY3R1cmVyIERlcGVuZGVudCBTdGF0ZSIgfSwKKysJeyBOTV9BVFRfTUFOVUZfVEhSRVNILAkJIk1hbnVmYWN0dXJlciBEZXBlbmRlbnQgVGhyZXNob2xkcyIgfSwKKysJeyBOTV9BVFRfTUFOVUZfSUQsCQkiTWFudWZhY3R1cmVyIElkIiB9LAorKwl7IE5NX0FUVF9NQVhfVEEsCQkiTWF4aW11bSBUaW1pbmcgQWR2YW5jZSIgfSwKKysJeyBOTV9BVFRfTURST1BfTElOSywJCSJNdWx0aS1kcm9wIEJTQyBMaW5rIiB9LAorKwl7IE5NX0FUVF9NRFJPUF9ORVhULAkJIk11bHRpLWRyb3AgbmV4dCBCVFMgTGluayIgfSwKKysJeyBOTV9BVFRfTkFDS19DQVVTRVMsCQkiTkFDSyBDYXVzZXMiIH0sCisrCXsgTk1fQVRUX05ZMSwJCQkiTnkxIiB9LAorKwl7IE5NX0FUVF9PUEVSX1NUQVRFLAkJIk9wZXJhdGlvbmFsIFN0YXRlIiB9LAorKwl7IE5NX0FUVF9PVkVSTF9QRVJJT0QsCQkiT3ZlcmxvYWQgUGVyaW9kIiB9LAorKwl7IE5NX0FUVF9QSFlTX0NPTkYsCQkiUGh5c2ljYWwgQ29uZmlnIiB9LAorKwl7IE5NX0FUVF9QT1dFUl9DTEFTUywJCSJQb3dlciBDbGFzcyIgfSwKKysJeyBOTV9BVFRfUE9XRVJfVEhSRVNILAkJIlBvd2VyIE91dHB1dCBUaHJlc2hvbGRzIiB9LAorKwl7IE5NX0FUVF9QUk9CX0NBVVNFLAkJIlByb2JhYmxlIENhdXNlIiB9LAorKwl7IE5NX0FUVF9SQUNIX0JfVEhSRVNILAkJIlJBQ0ggQnVzeSBUaHJlc2hvbGQiIH0sCisrCXsgTk1fQVRUX0xEQVZHX1NMT1RTLAkJIlJBQ0ggTG9hZCBBdmVyYWdpbmcgU2xvdHMiIH0sCisrCXsgTk1fQVRUX1JBRF9TVUJDLAkJIlJhZGlvIFN1YiBDaGFubmVsIiB9LAorKwl7IE5NX0FUVF9SRl9NQVhQT1dSX1IsCQkiUkYgTWF4IFBvd2VyIFJlZHVjdGlvbiIgfSwKKysJeyBOTV9BVFRfU0lURV9JTlBVVFMsCQkiU2l0ZSBJbnB1dHMiIH0sCisrCXsgTk1fQVRUX1NJVEVfT1VUUFVUUywJCSJTaXRlIE91dHB1dHMiIH0sCisrCXsgTk1fQVRUX1NPVVJDRSwJCSJTb3VyY2UiIH0sCisrCXsgTk1fQVRUX1NQRUNfUFJPQiwJCSJTcGVjaWZpYyBQcm9ibGVtcyIgfSwKKysJeyBOTV9BVFRfU1RBUlRfVElNRSwJCSJTdGFydGluZyBUaW1lIiB9LAorKwl7IE5NX0FUVF9UMjAwLAkJCSJUMjAwIiB9LAorKwl7IE5NX0FUVF9URUksCQkJIlRFSSIgfSwKKysJeyBOTV9BVFRfVEVTVF9EVVIsCQkiVGVzdCBEdXJhdGlvbiIgfSwKKysJeyBOTV9BVFRfVEVTVF9OTywJCSJUZXN0IE5vIiB9LAorKwl7IE5NX0FUVF9URVNUX1JFUE9SVCwJCSJUZXN0IFJlcG9ydCBJbmZvIiB9LAorKwl7IE5NX0FUVF9WU1dSX1RIUkVTSCwJCSJWU1dSIFRocmVzaG9sZHMgIiB9LAorKwl7IE5NX0FUVF9XSU5ET1dfU0laRSwJCSJXaW5kb3cgU2l6ZSIgfSwKKysJeyBOTV9BVFRfQlMxMV9SU1NJX09GRlMsCSJTSUUgUlNTSSBPZmZzZXQiIH0sCisrCXsgTk1fQVRUX0JTMTFfVFhQV1IsCQkiU0lFIFRYIFBvd2VyIiB9LAorKwl7IE5NX0FUVF9CUzExX0RJVkVSU0lUWSwJIlNJRSBEaXZlcnNpdHkiIH0sCisrCXsgTk1fQVRUX1RTQywJCQkiVHJhaW5pbmcgU2VxdWVuY2UgQ29kZSIgfSwKKysJeyBOTV9BVFRfU1dfQ09ORklHLAkJIlNXIENvbmZpZ3VyYXRpb24iIH0sCisrCXsgTk1fQVRUX1NXX0RFU0NSLAkJIlNXIERlc2NyaXB0aW9uIiB9LAorKwl7IE5NX0FUVF9TRVZFUklUWSwJCSJQZXJjZWl2ZWQgU2V2ZXJpdHkiIH0sCisrCXsgTk1fQVRUX0dFVF9BUkksCQkiR2V0IEFSSSIgfSwKKysJeyBOTV9BVFRfSFdfQ09ORl9DSEcsCQkiSFcgQ29uZmlndXJhdGlvbiBDaGFuZ2UiIH0sCisrCXsgTk1fQVRUX09VVFNUX0FMQVJNLAkJIk91dHN0YW5kaW5nIEFsYXJtIiB9LAorKwl7IE5NX0FUVF9GSUxFX0RBVEEsCQkiRmlsZSBEYXRhIiB9LAorKwl7IE5NX0FUVF9NRUFTX1JFUywJCSJNZWFzdXJlbWVudCBSZXN1bHQiIH0sCisrCXsgTk1fQVRUX01FQVNfVFlQRSwJCSJNZWFzdXJlbWVudCBUeXBlIiB9LAorKwl7IE5NX0FUVF9CUzExX0VTTl9GV19DT0RFX05PLAkiU0lFIEVTTiBGVyBDb2RlIE51bWJlciIgfSwKKysJeyBOTV9BVFRfQlMxMV9FU05fSFdfQ09ERV9OTywJIlNJRSBFU04gSFcgQ29kZSBOdW1iZXIiIH0sCisrCXsgTk1fQVRUX0JTMTFfRVNOX1BDQl9TRVJJQUwsCSJTSUUgRVNOIFBDQiBTZXJpYWwgTnVtYmVyIiB9LAorKwl7IE5NX0FUVF9CUzExX0VYQ0VTU0lWRV9ESVNUQU5DRSwgIlNJRSBFeGNlc3NpdmUgRGlzdGFuY2UiIH0sCisrCXsgTk1fQVRUX0JTMTFfQUxMX1RFU1RfQ0FURywJIlNJRSBBbGwgVGVzdCBDYXRlZ29yaWVzIiB9LAorKwl7IE5NX0FUVF9CUzExX0JUU0xTX0hPUFBJTkcsCSJTSUUgQlRTIExTIEhvcHBpbmciIH0sCisrCXsgTk1fQVRUX0JTMTFfQ0VMTF9BTExPQ19OUiwJIlNJRSBDZWxsIEFsbG9jYXRpb24gTnVtYmVyIiB9LAorKwl7IE5NX0FUVF9CUzExX0NFTExfR0xPQkFMX0lELAkiU0lFIENlbGwgR2xvYmFsIElEIiB9LAorKwl7IE5NX0FUVF9CUzExX0VOQV9JTlRFUkZfQ0xBU1MsCSJTSUUgRW5hYmxlIEludGVyZmVyZW5jZSBDbGFzcyIgfSwKKysJLyogRklYTUUgKi8KKysJeyBOTV9BVFRfQlMxMV9FTkFfTVNfUFdSX0NUUkwsCSJTSUUgRW5hYmxlIE1TIFBvd2VyIENvbnRyb2wiIH0sCisrCXsgTk1fQVRUX0JTMTFfRU5BX1BXUl9CREdUX0hPLAkiU0lFIEVuYWJsZSBQb3dlciBCdWRnZXQgSE8iIH0sCisrCXsgTk1fQVRUX0JTMTFfRU5BX1JYTEVWX0hPLAkiU0lFIEVuYWJsZSBSeExldmVsIEhPIiB9LAorKwl7IE5NX0FUVF9CUzExX0VOQV9SWFFVQUxfSE8sCSJTSUUgRW5hYmxlIFJ4UXVhbCBITyIgfSwKKysJeyBOTV9BVFRfQlMxMV9GQUNDSF9RVUFMLAkiU0lFIEZBQ0NIIFF1YWxpdHkiIH0sCisrCXsgTk1fQVRUX0lQQUNDX0RTVF9JUCwJCSJJUEEgRGVzdGluYXRpb24gSVAgQWRkcmVzcyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfRFNUX0lQX1BPUlQsCSJJUEEgRGVzdGlvbmF0aW9uIElQIFBvcnQiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1NTUkMsCQkiSVBBIFJUUCBTU1JDIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19SVFBfUEFZTERfVFlQRSwJIklQQSBSVFAgUGF5bG9hZCBUeXBlIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19CQVNFQl9JRCwJIklQQSBCYXNlYmFuZCBJZGVudGlmaWVyIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19TVFJFQU1fSUQsCSJJUEEgU3RyZWFtIElkZW50aWZpZXIiIH0sCisrCXsgTk1fQVRUX0lQQUNDX05WX0ZMQUdTLAkiSVBBIE5WUkFNIEZsYWdzIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19GUkVRX0NUUkwsCSJJUEEgRnJlcXVlbmN5IENvbnRyb2wiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1BSSU1fT01MX0NGRywJIklQQSBQcmltYXJ5IE9NTCBDb25maWciIH0sCisrCXsgTk1fQVRUX0lQQUNDX1NFQ19PTUxfQ0ZHLAkiSVBBIFNlY29uZGFyeSBPTUwgQ29uZmlnIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19JUF9JRl9DRkcsCSJJUEEgSVAgSW50ZXJmYWNlIENvbmZpZyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfSVBfR1dfQ0ZHLAkiSVBBIElQIEdhdGV3YXkgQ29uZmlnIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19JTl9TRVJWX1RJTUUsCSJJUEEgSW4gU2VydmljZSBUaW1lIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19UUlhfQlRTX0FTUywJIklQQSBUUlggQlRTIEFzc2lnbm1lbnQiIH0sCisrCXsgTk1fQVRUX0lQQUNDX0xPQ0FUSU9OLAkiSVBBIEJUUyBMb2NhdGlvbiBOYW1lIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19QQUdJTkdfQ0ZHLAkiSVBBIFBhZ2luZyBDb25maWd1cmF0aW9uIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19GSUxFX0RBVEEsCSJJUEEgRmlsZSBEYXRhIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19VTklUX0lELAkJIklQQSBVbml0IElEIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19QQVJFTlRfVU5JVF9JRCwJIklQQSBQYXJlbnQgVW5pdCBJRCIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfVU5JVF9OQU1FLAkiSVBBIFVuaXQgTmFtZSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfU05NUF9DRkcsCSJJUEEgU05NUCBDb25maWciIH0sCisrCXsgTk1fQVRUX0lQQUNDX1BSSU1fT01MX0NGR19MSVNULCAiSVBBIFByaW1hcnkgT01MIENvbmZpZyBMaXN0IiB9LAorKwl7IE5NX0FUVF9JUEFDQ19QUklNX09NTF9GQl9UT1VULCJJUEEgUHJpbWFyeSBPTUwgRmFsbGJhY2sgVGltZW91dCIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfQ1VSX1NXX0NGRywJIklQQSBDdXJyZW50IFNvZnR3YXJlIENvbmZpZyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfVElNSU5HX0JVUywJIklQQSBUaW1pbmcgQnVzIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19DR0ksCQkiSVBBIENHSSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfUkFDLAkJIklQQSBSQUMiIH0sCisrCXsgTk1fQVRUX0lQQUNDX09CSl9WRVJTSU9OLAkiSVBBIE9iamVjdCBWZXJzaW9uIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19HUFJTX1BBR0lOR19DRkcsCSJJUEEgR1BSUyBQYWdpbmcgQ29uZmlndXJhdGlvbiIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfTlNFSSwJCSJJUEEgTlNFSSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfQlZDSSwJCSJJUEEgQlZDSSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfTlNWQ0ksCQkiSVBBIE5TVkNJIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19OU19DRkcsCQkiSVBBIE5TIENvbmZpZ3VyYXRpb24iIH0sCisrCXsgTk1fQVRUX0lQQUNDX0JTU0dQX0NGRywJIklQQSBCU1NHUCBDb25maWd1cmF0aW9uIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19OU19MSU5LX0NGRywJIklQQSBOUyBMaW5rIENvbmZpZ3VyYXRpb24iIH0sCisrCXsgTk1fQVRUX0lQQUNDX1JMQ19DRkcsCQkiSVBBIFJMQyBDb25maWd1cmF0aW9uIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19BTE1fVEhSRVNIX0xJU1QsCSJJUEEgQWxhcm0gVGhyZXNob2xkIExpc3QiIH0sCisrCXsgTk1fQVRUX0lQQUNDX01PTklUX1ZBTF9MSVNULAkiSVBBIE1vbml0b3JlZCBWYWx1ZSBMaXN0IiB9LAorKwl7IE5NX0FUVF9JUEFDQ19USUJfQ09OVFJPTCwJIklQQSBUaW1pbmcgSW50ZXJmYWNlIEJ1cyBDb250cm9sIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19TVVBQX0ZFQVRVUkVTLAkiSVBBIFN1cHBvcnRlZCBGZWF0dXJlcyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfQ09ESU5HX1NDSEVNRVMsCSJJUEEgQ29kaW5nIFNjaGVtZXMiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1JMQ19DRkdfMiwJIklQQSBSTEMgQ29uZmlndXJhdGlvbiAyIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19IRUFSVEJfVE9VVCwJIklQQSBIZWFydGJlYXQgVGltZW91dCIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfVVBUSU1FLAkJIklQQSBVcHRpbWUiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1JMQ19DRkdfMywJIklQQSBSTEMgQ29uZmlndXJhdGlvbiAzIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19TU0xfQ0ZHLAkJIklQQSBTU0wgQ29uZmlndXJhdGlvbiIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfU0VDX1BPU1NJQkxFLAkiSVBBIFNlY3VyaXR5IFBvc3NpYmxlIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19JTUxfU1NMX1NUQVRFLAkiSVBBIElNTCBTU0wgU3RhdGUiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1JFVk9DX0RBVEUsCSJJUEEgUmV2b2NhdGlvbiBEYXRlIiB9LAorKwkvKiBGSVhNRTogTW9yZSBTSUUgKi8KKyt9OworKworKy8qIFNlY3Rpb24gOS40LjQ6IEFkbWluaXN0cmF0aXZlIFN0YXRlICovCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfYWRtX3N0YXRlX3ZhbHNbXSA9IHsKKysJeyBOTV9TVEFURV9MT0NLRUQsCQkiTG9ja2VkIiB9LAorKwl7IE5NX1NUQVRFX1VOTE9DS0VELAkJIlVubG9ja2VkIiB9LAorKwl7IE5NX1NUQVRFX1NIVVRET1dOLAkJIlNodXRkb3duIiB9LAorKwl7IE5NX1NUQVRFX05VTEwsCQkiTnVsbCIgfSwKKyt9OworKworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX29wZXJfc3RhdGVfdmFsc1tdID0geworKwl7IDEsCSJEaXNhYmxlZCIgfSwKKysJeyAyLAkiRW5hYmxlZCIgfSwKKysJeyAweGZmLAkiTlVMTCIgfSwKKyt9OworKworKy8qIFNlY3Rpb24gOS40LjcgQXZhaWxhYmlsaXR5IFN0YXR1cyAqLworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX2F2YWlsX3N0YXRlX3ZhbHNbXSA9IHsKKysJeyAwLAkiSW4gdGVzdCIgfSwKKysJeyAxLAkiRmFpbGVkIiB9LAorKwl7IDIsCSJQb3dlciBvZmYiIH0sCisrCXsgMywJIk9mZiBsaW5lIiB9LAorKwl7IDUsCSJEZXBlbmRlbmN5IiB9LAorKwl7IDYsCSJEZWdyYWRlZCIgfSwKKysJeyA3LCAJIk5vdCBpbnN0YWxsZWQiIH0sCisrCXsgMHhmZiwJIk9LIiB9LAorK307CisrCisrLyogU2VjdGlvbiA5LjQuMTM6IENoYW5uZWwgQ29tYmluYXRpb24gKi8KKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIG9tbF9jaGFuX2NvbWJfdmFsc1tdID0geworKwl7IE5NX0NIQU5DX1RDSEZ1bGwsCQkiVENIL0YiIH0sCisrCXsgTk1fQ0hBTkNfVENISGFsZiwJCSJUQ0gvSCIgfSwKKysJeyBOTV9DSEFOQ19UQ0hIYWxmMiwJCSJUQ0gvSCAyIiB9LAorKwl7IE5NX0NIQU5DX1NEQ0NILAkJIlNEQ0NIIiB9LAorKwl7IE5NX0NIQU5DX21haW5CQ0NILAkJIk1haW4gQkNDSCIgfSwKKysJeyBOTV9DSEFOQ19CQ0NIQ29tYiwJCSJDb21iaW5lZCBCQ0NIIiB9LAorKwl7IE5NX0NIQU5DX0JDQ0gsCQkiQkNDSCIgfSwKKysJeyBOTV9DSEFOQ19CQ0NIX0NCQ0gsCQkiQkNDSCtDQkNIIiB9LAorKwl7IE5NX0NIQU5DX1NEQ0NIX0NCQ0gsCQkiU0RDQ0grQ0JDSCIgfSwKKyt9OworKworKy8qIFNlY3Rpb24gOS40LjE2OiBFdmVudCBUeXBlICovCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfZXZlbnRfdHlwZV92YWxzW10gPSB7CisrCXsgTk1fRVZUX0NPTU1fRkFJTCwJCSJDb21tdW5pY2F0aW9uIEZhaWx1cmUiIH0sCisrCXsgTk1fRVZUX1FPU19GQUlMLAkJIlFvUyBGYWlsdXJlIiB9LAorKwl7IE5NX0VWVF9QUk9DX0ZBSUwsCQkiUHJvY2Vzc29yIEZhaWx1cmUiIH0sCisrCXsgTk1fRVZUX0VRVUlQX0ZBSUwsCQkiRXF1aXBtZW50IEZhaWx1cmUiIH0sCisrCXsgTk1fRVZUX0VOVl9GQUlMLAkJIkVudmlyb25tZW50IEZhaWx1cmUiIH0sCisrfTsKKysKKysvKiBTZWN0aW9uIDkuNC42MzogUGVyY2VpdmVkIFNldmVyaXR5ICovCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfc2V2ZXJpdHlfdmFsc1tdID0geworKwl7IE5NX1NFVkVSX0NFQVNFRCwJCSJDZWFzZWQiIH0sCisrCXsgTk1fU0VWRVJfQ1JJVElDQUwsCQkiQ3JpdGljYWwiIH0sCisrCXsgTk1fU0VWRVJfTUFKT1IsCQkiTWFqb3IiIH0sCisrCXsgTk1fU0VWRVJfTUlOT1IsCQkiTWlub3IiIH0sCisrCXsgTk1fU0VWRVJfV0FSTklORywJCSJXYXJuaW5nIiB9LAorKwl7IE5NX1NFVkVSX0lOREVURVJNSU5BVEUsCSJJbmRldGVybWluYXRlIiB9LAorK307CisrCisrLyogU2VjdGlvbiA5LjQuMzY6IE5BQ0sgQ2F1c2VzICovCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfbmFja19jYXVzZVtdID0geworKwl7IE5NX05BQ0tfSU5DT1JSX1NUUlVDVCwJIkluY29ycmVjdCBtZXNzYWdlIHN0cnVjdHVyZSIgfSwKKysJeyBOTV9OQUNLX01TR1RZUEVfSU5WQUwsCSJJbnZhbGlkIG1lc3NhZ2UgdHlwZSB2YWx1ZSIgfSwKKysJeyBOTV9OQUNLX09CSkNMQVNTX0lOVkFMLAkiSW52YWxpZCBPYmplY3QgY2xhc3MgdmFsdWUiIH0sCisrCXsgTk1fTkFDS19PQkpDTEFTU19OT1RTVVBQLAkiT2JqZWN0IENsYXNzIG5vdCBzdXBwb3J0ZWQiIH0sCisrCXsgTk1fTkFDS19CVFNOUl9VTktOLAkJIkJUUyBOdW1iZXIgdW5rbm93biIgfSwKKysJeyBOTV9OQUNLX1RSWE5SX1VOS04sCQkiVFJYIE51bWJlciB1bmtub3duIiB9LAorKwl7IE5NX05BQ0tfT0JKSU5TVF9VTktOLAkJIk9iamVjdCBJbnN0YW5jZSB1bmtub3duIiB9LAorKwl7IE5NX05BQ0tfQVRUUklEX0lOVkFMLAkJIkludmFsaWQgQXR0cmlidXRlIElEIHZhbHVlIiB9LAorKwl7IE5NX05BQ0tfQVRUUklEX05PVFNVUFAsCSJBdHRyaWJ1dGUgSUQgbm90IHN1cHBvcnRlZCIgfSwKKysJeyBOTV9OQUNLX1BBUkFNX1JBTkdFLAkJIlBhcmFtZXRlciB2YWx1ZSBvdXQgb2YgcmFuZ2UiIH0sCisrCXsgTk1fTkFDS19BVFRSTElTVF9JTkNPTlNJU1RFTlQsICJJbmNvbnNpc3RlbmN5IGluIEF0dHJpYnV0ZSBsaXN0IiB9LAorKwl7IE5NX05BQ0tfU1BFQ19JTVBMX05PVFNVUFAsCSJTcGVjaWZpZWQgSW1wbGVtZW50YXRpb24gbm90IHN1cHBvcnRlZCIgfSwKKysJeyBOTV9OQUNLX0NBTlRfUEVSRk9STSwJCSJNZXNzYWdlIGNhbm5vdCBiZSBwZXJmb3JtZWQiIH0sCisrCXsgTk1fTkFDS19SRVNfTk9USU1QTCwJCSJSZXNvdXJjZSBub3QgaW1wbGVtZW50ZWQiIH0sCisrCXsgTk1fTkFDS19SRVNfTk9UQVZBSUwsCQkiUmVzb3VyY2Ugbm90IGF2YWlsYWJsZSIgfSwKKysJeyBOTV9OQUNLX0ZSRVFfTk9UQVZBSUwsCSJGcmVxdWVuY3kgbm90IGF2YWlsYWJsZSIgfSwKKysJeyBOTV9OQUNLX1RFU1RfTk9UU1VQUCwJCSJUZXN0IG5vdCBzdXBwb3J0ZWQiIH0sCisrCXsgTk1fTkFDS19DQVBBQ0lUWV9SRVNUUiwJIkNhcGFjaXR5IHJlc3RyaWN0aW9ucyIgfSwKKysJeyBOTV9OQUNLX1BIWVNDRkdfTk9UUEVSRk9STSwJIlBoeXMgY29uZmlnIGNhbm5vdCBiZSBwZXJmb3JtZWQiIH0sCisrCXsgTk1fTkFDS19URVNUX05PVElOSVQsCQkiVGVzdCBub3QgaW5pdGlhdGVkIiB9LAorKwl7IE5NX05BQ0tfUEhZU0NGR19OT1RSRVNUT1JFLAkiUGh5cyBjb25maWcgY2Fubm90IGJlIHJlc3RvcmVkIiB9LAorKwl7IE5NX05BQ0tfVEVTVF9OT1NVQ0gsCQkiTm8gc3VjaCBUZXN0IiB9LAorKwl7IE5NX05BQ0tfVEVTVF9OT1NUT1AsCQkiVGVzdCBjYW5ub3QgYmUgc3RvcHBlZCIgfSwKKysJeyBOTV9OQUNLX01TR0lOQ09OU0lTVF9QSFlTQ0ZHLAkiTWVzc2FnZSBpbmNvbnNpc3RlbiB3aXRoIHBoeXNpY2FsIGNvbmZpZyIgfSwKKysJeyBOTV9OQUNLX0ZJTEVfSU5DT01QTEVURSwJIkNvbXBsZXRlIGZpbGUgbm90IHJlY2VpdmVkIiB9LAorKwl7IE5NX05BQ0tfRklMRV9OT1RBVkFJTCwJIkZpbGUgbm90IGF2YWlsYWJsZSBhdCBkZXN0aW5hdGlvbiIgfSwKKysJeyBOTV9OQUNLX0ZJTEVfTk9UQUNUSVZBVEUsCSJGaWxlIGNhbm5vdCBiZSBhY3RpdmF0ZWQiIH0sCisrCXsgTk1fTkFDS19SRVFfTk9UX0dSQU5ULAkiUmVxdWVzdCBub3QgZ3JhbnRlZCIgfSwKKysJeyBOTV9OQUNLX1dBSVQsCQkJIldhaXQiIH0sCisrCXsgTk1fTkFDS19OT1RIX1JFUE9SVF9FWElTVCwJIk5vdGhpbmcgcmVwb3J0YWJsZSBleGlzdGluZyIgfSwKKysJeyBOTV9OQUNLX01FQVNfTk9UU1VQUCwJCSJNZWFzdXJlbWVudCBub3Qgc3VwcG9ydGVkIiB9LAorKwl7IE5NX05BQ0tfTUVBU19OT1RTVEFSVCwJIk1lYXN1cmVtZW50IG5vdCBzdGFydGVkIiB9LAorKwl7IDB4ZmYsCQkJCSJOVUxMIiB9LAorK307CisrCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfdGVzdF9ub192YWxzW10gPSB7CisrCXsgTk1fSVBBQ0NfVEVTVE5PX1JMT09QX0FOVCwJIlJhZGlvIExvb3AgdGVzdCB2aWEgYW50ZW5uYSIgfSwKKysJeyBOTV9JUEFDQ19URVNUTk9fUkxPT1BfWENWUiwJIlJhZGlvIExvb3AgdGVzdCB2aWEgdHJhbnNjZWl2ZXIiIH0sCisrCXsgTk1fSVBBQ0NfVEVTVE5PX0ZVTkNfT0JKLAkiQlRTIEZ1bmN0aW9uYWwgb2JqZWN0IHNlbGYgdGVzdCIgfSwKKysJeyBOTV9JUEFDQ19URVNUTk9fQ0hBTl9VU0FHRSwJIkNoYW5uZWwgVXNhZ2UiIH0sCisrCXsgTk1fSVBBQ0NfVEVTVE5PX0JDQ0hfQ0hBTl9VU0FHRSwgIkJDQ0ggQ2hhbm5lbCBVc2FnZSIgfSwKKysJeyBOTV9JUEFDQ19URVNUTk9fRlJFUV9TWU5DLAkiRnJlcXVlbmN5IFN5bmNocm9uaXphdGlvbiIgfSwKKysJeyBOTV9JUEFDQ19URVNUTk9fQkNDSF9JTkZPLAkiQkNDSCBJbmZvcm1hdGlvbiIgfSwKKysJeyBOTV9JUEFDQ19URVNUTk9fVFhfQkVBQ09OLAkiVHJhbnNtaXQgQmVhY29uIiB9LAorKwl7IE5NX0lQQUNDX1RFU1ROT19TWVNJTkZPX01PTklUT1IsICJTeXNJbmZvIE1vbml0b3IiIH0sCisrCXsgTk1fSVBBQ0NfVEVTVE5PX0JDQ0NIX01PTklUT1IsICJCQ0NIICYgQ0NDSCBNb25pdG9yIiB9LAorK307CisrCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBpcGFjY190ZXN0X3Jlc192YWxzW10gPSB7CisrCXsgTk1fSVBBQ0NfVEVTVFJFU19TVUNDRVNTLAkiU3VjY2VzcyIgfSwKKysJeyBOTV9JUEFDQ19URVNUUkVTX1RJTUVPVVQsCSJUaW1lb3V0IiB9LAorKwl7IE5NX0lQQUNDX1RFU1RSRVNfTk9fQ0hBTlMsCSJObyBzdWl0YWJsZSBjaGFubmVscyBhdmFpbGFibGUiIH0sCisrCXsgTk1fSVBBQ0NfVEVTVFJFU19QQVJUSUFMLAkiUGFydGlhbCIgfSwKKysJeyBOTV9JUEFDQ19URVNUUkVTX1NUT1BQRUQsCSJTdG9wcGVkIiB9LAorK307CisrCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBpcGFjY190ZXN0cmVzX2llX3ZhbHNbXSA9IHsKKysJeyBOTV9JUEFDQ19UUl9JRV9GUkVRX0VSUl9MSVNULAkiRnJlcXVlbmN5IEVycm9yIExpc3QiIH0sCisrCXsgTk1fSVBBQ0NfVFJfSUVfQ0hBTl9VU0FHRSwJIkNoYW5uZWwgVXNhZ2UiIH0sCisrCXsgTk1fSVBBQ0NfVFJfSUVfQkNDSF9JTkZPLAkiQkNDSCBJbmZvcm1hdGlvbiIgfSwKKysJeyBOTV9JUEFDQ19UUl9JRV9SRVNVTFRfREVUQUlMUywiUmVzdWx0IERldGFpbHMiIH0sCisrCXsgTk1fSVBBQ0NfVFJfSUVfRlJFUV9FUlIsCSJGcmVxdWVuY3kgRXJyb3IiIH0sCisrfTsKKysKKysvKiBQYXJzZSB0aGUgaXAuYWNjZXNzIHNwZWNpZmljIEJDQ0ggSW5mb3JtYXRpb24gSUUgZW1iZWRkZWQgaW50byB0aGUgVGVzdAorKyAqIFJlcG9ydCBJRSAqLworK3N0YXRpYyBnaW50CisraXBhY2NfdHJfaWVfYmNjaCh0dmJ1ZmZfdCAqdHZiLCBwcm90b190cmVlICphdHRfdHJlZSwgaW50IG9mZnNldCkKKyt7CisrCWd1aW50MTYgYmluZm9fdHlwZSwgdG1wOworKworKwliaW5mb190eXBlID0gdHZiX2dldF9udG9ocyh0dmIsIG9mZnNldCk7CisrCW9mZnNldCArPSAyOworKworKwl0bXAgPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KTsKKysKKysJLyogRklYTUU6IHRoZXJlIGFyZSBzdGlsbCBzb21lIGJ1Z3MgcmVtYWluaW5nIGhlcmUgKi8KKysJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfYXJmY24sCisrCQkJICAgIHR2Yiwgb2Zmc2V0LCAyLCBUUlVFKTsKKysKKysJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfZl9xdWFsLAorKwkJCSAgICB0dmIsIG9mZnNldCwgMiwgVFJVRSk7CisrCW9mZnNldCArPSAyOworKworKwlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9iX3J4bGV2LAorKwkJCSAgICB0dmIsIG9mZnNldCsrLCAxLCBUUlVFKTsKKysKKysJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfcnhxdWFsLAorKwkJCSAgICB0dmIsIG9mZnNldCsrLCAxLCBUUlVFKTsKKysKKysJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfZl9lcnIsCisrCQkJICAgIHR2Yiwgb2Zmc2V0LCAyLCBUUlVFKTsKKysJb2Zmc2V0ICs9IDI7CisrCisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX2ZyYW1lX29mZnMsCisrCQkJICAgIHR2Yiwgb2Zmc2V0LCAyLCBUUlVFKTsKKysJb2Zmc2V0ICs9IDI7CisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX2ZyYW1lbnJfb2ZmcywKKysJCQkgICAgdHZiLCBvZmZzZXQsIDQsIFRSVUUpOworKwlvZmZzZXQgKz0gNDsKKysKKysJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfYnNpYywKKysJCQkgICAgdHZiLCBvZmZzZXQrKywgMSwgVFJVRSk7CisrCisrCWRlX2xhaSh0dmIsIGF0dF90cmVlLCBvZmZzZXQsIDUsIE5VTEwsIDApOworKwlvZmZzZXQgKz0gNTsKKysKKysJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfY2VsbF9pZCwKKysJCQkgICAgdHZiLCBvZmZzZXQsIDIsIFRSVUUpOworKwlvZmZzZXQgKz0gMjsKKysKKysJaWYgKGJpbmZvX3R5cGUgJiAweDgwMDApIHsKKysJCS8qIFN5c3RlbSBJbmZvcm1hdGlvbiAyICovCisrCQkvKiBGSVhNRTogUGFyc2UgMDQuMTggTmVpZ2hib3VyIENlbGwgRGVzY3JpcHRpb24gKi8KKysJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX3NpMiwKKysJCQkJICAgIHR2Yiwgb2Zmc2V0LCAxNiwgVFJVRSk7CisrCQlvZmZzZXQgKz0gMTY7CisrCX0KKysJaWYgKGJpbmZvX3R5cGUgJiAweDAwMDEpIHsKKysJCS8qIFN5c3RlbSBJbmZvcm1hdGlvbiAyYmlzICovCisrCQkvKiBGSVhNRTogUGFyc2UgMDQuMTggTmVpZ2hib3VyIENlbGwgRGVzY3JpcHRpb24gKi8KKysJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX3NpMmJpcywKKysJCQkJICAgIHR2Yiwgb2Zmc2V0LCAxNiwgVFJVRSk7CisrCQlvZmZzZXQgKz0gMTY7CisrCX0KKysJaWYgKGJpbmZvX3R5cGUgJiAweDAwMDIpIHsKKysJCS8qIFN5c3RlbSBJbmZvcm1hdGlvbiAydGVyICovCisrCQkvKiBGSVhNRTogUGFyc2UgMDQuMTggTmVpZ2hib3VyIENlbGwgRGVzY3JpcHRpb24gKi8KKysJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX3NpMnRlciwKKysJCQkJICAgIHR2Yiwgb2Zmc2V0LCAxNiwgVFJVRSk7CisrCQlvZmZzZXQgKz0gMTY7CisrCX0KKysJaWYgKGJpbmZvX3R5cGUgJiAweDAwMDQpIHsKKysJCS8qIEZJWE1FOiBQYXJzZSAwNC4xOCBDZWxsIENoYW5uZWwgRGVzY3JpcHRpb24gKi8KKysJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX2NoYW5fZGVzYywKKysJCQkJICAgIHR2Yiwgb2Zmc2V0LCAxNiwgVFJVRSk7CisrCQlvZmZzZXQgKz0gMTY7CisrCX0KKysKKysJcmV0dXJuIG9mZnNldDsKKyt9CisrCisrLyogUGFyc2UgdGhlIGlwLmFjY2VzcyBzcGVjaWZpYyBDaGFubmVsIFVzYWdlIElFIGVtYmVkZGVkIGludG8gdGhlIFRlc3QKKysgKiBSZXBvcnQgSUUgKi8KKytzdGF0aWMgZ2ludAorK2lwYWNjX3RyX2llX2NoYW5fdXNhZ2UodHZidWZmX3QgKnR2YiwgcHJvdG9fdHJlZSAqYXR0X3RyZWUsIGludCBvZmZzZXQpCisreworKwl3aGlsZSAodHZiX3JlcG9ydGVkX2xlbmd0aF9yZW1haW5pbmcodHZiLCBvZmZzZXQpICE9IDApIHsKKysJCWd1aW50MTYgcmVzdWx0ID0gdHZiX2dldF9udG9ocyh0dmIsIG9mZnNldCk7CisrCQlwcm90b190cmVlX2FkZF91aW50KGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9hcmZjbiwKKysJCQkJICAgIHR2Yiwgb2Zmc2V0LCAyLCByZXN1bHQpOworKwkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfcnhsZXYsCisrCQkJCSAgICB0dmIsIG9mZnNldCwgMiwgcmVzdWx0KTsKKysJCW9mZnNldCArPSAyOworKwl9CisrCXJldHVybiBvZmZzZXQ7CisrfQorKworKy8qIFBhcnNlIHRoZSBpcC5hY2Nlc3Mgc3BlY2lmaWMgZm9ybWF0IG9mIHRoZSBzdGFuZGFyZCB0ZXN0IHJlcG9ydCBJRSAqLworK3N0YXRpYyBnaW50CisrZGlzc2VjdF9pcGFjY190ZXN0X3JlcChwcm90b190cmVlICp0cmVlLCB0dmJ1ZmZfdCAqdHZiKQorK3sKKysJZ2ludCBvZmZzZXQgPSAwOworKworKwlwcm90b190cmVlX2FkZF9pdGVtKHRyZWUsIGhmX2F0dHJfaXBhX3Rlc3RfcmVzLCB0dmIsIG9mZnNldCsrLAorKwkJCSAgICAxLCBGQUxTRSk7CisrCisrCXdoaWxlICh0dmJfcmVwb3J0ZWRfbGVuZ3RoX3JlbWFpbmluZyh0dmIsIG9mZnNldCkgIT0gMCkgeworKwkJZ3VpbnQ4IGllID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpOworKwkJZ3VpbnQxNiBsZW4gPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KzEpOworKwkJcHJvdG9faXRlbSAqdGk7CisrCQlwcm90b190cmVlICphdHRfdHJlZTsKKysKKysJCXRpID0gcHJvdG9fdHJlZV9hZGRfaXRlbSh0cmVlLCBoZl9vbWxfaXBhX3RyZXNfYXR0cl90YWcsIHR2YiwKKysJCQkJCSBvZmZzZXQrKywgMSwgRkFMU0UpOworKwkJYXR0X3RyZWUgPSBwcm90b19pdGVtX2FkZF9zdWJ0cmVlKHRpLCBldHRfb21sX2ZvbV9hdHQpOworKwkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfb21sX2lwYV90cmVzX2F0dHJfbGVuLCB0dmIsCisrCQkJCSAgICBvZmZzZXQsIDIsIGxlbik7CisrCQlvZmZzZXQgKz0gMjsKKysKKysJCXN3aXRjaCAoaWUpIHsKKysJCWNhc2UgTk1fSVBBQ0NfVFJfSUVfQ0hBTl9VU0FHRToKKysJCQlvZmZzZXQgPSBpcGFjY190cl9pZV9jaGFuX3VzYWdlKHR2YiwKKysJCQkJCQkgCWF0dF90cmVlLCBvZmZzZXQpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9JUEFDQ19UUl9JRV9CQ0NIX0lORk86CisrCQkJb2Zmc2V0ID0gaXBhY2NfdHJfaWVfYmNjaCh0dmIsCisrCQkJCQkJICBhdHRfdHJlZSwgb2Zmc2V0KTsKKysJCQlicmVhazsKKysJCWRlZmF1bHQ6CisrCQkJYnJlYWs7CisrCQl9CisrCX0KKysJcmV0dXJuIG9mZnNldDsKKyt9CisrCisrLyogRGlzc2VjdCBPTUwgRk9NIEF0dHJpYnV0ZXMgYWZ0ZXIgT01MICsgRk9NIGhlYWRlciAqLworK3N0YXRpYyBnaW50CisrZGlzc2VjdF9vbWxfYXR0cnModHZidWZmX3QgKnR2YiwgaW50IGJhc2Vfb2ZmcywgcGFja2V0X2luZm8gKnBpbmZvLAorKwkJICBwcm90b190cmVlICp0cmVlKQorK3sKKysJaW50IG9mZnNldCA9IGJhc2Vfb2ZmczsKKysKKysJd2hpbGUgKHR2Yl9yZXBvcnRlZF9sZW5ndGhfcmVtYWluaW5nKHR2Yiwgb2Zmc2V0KSAhPSAwKSB7CisrCQlndWludCBpOworKwkJZ3VpbnQ4IHRhZywgdmFsODsKKysJCWd1aW50MTYgdmFsMTY7CisrCQlndWludDMyIHZhbDMyOworKwkJdW5zaWduZWQgaW50IGxlbiwgbGVuX2xlbiwgaGxlbjsKKysJCWNvbnN0IHN0cnVjdCB0bHZfZGVmICp0ZGVmOworKwkJcHJvdG9faXRlbSAqdGk7CisrCQlwcm90b190cmVlICphdHRfdHJlZTsKKysJCXR2YnVmZl90ICpzdWJfdHZiOworKworKwkJdGFnID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpOworKwkJdGRlZiA9ICZubV9hdHRfdGx2ZGVmLmRlZlt0YWddOworKworKwkJc3dpdGNoICh0ZGVmLT50eXBlKSB7CisrCQljYXNlIFRMVl9UWVBFX0ZJWEVEOgorKwkJCWhsZW4gPSAxOworKwkJCWxlbl9sZW4gPSAwOworKwkJCWxlbiA9IHRkZWYtPmZpeGVkX2xlbjsKKysJCQlicmVhazsKKysJCWNhc2UgVExWX1RZUEVfVDoKKysJCQlobGVuID0gMTsKKysJCQlsZW5fbGVuID0gMDsKKysJCQlsZW4gPSAwOworKwkJCWJyZWFrOworKwkJY2FzZSBUTFZfVFlQRV9UVjoKKysJCQlobGVuID0gMTsKKysJCQlsZW5fbGVuID0gMDsKKysJCQlsZW4gPSAxOworKwkJCWJyZWFrOworKwkJY2FzZSBUTFZfVFlQRV9UTFY6CisrCQkJaGxlbiA9IDI7CisrCQkJbGVuX2xlbiA9IDE7CisrCQkJbGVuID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQrMSk7CisrCQkJYnJlYWs7CisrCQljYXNlIFRMVl9UWVBFX1RMMTZWOgorKwkJCWhsZW4gPSAzOworKwkJCWxlbl9sZW4gPSAyOworKwkJCWxlbiA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzEpIDw8IDggfAorKwkJCQkJCXR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzIpOworKwkJCWJyZWFrOworKwkJZGVmYXVsdDoKKysJCQlobGVuID0gbGVuX2xlbiA9IGxlbiA9IDA7CisrCQkJRElTU0VDVE9SX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworKwkJCWJyZWFrOworKwkJfQorKworKwkJdGkgPSBwcm90b190cmVlX2FkZF9pdGVtKHRyZWUsIGhmX29tbF9mb21fYXR0cl90YWcsIHR2YiwKKysJCQkJCSBvZmZzZXQsIDEsIEZBTFNFKTsKKysJCWF0dF90cmVlID0gcHJvdG9faXRlbV9hZGRfc3VidHJlZSh0aSwgZXR0X29tbF9mb21fYXR0KTsKKysJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX29tbF9mb21fYXR0cl9sZW4sIHR2YiwKKysJCQkJICAgIG9mZnNldCsxLCBsZW5fbGVuLCBsZW4pOworKwkJb2Zmc2V0ICs9IGhsZW47CisrCisrCQlzdWJfdHZiID0gdHZiX25ld19zdWJzZXQodHZiLCBvZmZzZXQsIGxlbiwgbGVuKTsKKysKKysJCXN3aXRjaCAodGFnKSB7CisrCQkvKiBwYXJzZSBvbmx5IHRoZSBtb3N0IGNvbW1vbiBJRSBmb3Igbm93ICovCisrCQljYXNlIE5NX0FUVF9BQklTX0NIQU5ORUw6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9hY2hfYnRzcCwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgMSwgVFJVRSk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9hY2hfdHNsb3QsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQrMSwgMSwgVFJVRSk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9hY2hfc3Nsb3QsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQrMiwgMSwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9BRE1fU1RBVEU6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9hZG1fc3RhdGUsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCXZhbDggPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCk7CisrCQkJY29sX2FwcGVuZF9mc3RyKHBpbmZvLT5jaW5mbywgQ09MX0lORk8sICIlcyAiLAorKwkJCQkJdmFsX3RvX3N0cih2YWw4LCBvbWxfYWRtX3N0YXRlX3ZhbHMsCisrCQkJCQkJICAgIiUwMngiKSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9BUkZDTl9MSVNUOgorKwkJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMikgeworKwkJCQl2YWwxNiA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQgKyBpKTsKKysJCQkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfYXR0cl9hcmZjbiwKKysJCQkJCQkgICAgdHZiLCBvZmZzZXQgKyBpLCAyLCB2YWwxNik7CisrCQkJfQorKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfQVZBSUxfU1RBVFVTOgorKwkJCS8qIEF2YWlsYWJpbGl0eSBzdGF0dXMgY2FuIGhhdmUgbGVuZ3RoIDAgKi8KKysJCQlpZiAobGVuKSB7CisrCQkJCXZhbDggPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCk7CisrCQkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsCisrCQkJCQkJICAgIGhmX2F0dHJfYXZhaWxfc3RhdGUsIHR2YiwKKysJCQkJCSAgICAJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQkJfSBlbHNlCisrCQkJCXZhbDggPSAweGZmOworKwkJCWNvbF9hcHBlbmRfZnN0cihwaW5mby0+Y2luZm8sIENPTF9JTkZPLCAiJXMgIiwKKysJCQkJCXZhbF90b19zdHIodmFsOCwgb21sX2F2YWlsX3N0YXRlX3ZhbHMsCisrCQkJCQkJICAgIiUwMngiKSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9CQ0NIX0FSRkNOOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfYmNjaF9hcmZjbiwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0JTSUM6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9ic2ljLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfQ0hBTl9DT01COgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfY2hhbl9jb21iLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfRVZFTlRfVFlQRToKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2V2ZW50X3R5cGUsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9HU01fVElNRToKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2dzbV90aW1lLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfT1BFUl9TVEFURToKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX29wZXJfc3RhdGUsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCXZhbDggPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCk7CisrCQkJY29sX2FwcGVuZF9mc3RyKHBpbmZvLT5jaW5mbywgQ09MX0lORk8sICIlcyAiLAorKwkJCQkJdmFsX3RvX3N0cih2YWw4LCBvbWxfb3Blcl9zdGF0ZV92YWxzLAorKwkJCQkJCSAgICIlMDJ4IikpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfVEVJOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfdGVpLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfVFNDOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfdHNjLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfU0VWRVJJVFk6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9zZXZlcml0eSwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX1RFU1RfUkVQT1JUOgorKwkJCWRpc3NlY3RfaXBhY2NfdGVzdF9yZXAoYXR0X3RyZWUsIHN1Yl90dmIpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfVEVTVF9OTzoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX3Rlc3Rfbm8sIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgVFJVRSk7CisrCQkJdmFsOCA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KTsKKysJCQljb2xfYXBwZW5kX2ZzdHIocGluZm8tPmNpbmZvLCBDT0xfSU5GTywgIiVzICIsCisrCQkJCQl2YWxfdG9fc3RyKHZhbDgsIG9tbF90ZXN0X25vX3ZhbHMsCisrCQkJCQkJICAgIiUwMngiKSk7CisrCQkJYnJlYWs7CisrCisrCQkvKiBwcm9wcmlldGFyeSBpcC5hY2Nlc3MgZXh0ZW5zaW9ucyAqLworKwkJY2FzZSBOTV9BVFRfSVBBQ0NfRFNUX0lQOgorKwkJCXZhbDMyID0gdHZiX2dldF9udG9obCh0dmIsIG9mZnNldCk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXB2NChhdHRfdHJlZSwgaGZfYXR0cl9pcGFfcnNsX2lwLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIHZhbDMyKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0lQQUNDX0RTVF9JUF9QT1JUOgorKwkJCXZhbDE2ID0gdHZiX2dldF9udG9ocyh0dmIsIG9mZnNldCk7CisrCQkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfYXR0cl9pcGFfcnNsX3BvcnQsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgdmFsMTYpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfSVBBQ0NfTE9DQVRJT046CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfbG9jYXRpb25fbmFtZSwKKysJCQkJCSAgICB0dmIsIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0lQQUNDX1VOSVRfSUQ6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdW5pdF9pZCwKKysJCQkJCSAgICB0dmIsIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0lQQUNDX1VOSVRfTkFNRToKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV91bml0X25hbWUsCisrCQkJCQkgICAgdHZiLCBvZmZzZXQsIGxlbiwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9JUEFDQ19QUklNX09NTF9DRkdfTElTVDoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV9wcmltX29tbF9pcCwKKysJCQkJCSAgICB0dmIsIG9mZnNldCsxLCA0LCBUUlVFKTsKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV9wcmltX29tbF9wb3J0LAorKwkJCQkJICAgIHR2Yiwgb2Zmc2V0KzErNCwgMiwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9JUEFDQ19OVl9GTEFHUzoKKysJCQl7CisrCQkJCWd1aW50IGZsYWdzLCBtYXNrOworKwkJCQlmbGFncyA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KTsKKysJCQkJbWFzayA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzEpOworKwkJCQlmbGFncyB8PSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCsyKSA8PCA4OworKwkJCQltYXNrIHw9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzMpIDw8IDg7CisrCQkJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX2F0dHJfaXBhX252X2ZsYWdzLAorKwkJCQkJCSAgICB0dmIsIG9mZnNldCwgMywgZmxhZ3MpOworKwkJCQlwcm90b190cmVlX2FkZF91aW50KGF0dF90cmVlLCBoZl9hdHRyX2lwYV9udl9tYXNrLAorKwkJCQkJCSAgICB0dmIsIG9mZnNldCsxLCAzLCBtYXNrKTsKKysJCQl9CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9JUEFDQ19SQUM6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfcmFjLAorKwkJCQkJICAgIHR2Yiwgb2Zmc2V0LCAxLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0lQQUNDX05TRUk6CisrCQkJdmFsMTYgPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KTsKKysJCQlwcm90b190cmVlX2FkZF91aW50KGF0dF90cmVlLCBoZl9hdHRyX2lwYV9uc2VpLAorKwkJCQkJICAgdHZiLCBvZmZzZXQsIDIsIHZhbDE2KTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0lQQUNDX05TVkNJOgorKwkJCXZhbDE2ID0gdHZiX2dldF9udG9ocyh0dmIsIG9mZnNldCk7CisrCQkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfYXR0cl9pcGFfbnN2Y2ksCisrCQkJCQkgICB0dmIsIG9mZnNldCwgMiwgdmFsMTYpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfSVBBQ0NfQlZDSToKKysJCQl2YWwxNiA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQpOworKwkJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX2F0dHJfaXBhX2J2Y2ksCisrCQkJCQkgICB0dmIsIG9mZnNldCwgMiwgdmFsMTYpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfSVBBQ0NfTlNfTElOS19DRkc6CisrCQkJdmFsMTYgPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KTsKKysJCQlwcm90b190cmVlX2FkZF91aW50KGF0dF90cmVlLCBoZl9hdHRyX2lwYV9uc2xfc3BvcnQsCisrCQkJCQkgICB0dmIsIG9mZnNldCwgMiwgdmFsMTYpOworKwkJCXZhbDMyID0gdHZiX2dldF9pcHY0KHR2Yiwgb2Zmc2V0KzIpOworKwkJCXByb3RvX3RyZWVfYWRkX2lwdjQoYXR0X3RyZWUsIGhmX2F0dHJfaXBhX25zbF9kYWRkciwKKysJCQkJCSAgIHR2Yiwgb2Zmc2V0KzIsIDQsIHZhbDMyKTsKKysJCQl2YWwxNiA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQrNik7CisrCQkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfYXR0cl9pcGFfbnNsX2Rwb3J0LAorKwkJCQkJICAgdHZiLCBvZmZzZXQrNiwgMiwgdmFsMTYpOworKwkJCWJyZWFrOworKwkJZGVmYXVsdDoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9vbWxfZm9tX2F0dHJfdmFsLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCX0KKysJCW9mZnNldCArPSBsZW47CisrCX0KKysJcmV0dXJuIG9mZnNldDsKKyt9CisrCisrc3RhdGljIGludAorK2Rpc3NlY3Rfb21sX2ZvbSh0dmJ1ZmZfdCAqdHZiLCBwYWNrZXRfaW5mbyAqcGluZm8sIHByb3RvX3RyZWUgKnRyZWUsCisrCQlpbnQgb2Zmc2V0LCBwcm90b19pdGVtICp0b3BfdGkpCisreworKwlndWludDggbXNnX3R5cGUsIG9ial9jbGFzcywgYnRzX25yLCB0cnhfbnIsIHRzX25yOworKwlwcm90b19pdGVtICp0aTsKKysJcHJvdG9fdHJlZSAqZm9tX3RyZWU7CisrCisrCW1zZ190eXBlID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpOworKwlvYmpfY2xhc3MgPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCsxKTsKKysJYnRzX25yID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQrMik7CisrCXRyeF9uciA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzMpOworKwl0c19uciA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzQpOworKwlwcm90b19pdGVtX2FwcGVuZF90ZXh0KHRvcF90aSwgIiwgJXMoJTAyeCwlMDJ4LCUwMngpICVzICIsCisrCQkJdmFsX3RvX3N0cihvYmpfY2xhc3MsIG9tbF9mb21fb2JqY2xhc3NfdmFscywgIiUwMngiKSwKKysJCQlidHNfbnIsIHRyeF9uciwgdHNfbnIsCisrCQkJdmFsX3RvX3N0cihtc2dfdHlwZSwgb21sX2ZvbV9tc2d0eXBlX3ZhbHMsCisrCQkJCSAgICJ1bmtub3duIDB4JXgiKSk7CisrCWNvbF9hcHBlbmRfZnN0cihwaW5mby0+Y2luZm8sIENPTF9JTkZPLCAiJXMoJTAyeCwlMDJ4LCUwMngpICVzICIsCisrCQkJdmFsX3RvX3N0cihvYmpfY2xhc3MsIG9tbF9mb21fb2JqY2xhc3NfdmFscywgIiUwMngiKSwKKysJCQlidHNfbnIsIHRyeF9uciwgdHNfbnIsCisrCQkJdmFsX3RvX3N0cihtc2dfdHlwZSwgb21sX2ZvbV9tc2d0eXBlX3ZhbHMsCisrCQkJCSAgICJ1bmtub3duIDB4JXgiKSk7CisrCXRpID0gcHJvdG9fdHJlZV9hZGRfaXRlbSh0cmVlLCBoZl9vbWxfZm9tX21zZ3R5cGUsIHR2Yiwgb2Zmc2V0KyssIDEsIEZBTFNFKTsKKysJZm9tX3RyZWUgPSBwcm90b19pdGVtX2FkZF9zdWJ0cmVlKHRpLCBldHRfb21sX2ZvbSk7CisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oZm9tX3RyZWUsIGhmX29tbF9mb21fb2JqY2xhc3MsIHR2Yiwgb2Zmc2V0KyssIDEsIEZBTFNFKTsKKysJcHJvdG9fdHJlZV9hZGRfaXRlbShmb21fdHJlZSwgaGZfb21sX2ZvbV9pbnN0X2J0cywgdHZiLCBvZmZzZXQrKywgMSwgRkFMU0UpOworKwlwcm90b190cmVlX2FkZF9pdGVtKGZvbV90cmVlLCBoZl9vbWxfZm9tX2luc3RfdHJ4LCB0dmIsIG9mZnNldCsrLCAxLCBGQUxTRSk7CisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oZm9tX3RyZWUsIGhmX29tbF9mb21faW5zdF90cywgdHZiLCBvZmZzZXQrKywgMSwgRkFMU0UpOworKworKworKwkvKiBkaXNzZWN0IHRoZSBUTFYgb2JqZWN0cyBpbiB0aGUgbWVzc2FnZSBib2R5ICovCisrCW9mZnNldCA9IGRpc3NlY3Rfb21sX2F0dHJzKHR2Yiwgb2Zmc2V0LCBwaW5mbywgZm9tX3RyZWUpOworKworKwlyZXR1cm4gb2Zmc2V0OworK30KKysKKytzdGF0aWMgY29uc3QgZ3VpbnQ4IGlwYWNjZXNzX21hZ2ljW10gPSAiY29tLmlwYWNjZXNzIjsKKysKKytzdGF0aWMgaW50CisrZGlzc2VjdF9vbWxfbWFudWYodHZidWZmX3QgKnR2YiwgcGFja2V0X2luZm8gKnBpbmZvLCBwcm90b190cmVlICp0cmVlLAorKwkJICBpbnQgb2Zmc2V0LCBwcm90b19pdGVtICp0b3BfdGkpCisreworKwlpZiAodHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpICE9IDB4MGQgfHwKKysJICAgIHR2Yl9tZW1lcWwodHZiLCBvZmZzZXQrMSwgaXBhY2Nlc3NfbWFnaWMsIHNpemVvZihpcGFjY2Vzc19tYWdpYykpKQorKwkJcmV0dXJuIG9mZnNldDsKKysKKysJb2Zmc2V0ICs9IHNpemVvZihpcGFjY2Vzc19tYWdpYykgKyAxOworKworKwlyZXR1cm4gZGlzc2VjdF9vbWxfZm9tKHR2YiwgcGluZm8sIHRyZWUsIG9mZnNldCwgdG9wX3RpKTsKKyt9CisrCisrc3RhdGljIHZvaWQKKytkaXNzZWN0X2FiaXNfb21sKHR2YnVmZl90ICp0dmIsIHBhY2tldF9pbmZvICpwaW5mbywgcHJvdG9fdHJlZSAqdHJlZSkKKyt7CisrCXByb3RvX2l0ZW0gKnRpOworKwlwcm90b190cmVlICpvbWxfdHJlZTsKKysKKysJaW50IG9mZnNldCA9IDA7CisrCisrCWNvbF9zZXRfc3RyKHBpbmZvLT5jaW5mbywgQ09MX1BST1RPQ09MLCAiT01MIik7CisrCisrCXRvcF90cmVlID0gdHJlZTsKKysJaWYgKHRyZWUpIHsKKysJCXVfaW50OF90IG1zZ19kaXNjID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpOworKworKwkJdGkgPSBwcm90b190cmVlX2FkZF9pdGVtKHRyZWUsIHByb3RvX2FiaXNfb21sLCB0dmIsIDAsIC0xLCBGQUxTRSk7CisrCQlvbWxfdHJlZSA9IHByb3RvX2l0ZW1fYWRkX3N1YnRyZWUodGksIGV0dF9vbWwpOworKworKwkJcHJvdG9fdHJlZV9hZGRfaXRlbShvbWxfdHJlZSwgaGZfb21sX21zZ19kaXNjLCB0dmIsIG9mZnNldCsrLAorKwkJCQkgICAgMSwgVFJVRSk7CisrCQlwcm90b190cmVlX2FkZF9pdGVtKG9tbF90cmVlLCBoZl9vbWxfcGxhY2VtZW50LCB0dmIsIG9mZnNldCsrLAorKwkJCQkgICAgMSwgVFJVRSk7CisrCQlwcm90b190cmVlX2FkZF9pdGVtKG9tbF90cmVlLCBoZl9vbWxfc2VxdWVuY2UsIHR2Yiwgb2Zmc2V0KyssCisrCQkJCSAgICAxLCBUUlVFKTsKKysJCXByb3RvX3RyZWVfYWRkX2l0ZW0ob21sX3RyZWUsIGhmX29tbF9sZW5ndGgsIHR2Yiwgb2Zmc2V0KyssCisrCQkJCSAgICAxLCBUUlVFKTsKKysKKysJCXN3aXRjaCAobXNnX2Rpc2MpIHsKKysJCWNhc2UgQUJJU19PTV9NRElTQ19GT006CisrCQkJb2Zmc2V0ID0gZGlzc2VjdF9vbWxfZm9tKHR2YiwgcGluZm8sIG9tbF90cmVlLAorKwkJCQkJCSBvZmZzZXQsIHRpKTsKKysJCQlicmVhazsKKysJCWNhc2UgQUJJU19PTV9NRElTQ19NQU5VRjoKKysJCQlvZmZzZXQgPSBkaXNzZWN0X29tbF9tYW51Zih0dmIsIHBpbmZvLCBvbWxfdHJlZSwJCQkJCQkJICAgICAgIG9mZnNldCwgdGkpOworKwkJCWJyZWFrOworKwkJY2FzZSBBQklTX09NX01ESVNDX01NSToKKysJCWNhc2UgQUJJU19PTV9NRElTQ19UUkFVOgorKwkJZGVmYXVsdDoKKysJCQlicmVhazsKKysJCX0KKysJfQorK30KKysKKyt2b2lkCisrcHJvdG9fcmVnX2hhbmRvZmZfYWJpc19vbWwodm9pZCk7CisrCisrdm9pZAorK3Byb3RvX3JlZ2lzdGVyX2FiaXNfb21sKHZvaWQpCisreworKwlzdGF0aWMgaGZfcmVnaXN0ZXJfaW5mbyBoZltdID0geworKwkJeyAmaGZfb21sX21zZ19kaXNjLAorKwkJCXsgIk1lc3NhZ2UgRGlzY3JpbWluYXRvciIsICJvbWwubXNnX2RzYyIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMob21sX21zZ19kaXNjX3ZhbHMpLCAwLAorKwkJCSAgIkdTTSAxMi4yMSBNZXNzYWdlIERpc2NyaW1pbmF0b3IiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfb21sX3BsYWNlbWVudCwKKysJCQl7ICJQbGFjZW1lbnQgSW5kaWNhdG9yIiwgIm9tbC5wbGFjZW1lbnQiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKG9tbF9wbGFjZW1lbnRfdmFscyksIDAsCisrCQkJICAiR1NNIDEyLjIxIFBsYWNlbWVudCBJbmRpY2F0b3IiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfb21sX3NlcXVlbmNlLAorKwkJCXsgIlNlcXVlbmNlIE51bWJlciIsICJvbWwuc2VxdWVuY2UiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBOVUxMLCAwLAorKwkJCSAgIlNlcXVlbmNlIE51bWJlciAoaWYgbXVsdGktcGFydCBtc2cpIiwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX29tbF9sZW5ndGgsCisrCQkJeyAiTGVuZ3RoIEluZGljYXRvciIsICJvbWwubGVuZ3RoIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgICJUb3RhbCBsZW5ndGggb2YgcGF5bG9hZCIsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9vbWxfZm9tX21zZ3R5cGUsCisrCQkJeyAiRk9NIE1lc3NhZ2UgVHlwZSIsICJvbWwuZm9tLm1zZ190eXBlIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfZm9tX21zZ3R5cGVfdmFscyksIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfb21sX2ZvbV9vYmpjbGFzcywKKysJCQl7ICJGT00gT2JqZWN0IENsYXNzIiwgIm9tbC5mb20ub2JqX2NsYXNzIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfZm9tX29iamNsYXNzX3ZhbHMpLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX29tbF9mb21faW5zdF9idHMsCisrCQkJeyAiRk9NIE9iamVjdCBJbnN0YW5jZSBCVFMiLCAib21sLmZvbS5vYmpfaW5zdC5idHMiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX29tbF9mb21faW5zdF90cngsCisrCQkJeyAiRk9NIE9iamVjdCBJbnN0YW5jZSBUUlgiLCAib21sLmZvbS5vYmpfaW5zdC50cngiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX29tbF9mb21faW5zdF90cywKKysJCQl7ICJGT00gT2JqZWN0IEluc3RhbmNlIFRTIiwgIm9tbC5mb20ub2JqX2luc3QudHMiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX29tbF9mb21fYXR0cl90YWcsCisrCQkJeyAiRk9NIEF0dHJpYnV0ZSBJRCIsICJvbWwuZm9tLmF0dHJfaWQiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKG9tbF9mb21fYXR0cl92YWxzKSwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9vbWxfZm9tX2F0dHJfbGVuLAorKwkJCXsgIkZPTSBBdHRyaWJ1dGUgTGVuZ3RoIiwgIm9tbC5mb20uYXR0cl9sZW4iLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9vbWxfZm9tX2F0dHJfdmFsLAorKwkJCXsgIkZPTSBBdHRyaWJ1dGUgVmFsdWUiLCAib21sLmZvbS5hdHRyX3ZhbCIsCisrCQkJICBGVF9CWVRFUywgQkFTRV9OT05FLCBOVUxMLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysKKysKKysKKysJCS8qIE9NTCBBdHRyaWJ1dGVzICovCisrCQl7ICZoZl9hdHRyX2FkbV9zdGF0ZSwKKysJCQl7ICJBZG1pbmlzdHJhdGl2ZSBTdGF0ZSIsICJvbWwuZm9tLmF0dHIuYWRtX3N0YXRlIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfYWRtX3N0YXRlX3ZhbHMpLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfYXJmY24sCisrCQkJeyAiQVJGQ04iLCAib21sLmZvbS5hdHRyLmFyZmNuIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX29wZXJfc3RhdGUsCisrCQkJeyAiT3BlcmF0aW9uYWwgU3RhdGUiLCAib21sLmZvbS5hdHRyLm9wZXJfc3RhdGUiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKG9tbF9vcGVyX3N0YXRlX3ZhbHMpLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfYXZhaWxfc3RhdGUsCisrCQkJeyAiQXZhaWxhYmlsaXR5IFN0YXR1cyIsICJvbWwuZm9tLmF0dHIuYXZhaWxfc3RhdGUiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKG9tbF9hdmFpbF9zdGF0ZV92YWxzKSwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2V2ZW50X3R5cGUsCisrCQkJeyAiRXZlbnQgVHlwZSIsICJvbWwuZm9tLmF0dHIuZXZlbnRfdHlwZSIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMob21sX2V2ZW50X3R5cGVfdmFscyksIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9zZXZlcml0eSwKKysJCQl7ICJTZXZlcml0eSIsICJvbWwuZm9tLmF0dHIuc2V2ZXJpdHkiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKG9tbF9zZXZlcml0eV92YWxzKSwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2JjY2hfYXJmY24sCisrCQkJeyAiQkNDSCBBUkZDTiIsICJvbWwuZm9tLmF0dHIuYmNjaF9hcmZjbiIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgIkFSRkNOIG9mIHRoZSBCQ0NIIiwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfYnNpYywKKysJCQl7ICJCU0lDIiwgIm9tbC5mb20uYXR0ci5ic2ljIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9IRVgsIE5VTEwsIDAsCisrCQkJICAiQmFzZSBTdGF0aW9uIElkZW50aXR5IENkb2UiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl90ZXN0X25vLAorKwkJCXsgIlRlc3QgTnVtYmVyIiwgIm9tbC5mb20uYXR0ci50ZXN0X25vIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfdGVzdF9ub192YWxzKSwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX3RzYywKKysJCQl7ICJUU0MiLCAib21sLmZvbS5hdHRyLnRzYyIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIE5VTEwsIDAsCisrCQkJICAiVHJhaW5pbmcgU2VxdWVuY2UgQ29kZSIsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX3RlaSwKKysJCQl7ICJURUkiLCAib21sLmZvbS5hdHRyLnRlaSIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9ERUMsIE5VTEwsIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9hY2hfYnRzcCwKKysJCQl7ICJCVFMgRTEgUG9ydCIsICJvbWwuZm9tLmF0dHIuYWJpc19jaC5idHNfcG9ydCIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9ERUMsIE5VTEwsIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9hY2hfdHNsb3QsCisrCQkJeyAiRTEgVGltZXNsb3QiLCAib21sLmZvbS5hdHRyLmFiaXNfY2gudGltZXNsb3QiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfYWNoX3NzbG90LAorKwkJCXsgIkUxIFN1YnNsb3QiLCAib21sLmZvbS5hdHRyLmFiaXNfY2guc3Vic2xvdCIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9ERUMsIE5VTEwsIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9nc21fdGltZSwKKysJCQl7ICJHU00gVGltZSIsICJvbWwuZm9tLmF0dHIuZ3NtX3RpbWUiLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgICJHU00gVGltZSIsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2NoYW5fY29tYiwKKysJCQl7ICJDaGFubmVsIENvbWJpbmF0aW9uIiwgIm9tbC5mb20uYXR0ci5jaGFuX2NvbWIiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKG9tbF9jaGFuX2NvbWJfdmFscyksIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJLyogSVAgQWNjZXNzICovCisrCQl7ICZoZl9vbWxfaXBhX3RyZXNfYXR0cl90YWcsCisrCQkJeyAiSVBBIFRlc3QgUmVzdWx0IEVtYmVkZGVkIElFIiwKKysJCQkJCQkib21sLmZvbS50ZXN0cmVwLmlwYV90YWciLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKGlwYWNjX3Rlc3RyZXNfaWVfdmFscyksIDAsCisrCQkJICAiSW5mb3JtYXRpb24gRWxlbWVudCBlbWJlZGRlZCBpbnRvIHRoZSBUZXN0IFJlc3VsdCAiCisrCQkJICAib2YgaXAuYWNjZXNzIEJUUyIsIEhGSUxMIH0sCisrCQl9LAorKwkJeyAmaGZfb21sX2lwYV90cmVzX2F0dHJfbGVuLAorKwkJCXsgIklQQSBUZXN0IFJlc3VsdCBFbWJlZGRlZCBJRSBMZW5ndGgiLAorKwkJCQkJCSJvbWwuZm9tLnRlc3RyZXAuaXBhX2xlbiIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgIkxlbmd0aCBvZiBpcC5hY2Nlc3MgVGVzdCBSZXN1bHQgRW1iZWRkZWQgSUUiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdGVzdF9yZXMsCisrCQkJeyAiSVBBIFRlc3QgUmVzdWx0IiwgIm9tbC5mb20udGVzdHJlcC5yZXN1bHQiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBWQUxTKGlwYWNjX3Rlc3RfcmVzX3ZhbHMpLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX3J4bGV2LAorKwkJCXsgIlJ4IExldmVsIiwgIm9tbC5mb20udGVzdHJlcC5pcGFfcnhsZXYiLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMHhmYzAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfYl9yeGxldiwKKysJCQl7ICJSeCBMZXZlbCIsICJvbWwuZm9tLnRlc3RyZXAuaXBhX3J4bGV2X2IiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfYXJmY24sCisrCQkJeyAiQVJGQ04iLCAib21sLmZvbS50ZXN0cmVwLmlwYV9hcmZjbiIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAweDAzZmYsICJBUkZDTiIsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV90cl9mX3F1YWwsCisrCQkJeyAiRnJlcXVlbmN5IFF1YWxpdHkiLCAib21sLmZvbS50ZXN0cmVwLmlwYS5mcmVxX3F1YWwiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAweGZjLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfZl9lcnIsCisrCQkJeyAiRnJlcXVlbmN5IEVycm9yIiwgIm9tbC5mb20udGVzdHJlcC5pcGEuZnJlcV9lcnIiLAorKwkJCSAgRlRfSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfcnhxdWFsLAorKwkJCXsgIlJ4IFF1YWxpdHkiLCAib21sLmZvbS50ZXN0cmVwLmlwYS5yeF9xdWFsIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMHg3LCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfZnJhbWVfb2ZmcywKKysJCQl7ICJGcmFtZSBPZmZzZXQiLCAib21sLmZvbS50ZXN0cmVwLmlwYS5mcmFtZV9vZmZzZXQiLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX2ZyYW1lbnJfb2ZmcywKKysJCQl7ICJGcmFtZSBOdW1iZXIgT2Zmc2V0IiwKKysJCQkJCSJvbWwuZm9tLnRlc3RyZXAuaXBhLmZyYW1lbnJfb2Zmc2V0IiwKKysJCQkgIEZUX1VJTlQzMiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV90cl9ic2ljLAorKwkJCXsgIkJTSUMiLCAib21sLmZvbS50ZXN0cmVwLmlwYS5ic2ljIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMHgzZiwKKysJCQkgICJCYXNlIFN0YXRpb24gSWRlbnRpdHkgQ29kZSIsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV90cl9jZWxsX2lkLAorKwkJCXsgIkNlbGwgSUQiLCAib21sLmZvbS50ZXN0cmVwLmlwYS5jZWxsX2lkIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9IRVgsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV9yc2xfaXAsCisrCQkJeyAiQlNDIFJTTCBJUCBBZGRyZXNzIiwgIm9tbC5mb20uYXR0ci5pcGEucnNsX2lwIiwKKysJCQkgIEZUX0lQdjQsIEJBU0VfTk9ORSwgTlVMTCwgMCwKKysJCQkgICJJUCBBZGRyZXNzIHRvIHdoaWNoIHRoZSBCVFMgZXN0YWJsaXNoZXMgIgorKwkJCSAgInRoZSBSU0wgbGluayIsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV9yc2xfcG9ydCwKKysJCQl7ICJCU0MgUlNMIFRDUCBQb3J0IiwgIm9tbC5mb20uYXR0ci5pcGEucnNsX3BvcnQiLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgICJQb3J0IG51bWJlciB0byB3aGljaCB0aGUgQlNUIGVzdGFibGlzaGVzICIKKysJCQkgICJ0aGUgUlNMIGxpbmsiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfcHJpbV9vbWxfaXAsCisrCQkJeyAiUHJpbWFyeSBPTUwgSVAgQWRkcmVzcyIsCisrCQkJCQkib21sLmZvbS5hdHRyLmlwYS5wcmltX29tbF9pcCIsCisrCQkJICBGVF9JUHY0LCBCQVNFX05PTkUsIE5VTEwsIDAsCisrCQkJICAiSVAgQWRkcmVzcyBvZiB0aGUgQlNDIGZvciB0aGUgcHJpbWFyeSBPTUwgbGluayIsCisrCQkJICBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfcHJpbV9vbWxfcG9ydCwKKysJCQl7ICJQcmltYXJ5IE9NTCBUQ1AgUG9ydCIsCisrCQkJCQkib21sLmZvbS5hdHRyLmlwYS5wcmltX29tbF9wb3J0IiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsCisrCQkJICAiVENQIFBvcnQgb2YgdGhlIEJTQyBmb3IgdGhlIHByaW1hcmx5IE9NTCBsaW5rIiwKKysJCQkgIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV9sb2NhdGlvbl9uYW1lLAorKwkJCXsgIkxvY2F0aW9uIE5hbWUiLCAib21sLmZvbS5hdHRyLmlwYS5sb2NfbmFtZSIsCisrCQkJICBGVF9TVFJJTkcsIEJBU0VfTk9ORSwgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3VuaXRfbmFtZSwKKysJCQl7ICJVbml0IE5hbWUiLCAib21sLmZvbS5hdHRyLmlwYS51bml0X25hbWUiLAorKwkJCSAgRlRfU1RSSU5HLCBCQVNFX05PTkUsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV91bml0X2lkLAorKwkJCXsgIlVuaXQgSUQiLCAib21sLmZvbS5hdHRyLmlwYS51bml0X2lkIiwKKysJCQkgIEZUX1NUUklORywgQkFTRV9OT05FLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfbnZfZmxhZ3MsCisrCQkJeyAiTlZSQU0gQ29uZmlnIEZsYWdzIiwgIm9tbC5mb20uYXR0ci5pcGEubnZfZmxhZ3MiLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0hFWCwgTlVMTCwgMHhmZmZmLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfbnZfbWFzaywKKysJCQl7ICJOVlJBTSBDb25maWcgTWFzayIsICJvbWwuZm9tLmF0dHIuaXBhLm52X21hc2siLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0hFWCwgTlVMTCwgMHhmZmZmLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfc2kyLAorKwkJCXsgIlN5c3RlbSBJbmZvcm1hdGlvbiAyIiwgIm9tbC5mb20uYXR0ci5pcGEuc2kyIiwKKysJCQkgIEZUX0JZVEVTLCBCQVNFX05PTkUsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV90cl9zaTJiaXMsCisrCQkJeyAiU3lzdGVtIEluZm9ybWF0aW9uIDJiaXMiLCAib21sLmZvbS5hdHRyLmlwYS5zaTJiaXMiLAorKwkJCSAgRlRfQllURVMsIEJBU0VfTk9ORSwgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX3NpMnRlciwKKysJCQl7ICJTeXN0ZW0gSW5mb3JtYXRpb24gMnRlciIsICJvbWwuZm9tLmF0dHIuaXBhLnNpMnRlciIsCisrCQkJICBGVF9CWVRFUywgQkFTRV9OT05FLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfY2hhbl9kZXNjLAorKwkJCXsgIkNlbGwgQ2hhbm5lbCBEZXNjcmlwdGlvbiIsCisrCQkJCQkJIm9tbC5mb20uYXR0ci5pcGEuY2hhbl9kZXNjIiwKKysJCQkgIEZUX0JZVEVTLCBCQVNFX05PTkUsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV9uc2xfc3BvcnQsCisrCQkJeyAiTlMgTGluayBJUCBTb3VyY2UgUG9ydCIsCisrCQkJCQkJIm9tbC5mb20uYXR0ci5pcGEubnNsX3Nwb3J0IiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV9uc2xfZGFkZHIsCisrCQkJeyAiTlMgTGluayBJUCBEZXN0aW5hdGlvbiBBZGRyIiwKKysJCQkJCQkib21sLmZvbS5hdHRyLmlwYS5uc2xfZGFkZHIiLAorKwkJCSAgRlRfSVB2NCwgQkFTRV9OT05FLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfbnNsX2Rwb3J0LAorKwkJCXsgIk5TIExpbmsgSVAgRGVzdGluYXRpb24gUG9ydCIsCisrCQkJCQkJIm9tbC5mb20uYXR0ci5pcGEubnNsX2Rwb3J0IiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV9uc2VpLAorKwkJCXsgIk5TRUkiLCAib21sLmZvbS5hdHRyLmlwYS5uc2VpIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV9uc3ZjaSwKKysJCQl7ICJOU1ZDSSIsICJvbWwuZm9tLmF0dHIuaXBhLm5zdmNpIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV9idmNpLAorKwkJCXsgIkJWQ0kiLCAib21sLmZvbS5hdHRyLmlwYS5idmNpIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV9yYWMsCisrCQkJeyAiUkFDIiwgIm9tbC5mb20uYXR0ci5pcGEucmFjIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgTlVMTCwgMCwKKysJCQkgICJSb3V0aW5nIEFyZWEgQ29kZSIsIEhGSUxMIH0KKysJCX0sCisrCX07CisrCXN0YXRpYyBnaW50ICpldHRbXSA9IHsKKysJCSZldHRfb21sLAorKwkJJmV0dF9vbWxfZm9tLAorKwkJJmV0dF9vbWxfZm9tX2F0dCwKKysJfTsKKysKKysJbW9kdWxlX3QgKm9tbF9tb2R1bGU7CisrCisrCXByb3RvX2FiaXNfb21sID0gcHJvdG9fcmVnaXN0ZXJfcHJvdG9jb2woIkdTTSBBLWJpcyBPTUwiLCAiT01MIiwKKysJCQkJCQkgImdzbV9hYmlzX29tbCIpOworKworKwlwcm90b19yZWdpc3Rlcl9maWVsZF9hcnJheShwcm90b19hYmlzX29tbCwgaGYsIGFycmF5X2xlbmd0aChoZikpOworKworKwlwcm90b19yZWdpc3Rlcl9zdWJ0cmVlX2FycmF5KGV0dCwgYXJyYXlfbGVuZ3RoKGV0dCkpOworKworKwlyZWdpc3Rlcl9kaXNzZWN0b3IoImdzbV9hYmlzX29tbCIsIGRpc3NlY3RfYWJpc19vbWwsIHByb3RvX2FiaXNfb21sKTsKKysKKysKKysJb21sX21vZHVsZSA9IHByZWZzX3JlZ2lzdGVyX3Byb3RvY29sKHByb3RvX2FiaXNfb21sLCBwcm90b19yZWdfaGFuZG9mZl9hYmlzX29tbCk7CisrCXByZWZzX3JlZ2lzdGVyX2Jvb2xfcHJlZmVyZW5jZShvbWxfbW9kdWxlLCAidXNlX2lwYWNjZXNzX29tbCIsCisrCQkgICAgIlVzZSBuYW5vQlRTIGRlZmluaXRpb25zIiwKKysJCSAgICAiVXNlIGlwYWNjZXNzIG5hbm9CVFMgc3BlY2lmaWMgZGVmaW5pdGlvbnMgZm9yIE9NTCIsCisrCQkgICAgJmdsb2JhbF9vbWxfdXNlX25hbm9fYnRzKTsKKyt9CisrCisrdm9pZAorK3Byb3RvX3JlZ19oYW5kb2ZmX2FiaXNfb21sKHZvaWQpCisreworKwlkaXNzZWN0b3JfaGFuZGxlX3QgYWJpc19vbWxfaGFuZGxlOworKworKwlhYmlzX29tbF9oYW5kbGUgPSBjcmVhdGVfZGlzc2VjdG9yX2hhbmRsZShkaXNzZWN0X2FiaXNfb21sLCBwcm90b19hYmlzX29tbCk7CisrCWRpc3NlY3Rvcl9hZGQoImxhcGQuZ3NtLnNhcGkiLCBMQVBEX0dTTV9TQVBJX09NX1BST0MsIGFiaXNfb21sX2hhbmRsZSk7CisrfQorZGlmZiAtLWdpdCBhL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtZ3NtX2FiaXNfb21sLmggYi9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LWdzbV9hYmlzX29tbC5oCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uZDUyM2U5NgorLS0tIC9kZXYvbnVsbAorKysrIGIvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1nc21fYWJpc19vbWwuaAorQEAgLTAsMCArMSw3ODcgQEAKKysvKiBHU00gTmV0d29yayBNYW5hZ2VtZW50IG1lc3NhZ2VzIG9uIHRoZSBBLWJpcyBpbnRlcmZhY2UKKysgKiAzR1BQIFRTIDEyLjIxIHZlcnNpb24gOC4wLjAgUmVsZWFzZSAxOTk5IC8gRVRTSSBUUyAxMDAgNjIzIFY4LjAuMCAqLworKworKy8qIChDKSAyMDA4LTIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKysgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisrICoKKysgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisrICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKysgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKyAqCisrICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisrICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKysgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisrICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKysgKgorKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisrICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKysgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorKyAqCisrICovCisrCisrI2lmbmRlZiBfX1BBQ0tFVF9BQklTX09NTF9IX18KKysjZGVmaW5lIF9fUEFDS0VUX0FCSVNfT01MX0hfXworKworKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKysKKysvKiBGcm9tIG9wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2FiaXNfbm0uaCAqLworKworKy8qIGdlbmVyaWMgaGVhZGVyIGluIGZyb250IG9mIGV2ZXJ5IE9NTCBtZXNzYWdlIGFjY29yZGluZyB0byBUUyAwOC41OSAqLworK3N0cnVjdCBhYmlzX29tX2hkciB7CisrCWd1aW50OAltZGlzYzsKKysJZ3VpbnQ4CXBsYWNlbWVudDsKKysJZ3VpbnQ4CXNlcXVlbmNlOworKwlndWludDgJbGVuZ3RoOworKwlndWludDgJZGF0YVswXTsKKyt9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKysKKysjZGVmaW5lIEFCSVNfT01fTURJU0NfRk9NCQkweDgwCisrI2RlZmluZSBBQklTX09NX01ESVNDX01NSQkJMHg0MAorKyNkZWZpbmUgQUJJU19PTV9NRElTQ19UUkFVCQkweDIwCisrI2RlZmluZSBBQklTX09NX01ESVNDX01BTlVGCQkweDEwCisrI2RlZmluZSBBQklTX09NX1BMQUNFTUVOVF9PTkxZCQkweDgwCisrI2RlZmluZSBBQklTX09NX1BMQUNFTUVOVF9GSVJTVCAJMHg0MAorKyNkZWZpbmUgQUJJU19PTV9QTEFDRU1FTlRfTUlERExFCTB4MjAKKysjZGVmaW5lIEFCSVNfT01fUExBQ0VNRU5UX0xBU1QJCTB4MTAKKysKKytzdHJ1Y3QgYWJpc19vbV9vYmpfaW5zdCB7CisrCWd1aW50OAlidHNfbnI7CisrCWd1aW50OAl0cnhfbnI7CisrCWd1aW50OAl0c19ucjsKKyt9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKysKKytzdHJ1Y3QgYWJpc19vbV9mb21faGRyIHsKKysJZ3VpbnQ4CW1zZ190eXBlOworKwlndWludDgJb2JqX2NsYXNzOworKwlzdHJ1Y3QgYWJpc19vbV9vYmpfaW5zdAlvYmpfaW5zdDsKKysJZ3VpbnQ4CWRhdGFbMF07CisrfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisrCisrI2RlZmluZSBBQklTX09NX0ZPTV9IRFJfU0laRQkoc2l6ZW9mKHN0cnVjdCBhYmlzX29tX2hkcikgKyBzaXplb2Yoc3RydWN0IGFiaXNfb21fZm9tX2hkcikpCisrCisrLyogU2VjdGlvbiA5LjE6IE1lc3NhZ2UgVHlwZXMgKi8KKytlbnVtIGFiaXNfbm1fbXNndHlwZSB7CisrCS8qIFNXIERvd25sb2FkIE1hbmFnZW1lbnQgTWVzc2FnZXMgKi8KKysJTk1fTVRfTE9BRF9JTklUCQkJPSAweDAxLAorKwlOTV9NVF9MT0FEX0lOSVRfQUNLLAorKwlOTV9NVF9MT0FEX0lOSVRfTkFDSywKKysJTk1fTVRfTE9BRF9TRUcsCisrCU5NX01UX0xPQURfU0VHX0FDSywKKysJTk1fTVRfTE9BRF9BQk9SVCwKKysJTk1fTVRfTE9BRF9FTkQsCisrCU5NX01UX0xPQURfRU5EX0FDSywKKysJTk1fTVRfTE9BRF9FTkRfTkFDSywKKysJTk1fTVRfU1dfQUNUX1JFUSwJCS8qIEJUUy0+QlNDICovCisrCU5NX01UX1NXX0FDVF9SRVFfQUNLLAorKwlOTV9NVF9TV19BQ1RfUkVRX05BQ0ssCisrCU5NX01UX0FDVElWQVRFX1NXLAkJLyogQlNDLT5CVFMgKi8KKysJTk1fTVRfQUNUSVZBVEVfU1dfQUNLLAorKwlOTV9NVF9BQ1RJVkFURV9TV19OQUNLLAorKwlOTV9NVF9TV19BQ1RJVkFURURfUkVQLAkJLyogMHgxMCAqLworKwkvKiBBLWJpcyBJbnRlcmZhY2UgTWFuYWdlbWVudCBNZXNzYWdlcyAqLworKwlOTV9NVF9FU1RBQkxJU0hfVEVJCQk9IDB4MjEsCisrCU5NX01UX0VTVEFCTElTSF9URUlfQUNLLAorKwlOTV9NVF9FU1RBQkxJU0hfVEVJX05BQ0ssCisrCU5NX01UX0NPTk5fVEVSUl9TSUdOLAorKwlOTV9NVF9DT05OX1RFUlJfU0lHTl9BQ0ssCisrCU5NX01UX0NPTk5fVEVSUl9TSUdOX05BQ0ssCisrCU5NX01UX0RJU0NfVEVSUl9TSUdOLAorKwlOTV9NVF9ESVNDX1RFUlJfU0lHTl9BQ0ssCisrCU5NX01UX0RJU0NfVEVSUl9TSUdOX05BQ0ssCisrCU5NX01UX0NPTk5fVEVSUl9UUkFGLAorKwlOTV9NVF9DT05OX1RFUlJfVFJBRl9BQ0ssCisrCU5NX01UX0NPTk5fVEVSUl9UUkFGX05BQ0ssCisrCU5NX01UX0RJU0NfVEVSUl9UUkFGLAorKwlOTV9NVF9ESVNDX1RFUlJfVFJBRl9BQ0ssCisrCU5NX01UX0RJU0NfVEVSUl9UUkFGX05BQ0ssCisrCS8qIFRyYW5zbWlzc2lvbiBNYW5hZ2VtZW50IE1lc3NhZ2VzICovCisrCU5NX01UX0NPTk5fTURST1BfTElOSwkJPSAweDMxLAorKwlOTV9NVF9DT05OX01EUk9QX0xJTktfQUNLLAorKwlOTV9NVF9DT05OX01EUk9QX0xJTktfTkFDSywKKysJTk1fTVRfRElTQ19NRFJPUF9MSU5LLAorKwlOTV9NVF9ESVNDX01EUk9QX0xJTktfQUNLLAorKwlOTV9NVF9ESVNDX01EUk9QX0xJTktfTkFDSywKKysJLyogQWlyIEludGVyZmFjZSBNYW5hZ2VtZW50IE1lc3NhZ2VzICovCisrCU5NX01UX1NFVF9CVFNfQVRUUgkJPSAweDQxLAorKwlOTV9NVF9TRVRfQlRTX0FUVFJfQUNLLAorKwlOTV9NVF9TRVRfQlRTX0FUVFJfTkFDSywKKysJTk1fTVRfU0VUX1JBRElPX0FUVFIsCisrCU5NX01UX1NFVF9SQURJT19BVFRSX0FDSywKKysJTk1fTVRfU0VUX1JBRElPX0FUVFJfTkFDSywKKysJTk1fTVRfU0VUX0NIQU5fQVRUUiwKKysJTk1fTVRfU0VUX0NIQU5fQVRUUl9BQ0ssCisrCU5NX01UX1NFVF9DSEFOX0FUVFJfTkFDSywKKysJLyogVGVzdCBNYW5hZ2VtZW50IE1lc3NhZ2VzICovCisrCU5NX01UX1BFUkZfVEVTVAkJCT0gMHg1MSwKKysJTk1fTVRfUEVSRl9URVNUX0FDSywKKysJTk1fTVRfUEVSRl9URVNUX05BQ0ssCisrCU5NX01UX1RFU1RfUkVQLAorKwlOTV9NVF9TRU5EX1RFU1RfUkVQLAorKwlOTV9NVF9TRU5EX1RFU1RfUkVQX0FDSywKKysJTk1fTVRfU0VORF9URVNUX1JFUF9OQUNLLAorKwlOTV9NVF9TVE9QX1RFU1QsCisrCU5NX01UX1NUT1BfVEVTVF9BQ0ssCisrCU5NX01UX1NUT1BfVEVTVF9OQUNLLAorKwkvKiBTdGF0ZSBNYW5hZ2VtZW50IGFuZCBFdmVudCBSZXBvcnQgTWVzc2FnZXMgKi8KKysJTk1fTVRfU1RBVEVDSEdfRVZFTlRfUkVQCT0gMHg2MSwKKysJTk1fTVRfRkFJTFVSRV9FVkVOVF9SRVAsCisrCU5NX01UX1NUT1BfRVZFTlRfUkVQLAorKwlOTV9NVF9TVE9QX0VWRU5UX1JFUF9BQ0ssCisrCU5NX01UX1NUT1BfRVZFTlRfUkVQX05BQ0ssCisrCU5NX01UX1JFU1RfRVZFTlRfUkVQLAorKwlOTV9NVF9SRVNUX0VWRU5UX1JFUF9BQ0ssCisrCU5NX01UX1JFU1RfRVZFTlRfUkVQX05BQ0ssCisrCU5NX01UX0NIR19BRE1fU1RBVEUsCisrCU5NX01UX0NIR19BRE1fU1RBVEVfQUNLLAorKwlOTV9NVF9DSEdfQURNX1NUQVRFX05BQ0ssCisrCU5NX01UX0NIR19BRE1fU1RBVEVfUkVRLAorKwlOTV9NVF9DSEdfQURNX1NUQVRFX1JFUV9BQ0ssCisrCU5NX01UX0NIR19BRE1fU1RBVEVfUkVRX05BQ0ssCisrCU5NX01UX1JFUF9PVVRTVF9BTEFSTVMJCT0gMHg5MywKKysJTk1fTVRfUkVQX09VVFNUX0FMQVJNU19BQ0ssCisrCU5NX01UX1JFUF9PVVRTVF9BTEFSTVNfTkFDSywKKysJLyogRXF1aXBtZW50IE1hbmFnZW1lbnQgTWVzc2FnZXMgKi8KKysJTk1fTVRfQ0hBTkdFT1ZFUgkJPSAweDcxLAorKwlOTV9NVF9DSEFOR0VPVkVSX0FDSywKKysJTk1fTVRfQ0hBTkdFT1ZFUl9OQUNLLAorKwlOTV9NVF9PUFNUQVJULAorKwlOTV9NVF9PUFNUQVJUX0FDSywKKysJTk1fTVRfT1BTVEFSVF9OQUNLLAorKwlOTV9NVF9SRUlOSVQsCisrCU5NX01UX1JFSU5JVF9BQ0ssCisrCU5NX01UX1JFSU5JVF9OQUNLLAorKwlOTV9NVF9TRVRfU0lURV9PVVQsCQkvKiBCUzExOiBnZXQgYWxhcm0gPyE/ICovCisrCU5NX01UX1NFVF9TSVRFX09VVF9BQ0ssCisrCU5NX01UX1NFVF9TSVRFX09VVF9OQUNLLAorKwlOTV9NVF9DSEdfSFdfQ09ORgkJPSAweDkwLAorKwlOTV9NVF9DSEdfSFdfQ09ORl9BQ0ssCisrCU5NX01UX0NIR19IV19DT05GX05BQ0ssCisrCS8qIE1lYXN1cmVtZW50IE1hbmFnZW1lbnQgTWVzc2FnZXMgKi8KKysJTk1fTVRfTUVBU19SRVNfUkVRCQk9IDB4OGEsCisrCU5NX01UX01FQVNfUkVTX1JFU1AsCisrCU5NX01UX1NUT1BfTUVBUywKKysJTk1fTVRfU1RBUlRfTUVBUywKKysJLyogT3RoZXIgTWVzc2FnZXMgKi8KKysJTk1fTVRfR0VUX0FUVFIJCQk9IDB4ODEsCisrCU5NX01UX0dFVF9BVFRSX1JFU1AsCisrCU5NX01UX0dFVF9BVFRSX05BQ0ssCisrCU5NX01UX1NFVF9BTEFSTV9USFJFUywKKysJTk1fTVRfU0VUX0FMQVJNX1RIUkVTX0FDSywKKysJTk1fTVRfU0VUX0FMQVJNX1RIUkVTX05BQ0ssCisrCisrCU5NX01UX0lQQUNDX1JFU1RBUlQJCT0gMHg4NywKKysJTk1fTVRfSVBBQ0NfUkVTVEFSVF9BQ0ssCisrfTsKKysKKytlbnVtIGFiaXNfbm1fbXNndHlwZV9iczExIHsKKysJTk1fTVRfQlMxMV9SRVNFVF9SRVNPVVJDRQk9IDB4NzQsCisrCisrCU5NX01UX0JTMTFfQkVHSU5fREJfVFgJCT0gMHhhMywKKysJTk1fTVRfQlMxMV9CRUdJTl9EQl9UWF9BQ0ssCisrCU5NX01UX0JTMTFfQkVHSU5fREJfVFhfTkFDSywKKysJTk1fTVRfQlMxMV9FTkRfREJfVFgJCT0gMHhhNiwKKysJTk1fTVRfQlMxMV9FTkRfREJfVFhfQUNLLAorKwlOTV9NVF9CUzExX0VORF9EQl9UWF9OQUNLLAorKwlOTV9NVF9CUzExX0NSRUFURV9PQkoJCT0gMHhhOSwKKysJTk1fTVRfQlMxMV9DUkVBVEVfT0JKX0FDSywKKysJTk1fTVRfQlMxMV9DUkVBVEVfT0JKX05BQ0ssCisrCU5NX01UX0JTMTFfREVMRVRFX09CSgkJPSAweGFjLAorKwlOTV9NVF9CUzExX0RFTEVURV9PQkpfQUNLLAorKwlOTV9NVF9CUzExX0RFTEVURV9PQkpfTkFDSywKKysKKysJTk1fTVRfQlMxMV9TRVRfQVRUUgkJPSAweGQwLAorKwlOTV9NVF9CUzExX1NFVF9BVFRSX0FDSywKKysJTk1fTVRfQlMxMV9TRVRfQVRUUl9OQUNLLAorKwlOTV9NVF9CUzExX0xNVF9TRVNTSU9OCQk9IDB4ZGMsCisrCisrCU5NX01UX0JTMTFfR0VUX1NUQVRFCQk9IDB4ZTMsCisrCU5NX01UX0JTMTFfR0VUX1NUQVRFX0FDSywKKysJTk1fTVRfQlMxMV9MTVRfTE9HT04JCT0gMHhlNSwKKysJTk1fTVRfQlMxMV9MTVRfTE9HT05fQUNLLAorKwlOTV9NVF9CUzExX1JFU1RBUlQJCT0gMHhlNywKKysJTk1fTVRfQlMxMV9SRVNUQVJUX0FDSywKKysJTk1fTVRfQlMxMV9ESVNDT05ORUNUCQk9IDB4ZTksCisrCU5NX01UX0JTMTFfRElTQ09OTkVDVF9BQ0ssCisrCU5NX01UX0JTMTFfTE1UX0xPR09GRgkJPSAweGVjLAorKwlOTV9NVF9CUzExX0xNVF9MT0dPRkZfQUNLLAorKwlOTV9NVF9CUzExX1JFQ09OTkVDVAkJPSAweGYxLAorKwlOTV9NVF9CUzExX1JFQ09OTkVDVF9BQ0ssCisrfTsKKysKKytlbnVtIGFiaXNfbm1fbXNndHlwZV9pcGFjYyB7CisrCU5NX01UX0lQQUNDX1JTTF9DT05ORUNUCQk9IDB4ZTAsCisrCU5NX01UX0lQQUNDX1JTTF9DT05ORUNUX0FDSywKKysJTk1fTVRfSVBBQ0NfUlNMX0NPTk5FQ1RfTkFDSywKKysJTk1fTVRfSVBBQ0NfUlNMX0RJU0NPTk5FQ1QJPSAweGUzLAorKwlOTV9NVF9JUEFDQ19SU0xfRElTQ09OTkVDVF9BQ0ssCisrCU5NX01UX0lQQUNDX1JTTF9ESVNDT05ORUNUX05BQ0ssCisrCU5NX01UX0lQQUNDX0NPTk5fVFJBRgkJPSAweGU2LAorKwlOTV9NVF9JUEFDQ19DT05OX1RSQUZfQUNLLAorKwlOTV9NVF9JUEFDQ19DT05OX1RSQUZfTkFDSywKKysJTk1fTVRfSVBBQ0NfRElTQ19UUkFGCQk9IDB4ZTksCisrCU5NX01UX0lQQUNDX0RJU0NfVFJBRl9BQ0ssCisrCU5NX01UX0lQQUNDX0RJU0NfVFJBRl9OQUNLLAorKwlOTV9NVF9JUEFDQ19ERUZfQk9PVF9TVwkJPSAweGVjLAorKwlOTV9NVF9JUEFDQ19ERUZfQk9PVF9TV19BQ0ssCisrCU5NX01UX0lQQUNDX0RFRl9CT09UX1NXX05BQ0ssCisrCU5NX01UX0lQQUNDX1NFVF9OVkFUVFIJCT0gMHhlZiwKKysJTk1fTVRfSVBBQ0NfU0VUX05WQVRUUl9BQ0ssCisrCU5NX01UX0lQQUNDX1NFVF9OVkFUVFJfTkFDSywKKysJTk1fTVRfSVBBQ0NfR0VUX05WQVRUUgkJPSAweGYyLAorKwlOTV9NVF9JUEFDQ19HRVRfTlZBVFRSX0FDSywKKysJTk1fTVRfSVBBQ0NfR0VUX05WQVRUUl9OQUNLLAorKwlOTV9NVF9JUEFDQ19TRVRfQVRUUgkJPSAweGY1LAorKwlOTV9NVF9JUEFDQ19TRVRfQVRUUl9BQ0ssCisrCU5NX01UX0lQQUNDX1NFVF9BVFRSX05BQ0ssCisrCU5NX01UX0lQQUNDX0FUVFJfQ0hHX0VWVAk9IDB4ZjgsCisrCU5NX01UX0lQQUNDX1NXX0RFQUNUCQk9IDB4ZjksCisrCU5NX01UX0lQQUNDX1NXX0RFQUNUX0FDSywKKysJTk1fTVRfSVBBQ0NfU1dfREVBQ1RfTkFDSywKKysJTk1fTVRfSVBBQ0NfTUVBU19SRVNfUkVRX05BQ0sJPSAweGZjLAorKwlOTV9NVF9JUEFDQ19TVEFSVF9NRUFTX05BQ0ssCisrCU5NX01UX0lQQUNDX1NUT1BfTUVBU19OQUNLLAorK307CisrCisrZW51bSBhYmlzX25tX2JzMTFfY2VsbF9hbGxvYyB7CisrCU5NX0JTMTFfQ0FOUl9HU00JPSAweDAwLAorKwlOTV9CUzExX0NBTlJfRENTMTgwMAk9IDB4MDEsCisrfTsKKysKKysvKiBTZWN0aW9uIDkuMjogT2JqZWN0IENsYXNzICovCisrZW51bSBhYmlzX25tX29ial9jbGFzcyB7CisrCU5NX09DX1NJVEVfTUFOQUdFUgkJPSAweDAwLAorKwlOTV9PQ19CVFMsCisrCU5NX09DX1JBRElPX0NBUlJJRVIsCisrCU5NX09DX0NIQU5ORUwsCisrCU5NX09DX0JBU0VCX1RSQU5TQywKKysJLyogUkZVOiAwNS1GRSAqLworKwlOTV9PQ19CUzExX0FESkMJCQk9IDB4YTAsCisrCU5NX09DX0JTMTFfSEFORE9WRVIJCT0gMHhhMSwKKysJTk1fT0NfQlMxMV9QV1JfQ1RSTAkJPSAweGEyLAorKwlOTV9PQ19CUzExX0JUU0UJCQk9IDB4YTMsCQkvKiBMTVQ/ICovCisrCU5NX09DX0JTMTFfUkFDSwkJCT0gMHhhNCwKKysJTk1fT0NfQlMxMQkJCT0gMHhhNSwJCS8qIDAxOiBBTENPICovCisrCU5NX09DX0JTMTFfVEVTVAkJCT0gMHhhNiwKKysJTk1fT0NfQlMxMV9FTlZBQlRTRQkJPSAweGE4LAorKwlOTV9PQ19CUzExX0JQT1JUCQk9IDB4YTksCisrCisrCU5NX09DX0dQUlNfTlNFCQkJPSAweGYwLAorKwlOTV9PQ19HUFJTX0NFTEwJCQk9IDB4ZjEsCisrCU5NX09DX0dQUlNfTlNWQzAJCT0gMHhmMiwKKysJTk1fT0NfR1BSU19OU1ZDMQkJPSAweGYzLAorKworKwlOTV9PQ19OVUxMCQkJPSAweGZmLAorK307CisrCisrLyogU2VjdGlvbiA5LjQ6IEF0dHJpYnV0ZXMgKi8KKytlbnVtIGFiaXNfbm1fYXR0ciB7CisrCU5NX0FUVF9BQklTX0NIQU5ORUwJPSAweDAxLAorKwlOTV9BVFRfQUREX0lORk8sCisrCU5NX0FUVF9BRERfVEVYVCwKKysJTk1fQVRUX0FETV9TVEFURSwKKysJTk1fQVRUX0FSRkNOX0xJU1QsCisrCU5NX0FUVF9BVVRPTl9SRVBPUlQsCisrCU5NX0FUVF9BVkFJTF9TVEFUVVMsCisrCU5NX0FUVF9CQ0NIX0FSRkNOLAorKwlOTV9BVFRfQlNJQywKKysJTk1fQVRUX0JUU19BSVJfVElNRVIsCisrCU5NX0FUVF9DQ0NIX0xfSV9QLAorKwlOTV9BVFRfQ0NDSF9MX1QsCisrCU5NX0FUVF9DSEFOX0NPTUIsCisrCU5NX0FUVF9DT05OX0ZBSUxfQ1JJVCwKKysJTk1fQVRUX0RFU1QsCisrCS8qIHJlcyAqLworKwlOTV9BVFRfRVZFTlRfVFlQRQk9IDB4MTEsIC8qIEJTMTE6IGZpbGUgZGF0YSA/IT8gKi8KKysJTk1fQVRUX0ZJTEVfSUQsCisrCU5NX0FUVF9GSUxFX1ZFUlNJT04sCisrCU5NX0FUVF9HU01fVElNRSwKKysJTk1fQVRUX0hTTiwKKysJTk1fQVRUX0hXX0NPTkZJRywKKysJTk1fQVRUX0hXX0RFU0MsCisrCU5NX0FUVF9JTlRBVkVfUEFSQU0sCisrCU5NX0FUVF9JTlRFUkZfQk9VTkQsCisrCU5NX0FUVF9MSVNUX1JFUV9BVFRSLAorKwlOTV9BVFRfTUFJTywKKysJTk1fQVRUX01BTlVGX1NUQVRFLAorKwlOTV9BVFRfTUFOVUZfVEhSRVNILAorKwlOTV9BVFRfTUFOVUZfSUQsCisrCU5NX0FUVF9NQVhfVEEsCisrCU5NX0FUVF9NRFJPUF9MSU5LLAkvKiAweDIwICovCisrCU5NX0FUVF9NRFJPUF9ORVhULAorKwlOTV9BVFRfTkFDS19DQVVTRVMsCisrCU5NX0FUVF9OWTEsCisrCU5NX0FUVF9PUEVSX1NUQVRFLAorKwlOTV9BVFRfT1ZFUkxfUEVSSU9ELAorKwlOTV9BVFRfUEhZU19DT05GLAorKwlOTV9BVFRfUE9XRVJfQ0xBU1MsCisrCU5NX0FUVF9QT1dFUl9USFJFU0gsCisrCU5NX0FUVF9QUk9CX0NBVVNFLAorKwlOTV9BVFRfUkFDSF9CX1RIUkVTSCwKKysJTk1fQVRUX0xEQVZHX1NMT1RTLAorKwlOTV9BVFRfUkFEX1NVQkMsCisrCU5NX0FUVF9SRl9NQVhQT1dSX1IsCisrCU5NX0FUVF9TSVRFX0lOUFVUUywKKysJTk1fQVRUX1NJVEVfT1VUUFVUUywKKysJTk1fQVRUX1NPVVJDRSwJCS8qIDB4MzAgKi8KKysJTk1fQVRUX1NQRUNfUFJPQiwKKysJTk1fQVRUX1NUQVJUX1RJTUUsCisrCU5NX0FUVF9UMjAwLAorKwlOTV9BVFRfVEVJLAorKwlOTV9BVFRfVEVTVF9EVVIsCisrCU5NX0FUVF9URVNUX05PLAorKwlOTV9BVFRfVEVTVF9SRVBPUlQsCisrCU5NX0FUVF9WU1dSX1RIUkVTSCwKKysJTk1fQVRUX1dJTkRPV19TSVpFLAorKwkvKiBSZXMgICovCisrCU5NX0FUVF9CUzExX1JTU0lfT0ZGUwk9IDB4M2QsCisrCU5NX0FUVF9CUzExX1RYUFdSCT0gMHgzZSwKKysJTk1fQVRUX0JTMTFfRElWRVJTSVRZCT0gMHgzZiwKKysJLyogUmVzICAqLworKwlOTV9BVFRfVFNDCQk9IDB4NDAsCisrCU5NX0FUVF9TV19DT05GSUcsCisrCU5NX0FUVF9TV19ERVNDUiwKKysJTk1fQVRUX1NFVkVSSVRZLAorKwlOTV9BVFRfR0VUX0FSSSwKKysJTk1fQVRUX0hXX0NPTkZfQ0hHLAorKwlOTV9BVFRfT1VUU1RfQUxBUk0sCisrCU5NX0FUVF9GSUxFX0RBVEEsCisrCU5NX0FUVF9NRUFTX1JFUywKKysJTk1fQVRUX01FQVNfVFlQRSwKKysKKysJTk1fQVRUX0JTMTFfRVNOX0ZXX0NPREVfTk8JPSAweDRjLAorKwlOTV9BVFRfQlMxMV9FU05fSFdfQ09ERV9OTwk9IDB4NGYsCisrCisrCU5NX0FUVF9CUzExX0VTTl9QQ0JfU0VSSUFMCT0gMHg1NSwKKysJTk1fQVRUX0JTMTFfRVhDRVNTSVZFX0RJU1RBTkNFCT0gMHg1OCwKKysKKysJTk1fQVRUX0JTMTFfQUxMX1RFU1RfQ0FURwk9IDB4NjAsCisrCU5NX0FUVF9CUzExX0JUU0xTX0hPUFBJTkcsCisrCU5NX0FUVF9CUzExX0NFTExfQUxMT0NfTlIsCisrCU5NX0FUVF9CUzExX0NFTExfR0xPQkFMX0lELAorKwlOTV9BVFRfQlMxMV9FTkFfSU5URVJGX0NMQVNTCT0gMHg2NiwKKysJTk1fQVRUX0JTMTFfRU5BX0lOVF9JTlRFQ19IQU5ETwk9IDB4NjcsCisrCU5NX0FUVF9CUzExX0VOQV9JTlRfSU5UUkNfSEFORE8JPSAweDY4LAorKwlOTV9BVFRfQlMxMV9FTkFfTVNfUFdSX0NUUkwJPSAweDY5LAorKwlOTV9BVFRfQlMxMV9FTkFfUFdSX0JER1RfSE8JPSAweDZhLAorKwlOTV9BVFRfQlMxMV9FTkFfUFdSX0NUUkxfUkxGVwk9IDB4NmIsCisrCU5NX0FUVF9CUzExX0VOQV9SWExFVl9ITwk9IDB4NmMsCisrCU5NX0FUVF9CUzExX0VOQV9SWFFVQUxfSE8JPSAweDZkLAorKwlOTV9BVFRfQlMxMV9GQUNDSF9RVUFMCQk9IDB4NmUsCisrCisrCU5NX0FUVF9JUEFDQ19EU1RfSVAJCT0gMHg4MCwKKysJTk1fQVRUX0lQQUNDX0RTVF9JUF9QT1JUCT0gMHg4MSwKKysJTk1fQVRUX0lQQUNDX1NTUkMJCT0gMHg4MiwJCS8qIFJUUCBTeW5jIFNvdXJjZSAqLworKwlOTV9BVFRfSVBBQ0NfUlRQX1BBWUxEX1RZUEUJPSAweDgzLAorKwlOTV9BVFRfSVBBQ0NfQkFTRUJfSUQJCT0gMHg4NCwKKysJTk1fQVRUX0lQQUNDX1NUUkVBTV9JRAkJPSAweDg1LAorKwlOTV9BVFRfSVBBQ0NfTlZfRkxBR1MJCT0gMHg4NiwKKysJTk1fQVRUX0lQQUNDX0ZSRVFfQ1RSTAkJPSAweDg3LAorKwlOTV9BVFRfSVBBQ0NfUFJJTV9PTUxfQ0ZHCT0gMHg4OCwKKysJTk1fQVRUX0lQQUNDX1NFQ19PTUxfQ0ZHCT0gMHg4OSwKKysJTk1fQVRUX0lQQUNDX0lQX0lGX0NGRwkJPSAweDhhLAkJLyogSVAgaW50ZXJmYWNlICovCisrCU5NX0FUVF9JUEFDQ19JUF9HV19DRkcJCT0gMHg4YiwJCS8qIElQIGdhdGV3YXkgKi8KKysJTk1fQVRUX0lQQUNDX0lOX1NFUlZfVElNRQk9IDB4OGMsCisrCU5NX0FUVF9JUEFDQ19UUlhfQlRTX0FTUwk9IDB4OGQsCisrCU5NX0FUVF9JUEFDQ19MT0NBVElPTgkJPSAweDhlLAkJLyogc3RyaW5nIGRlc2NyaWJpbmcgbG9jYXRpb24gKi8KKysJTk1fQVRUX0lQQUNDX1BBR0lOR19DRkcJCT0gMHg4ZiwKKysJTk1fQVRUX0lQQUNDX0ZJTEVfREFUQQkJPSAweDkwLAorKwlOTV9BVFRfSVBBQ0NfVU5JVF9JRAkJPSAweDkxLAkJLyogU2l0ZS9CVFMvVFJYICovCisrCU5NX0FUVF9JUEFDQ19QQVJFTlRfVU5JVF9JRAk9IDB4OTIsCisrCU5NX0FUVF9JUEFDQ19VTklUX05BTUUJCT0gMHg5MywJCS8qIGRlZmF1bHQ6IG5idHMtPG1hYy1hcy1zdHJpbmc+ICovCisrCU5NX0FUVF9JUEFDQ19TTk1QX0NGRwkJPSAweDk0LAorKwlOTV9BVFRfSVBBQ0NfUFJJTV9PTUxfQ0ZHX0xJU1QJPSAweDk1LAorKwlOTV9BVFRfSVBBQ0NfUFJJTV9PTUxfRkJfVE9VVAk9IDB4OTYsCQkvKiBmYWxsYmFjayB0aW1lb3V0ICovCisrCU5NX0FUVF9JUEFDQ19DVVJfU1dfQ0ZHCQk9IDB4OTcsCisrCU5NX0FUVF9JUEFDQ19USU1JTkdfQlVTCQk9IDB4OTgsCisrCU5NX0FUVF9JUEFDQ19DR0kJCT0gMHg5OSwJCS8qIENlbGwgR2xvYmFsIElEICovCisrCU5NX0FUVF9JUEFDQ19SQUMJCT0gMHg5YSwKKysJTk1fQVRUX0lQQUNDX09CSl9WRVJTSU9OCT0gMHg5YiwKKysJTk1fQVRUX0lQQUNDX0dQUlNfUEFHSU5HX0NGRwk9IDB4OWMsCisrCU5NX0FUVF9JUEFDQ19OU0VJCQk9IDB4OWQsCisrCU5NX0FUVF9JUEFDQ19CVkNJCQk9IDB4OWUsCisrCU5NX0FUVF9JUEFDQ19OU1ZDSQkJPSAweDlmLAorKwlOTV9BVFRfSVBBQ0NfTlNfQ0ZHCQk9IDB4YTAsCisrCU5NX0FUVF9JUEFDQ19CU1NHUF9DRkcJCT0gMHhhMSwKKysJTk1fQVRUX0lQQUNDX05TX0xJTktfQ0ZHCT0gMHhhMiwKKysJTk1fQVRUX0lQQUNDX1JMQ19DRkcJCT0gMHhhMywKKysJTk1fQVRUX0lQQUNDX0FMTV9USFJFU0hfTElTVAk9IDB4YTQsCisrCU5NX0FUVF9JUEFDQ19NT05JVF9WQUxfTElTVAk9IDB4YTUsCisrCU5NX0FUVF9JUEFDQ19USUJfQ09OVFJPTAk9IDB4YTYsCisrCU5NX0FUVF9JUEFDQ19TVVBQX0ZFQVRVUkVTCT0gMHhhNywKKysJTk1fQVRUX0lQQUNDX0NPRElOR19TQ0hFTUVTCT0gMHhhOCwKKysJTk1fQVRUX0lQQUNDX1JMQ19DRkdfMgkJPSAweGE5LAorKwlOTV9BVFRfSVBBQ0NfSEVBUlRCX1RPVVQJPSAweGFhLAorKwlOTV9BVFRfSVBBQ0NfVVBUSU1FCQk9IDB4YWIsCisrCU5NX0FUVF9JUEFDQ19STENfQ0ZHXzMJCT0gMHhhYywKKysJTk1fQVRUX0lQQUNDX1NTTF9DRkcJCT0gMHhhZCwKKysJTk1fQVRUX0lQQUNDX1NFQ19QT1NTSUJMRQk9IDB4YWUsCisrCU5NX0FUVF9JUEFDQ19JTUxfU1NMX1NUQVRFCT0gMHhhZiwKKysJTk1fQVRUX0lQQUNDX1JFVk9DX0RBVEUJCT0gMHhiMCwKKysKKysKKysJTk1fQVRUX0JTMTFfUkZfUkVTX0lORF9QRVIJPSAweDhmLAorKworKwlOTV9BVFRfQlMxMV9SWF9MRVZfTUlOX0NFTEwJPSAweDkwLAorKwlOTV9BVFRfQlMxMV9BQklTX0VYVF9USU1FCT0gMHg5MSwKKysJTk1fQVRUX0JTMTFfVElNRVJfSE9fUkVRVUVTVAk9IDB4OTIsCisrCU5NX0FUVF9CUzExX1RJTUVSX05DRUxMCQk9IDB4OTMsCisrCU5NX0FUVF9CUzExX1RTWU5DCQk9IDB4OTQsCisrCU5NX0FUVF9CUzExX1RUUkFVCQk9IDB4OTUsCisrCU5NX0FUVF9CUzExX0VNUkdfQ0ZHX01FTUJFUgk9IDB4OWIsCisrCU5NX0FUVF9CUzExX1RSWF9BUkVBCQk9IDB4OWYsCisrCisrCU5NX0FUVF9CUzExX0JDQ0hfUkVDT05GCQk9IDB4ZDcsCisrCU5NX0FUVF9CUzExX0JJVF9FUlJfVEhFU0gJPSAweGEwLAorKwlOTV9BVFRfQlMxMV9CT09UX1NXX1ZFUlMJPSAweGExLAorKwlOTV9BVFRfQlMxMV9DQ0xLX0FDQ1VSQUNZCT0gMHhhMywKKysJTk1fQVRUX0JTMTFfQ0NMS19UWVBFCQk9IDB4YTQsCisrCU5NX0FUVF9CUzExX0lOUF9JTVBFREFOQ0UJPSAweGFhLAorKwlOTV9BVFRfQlMxMV9MMV9QUk9UX1RZUEUJPSAweGFiLAorKwlOTV9BVFRfQlMxMV9MSU5FX0NGRwkJPSAweGFjLAorKwlOTV9BVFRfQlMxMV9MSV9QT1JUXzEJCT0gMHhhZCwKKysJTk1fQVRUX0JTMTFfTElfUE9SVF8yCQk9IDB4YWUsCisrCisrCU5NX0FUVF9CUzExX0wxX1JFTV9BTE1fVFlQRQk9IDB4YjAsCisrCU5NX0FUVF9CUzExX1NXX0xPQURfSU5URU5ERUQJPSAweGJiLAorKwlOTV9BVFRfQlMxMV9TV19MT0FEX1NBRkVUWQk9IDB4YmMsCisrCU5NX0FUVF9CUzExX1NXX0xPQURfU1RPUkVECT0gMHhiZCwKKysKKysJTk1fQVRUX0JTMTFfVkVORE9SX05BTUUJCT0gMHhjMSwKKysJTk1fQVRUX0JTMTFfSE9QUElOR19NT0RFCT0gMHhjNSwKKysJTk1fQVRUX0JTMTFfTE1UX0xPR09OX1NFU1NJT04JPSAweGM2LAorKwlOTV9BVFRfQlMxMV9MTVRfTE9HSU5fVElNRQk9IDB4YzcsCisrCU5NX0FUVF9CUzExX0xNVF9VU0VSX0FDQ19MRVYJPSAweGM4LAorKwlOTV9BVFRfQlMxMV9MTVRfVVNFUl9OQU1FCT0gMHhjOSwKKysKKysJTk1fQVRUX0JTMTFfTDFfQ09OVFJPTF9UUwk9IDB4ZDgsCisrCU5NX0FUVF9CUzExX1JBRElPX01FQVNfR1JBTgk9IDB4ZGMsCS8qIGluIFNBQ0NIIG11bHRpZnJhbWVzICovCisrCU5NX0FUVF9CUzExX1JBRElPX01FQVNfUkVQCT0gMHhkZCwKKysKKysJTk1fQVRUX0JTMTFfU0hfTEFQRF9JTlRfVElNRVIJPSAweGU4LAorKworKwlOTV9BVFRfQlMxMV9CVFNfU1RBVEUJCT0gMHhmMCwKKysJTk1fQVRUX0JTMTFfRTFfU1RBVEUJCT0gMHhmMSwKKysJTk1fQVRUX0JTMTFfUExMCQkJPSAweGYyLAorKwlOTV9BVFRfQlMxMV9SWF9PRkZTRVQJCT0gMHhmMywKKysJTk1fQVRUX0JTMTFfQU5UX1RZUEUJCT0gMHhmNCwKKysJTk1fQVRUX0JTMTFfUExMX01PREUJCT0gMHhmYywKKysJTk1fQVRUX0JTMTFfUEFTU1dPUkQJCT0gMHhmZCwKKyt9OworKyNkZWZpbmUgTk1fQVRUX0JTMTFfRklMRV9EQVRBCU5NX0FUVF9FVkVOVF9UWVBFCisrCisrLyogU2VjdGlvbiA5LjQuNDogQWRtaW5pc3RyYXRpdmUgU3RhdGUgKi8KKytlbnVtIGFiaXNfbm1fYWRtX3N0YXRlIHsKKysJTk1fU1RBVEVfTE9DS0VECQk9IDB4MDEsCisrCU5NX1NUQVRFX1VOTE9DS0VECT0gMHgwMiwKKysJTk1fU1RBVEVfU0hVVERPV04JPSAweDAzLAorKwlOTV9TVEFURV9OVUxMCQk9IDB4ZmYsCisrfTsKKysKKysvKiBTZWN0aW9uIDkuNC4xMzogQ2hhbm5lbCBDb21iaW5hdGlvbiAqLworK2VudW0gYWJpc19ubV9jaGFuX2NvbWIgeworKwlOTV9DSEFOQ19UQ0hGdWxsCT0gMHgwMCwKKysJTk1fQ0hBTkNfVENISGFsZgk9IDB4MDEsCisrCU5NX0NIQU5DX1RDSEhhbGYyCT0gMHgwMiwKKysJTk1fQ0hBTkNfU0RDQ0gJCT0gMHgwMywKKysJTk1fQ0hBTkNfbWFpbkJDQ0gJPSAweDA0LAorKwlOTV9DSEFOQ19CQ0NIQ29tYgk9IDB4MDUsCisrCU5NX0NIQU5DX0JDQ0gJCT0gMHgwNiwKKysJTk1fQ0hBTkNfQkNDSF9DQkNICT0gMHgwNywKKysJTk1fQ0hBTkNfU0RDQ0hfQ0JDSAk9IDB4MDgsCisrfTsKKysKKysvKiBTZWN0aW9uIDkuNC4xNjogRXZlbnQgVHlwZSAqLworK2VudW0gYWJpc19ubV9ldmVudF90eXBlIHsKKysJTk1fRVZUX0NPTU1fRkFJTAk9IDB4MDAsCisrCU5NX0VWVF9RT1NfRkFJTAkJPSAweDAxLAorKwlOTV9FVlRfUFJPQ19GQUlMCT0gMHgwMiwKKysJTk1fRVZUX0VRVUlQX0ZBSUwJPSAweDAzLAorKwlOTV9FVlRfRU5WX0ZBSUwJCT0gMHgwNCwKKyt9OworKworKy8qIFNlY3Rpb246IDkuNC42MzogUGVyY2VpdmVkIFNldmVyaXR5ICovCisrZW51bSBhYmlzX25tX3NldmVyaXR5IHsKKysJTk1fU0VWRVJfQ0VBU0VECQk9IDB4MDAsCisrCU5NX1NFVkVSX0NSSVRJQ0FMCT0gMHgwMSwKKysJTk1fU0VWRVJfTUFKT1IJCT0gMHgwMiwKKysJTk1fU0VWRVJfTUlOT1IJCT0gMHgwMywKKysJTk1fU0VWRVJfV0FSTklORwk9IDB4MDQsCisrCU5NX1NFVkVSX0lOREVURVJNSU5BVEUJPSAweDA1LAorK307CisrCisrLyogU2VjdGlvbiA5LjQuNDM6IFByb2JhYmxlIENhdXNlIFR5cGUgKi8KKytlbnVtIGFiaXNfbm1fcGNhdXNlX3R5cGUgeworKwlOTV9QQ0FVU0VfVF9YNzIxCT0gMHgwMSwKKysJTk1fUENBVVNFX1RfR1NNCQk9IDB4MDIsCisrCU5NX1BDQVVTRV9UX01BTlVGCT0gMHgwMywKKyt9OworKworKy8qIFNlY3Rpb24gOS40LjM2OiBOQUNLIENhdXNlcyAqLworK2VudW0gYWJpc19ubV9uYWNrX2NhdXNlIHsKKysJLyogR2VuZXJhbCBOYWNrIENhdXNlcyAqLworKwlOTV9OQUNLX0lOQ09SUl9TVFJVQ1QJCT0gMHgwMSwKKysJTk1fTkFDS19NU0dUWVBFX0lOVkFMCQk9IDB4MDIsCisrCU5NX05BQ0tfT0JKQ0xBU1NfSU5WQUwJCT0gMHgwNSwKKysJTk1fTkFDS19PQkpDTEFTU19OT1RTVVBQCT0gMHgwNiwKKysJTk1fTkFDS19CVFNOUl9VTktOCQk9IDB4MDcsCisrCU5NX05BQ0tfVFJYTlJfVU5LTgkJPSAweDA4LAorKwlOTV9OQUNLX09CSklOU1RfVU5LTgkJPSAweDA5LAorKwlOTV9OQUNLX0FUVFJJRF9JTlZBTAkJPSAweDBjLAorKwlOTV9OQUNLX0FUVFJJRF9OT1RTVVBQCQk9IDB4MGQsCisrCU5NX05BQ0tfUEFSQU1fUkFOR0UJCT0gMHgwZSwKKysJTk1fTkFDS19BVFRSTElTVF9JTkNPTlNJU1RFTlQJPSAweDBmLAorKwlOTV9OQUNLX1NQRUNfSU1QTF9OT1RTVVBQCT0gMHgxMCwKKysJTk1fTkFDS19DQU5UX1BFUkZPUk0JCT0gMHgxMSwKKysJLyogU3BlY2lmaWMgTmFjayBDYXVzZXMgKi8KKysJTk1fTkFDS19SRVNfTk9USU1QTAkJPSAweDE5LAorKwlOTV9OQUNLX1JFU19OT1RBVkFJTAkJPSAweDFhLAorKwlOTV9OQUNLX0ZSRVFfTk9UQVZBSUwJCT0gMHgxYiwKKysJTk1fTkFDS19URVNUX05PVFNVUFAJCT0gMHgxYywKKysJTk1fTkFDS19DQVBBQ0lUWV9SRVNUUgkJPSAweDFkLAorKwlOTV9OQUNLX1BIWVNDRkdfTk9UUEVSRk9STQk9IDB4MWUsCisrCU5NX05BQ0tfVEVTVF9OT1RJTklUCQk9IDB4MWYsCisrCU5NX05BQ0tfUEhZU0NGR19OT1RSRVNUT1JFCT0gMHgyMCwKKysJTk1fTkFDS19URVNUX05PU1VDSAkJPSAweDIxLAorKwlOTV9OQUNLX1RFU1RfTk9TVE9QCQk9IDB4MjIsCisrCU5NX05BQ0tfTVNHSU5DT05TSVNUX1BIWVNDRkcJPSAweDIzLAorKwlOTV9OQUNLX0ZJTEVfSU5DT01QTEVURQkJPSAweDI1LAorKwlOTV9OQUNLX0ZJTEVfTk9UQVZBSUwJCT0gMHgyNiwKKysJTk1fTkFDS19GSUxFX05PVEFDVElWQVRFCT0gMHgyNywKKysJTk1fTkFDS19SRVFfTk9UX0dSQU5UCQk9IDB4MjgsCisrCU5NX05BQ0tfV0FJVAkJCT0gMHgyOSwKKysJTk1fTkFDS19OT1RIX1JFUE9SVF9FWElTVAk9IDB4MmEsCisrCU5NX05BQ0tfTUVBU19OT1RTVVBQCQk9IDB4MmIsCisrCU5NX05BQ0tfTUVBU19OT1RTVEFSVAkJPSAweDJjLAorK307CisrCisrLyogU2VjdGlvbiA5LjQuMSAqLworK3N0cnVjdCBhYmlzX25tX2NoYW5uZWwgeworKwlndWludDgJYXR0cmliOworKwlndWludDgJYnRzX3BvcnQ7CisrCWd1aW50OAl0aW1lc2xvdDsKKysJZ3VpbnQ4CXN1YnNsb3Q7CisrfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisrCisrLyogU2llbWVucyBCUy0xMSBzcGVjaWZpYyBvYmplY3RzIGluIHRoZSBTaWVuZW1zSFcgKDB4QTUpIG9iamVjdCBjbGFzcyAqLworK2VudW0gYWJpc19iczExX29ianR5cGUgeworKwlCUzExX09CSl9BTENPCQk9IDB4MDEsCisrCUJTMTFfT0JKX0JCU0lHCQk9IDB4MDIsCS8qIG9ial9jbGFzczogMCwxICovCisrCUJTMTFfT0JKX1RSWDEJCT0gMHgwMywJLyogb25seSBERUFDVElWQVRFIFRSWDEgKi8KKysJQlMxMV9PQkpfQ0NMSwkJPSAweDA0LAorKwlCUzExX09CSl9HUFNVCQk9IDB4MDYsCisrCUJTMTFfT0JKX0xJCQk9IDB4MDcsCisrCUJTMTFfT0JKX1BBCQk9IDB4MDksCS8qIG9ial9jbGFzczogMCwgMSovCisrfTsKKysKKytlbnVtIGFiaXNfYnMxMV90cnhfcG93ZXIgeworKwlCUzExX1RSWF9QT1dFUl9HU01fMlcJPSAweDA2LAorKwlCUzExX1RSWF9QT1dFUl9HU01fMjUwbVc9IDB4MDcsCisrCUJTMTFfVFJYX1BPV0VSX0dTTV84MG1XCT0gMHgwOCwKKysJQlMxMV9UUlhfUE9XRVJfR1NNXzMwbVcJPSAweDA5LAorKwlCUzExX1RSWF9QT1dFUl9EQ1NfM1cJPSAweDBhLAorKwlCUzExX1RSWF9QT1dFUl9EQ1NfMVc2CT0gMHgwYiwKKysJQlMxMV9UUlhfUE9XRVJfRENTXzUwMG1XPSAweDBjLAorKwlCUzExX1RSWF9QT1dFUl9EQ1NfMTYwbVc9IDB4MGQsCisrfTsKKysKKytlbnVtIGFiaXNfYnMxMV9saV9wbGxfbW9kZSB7CisrCUJTMTFfTElfUExMX0xPQ0tFRAk9IDIsCisrCUJTMTFfTElfUExMX1NUQU5EQUxPTkUJPSAzLAorK307CisrCisrZW51bSBhYmlzX2JzMTFfcGhhc2UgeworKwlCUzExX1NUQVRFX1NPRlRXQVJFX1JRRAkJPSAweDAxLAorKwlCUzExX1NUQVRFX0xPQURfU01VX0lOVEVOREVECT0gMHgxMSwKKysJQlMxMV9TVEFURV9MT0FEX1NNVV9TQUZFVFkJPSAweDIxLAorKwlCUzExX1NUQVRFX0xPQURfRkFJTEVECQk9IDB4MzEsCisrCUJTMTFfU1RBVEVfTE9BRF9ESUFHTk9TVElDCT0gMHg0MSwKKysJQlMxMV9TVEFURV9XQVJNX1VQCQk9IDB4NTEsCisrCUJTMTFfU1RBVEVfV0FSTV9VUF8yCQk9IDB4NTIsCisrCUJTMTFfU1RBVEVfV0FJVF9NSU5fQ0ZHCQk9IDB4NjIsCisrCUJTMTFfU1RBVEVfTUFJTlRFTkFOQ0UJCT0gMHg3MiwKKysJQlMxMV9TVEFURV9MT0FEX01CQ0NVCQk9IDB4OTIsCisrCUJTMTFfU1RBVEVfV0FJVF9NSU5fQ0ZHXzIJPSAweEEyLAorKwlCUzExX1NUQVRFX05PUk1BTAkJPSAweDAzLAorKwlCUzExX1NUQVRFX0FCSVNfTE9BRAkJPSAweDEzLAorK307CisrCisrLyogRnJvbSBvcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90bHYuaCAqLworK2VudW0gdGx2X3R5cGUgeworKwlUTFZfVFlQRV9GSVhFRCwKKysJVExWX1RZUEVfVCwKKysJVExWX1RZUEVfVFYsCisrCVRMVl9UWVBFX1RMViwKKysJVExWX1RZUEVfVEwxNlYsCisrfTsKKysKKytzdHJ1Y3QgdGx2X2RlZiB7CisrCWVudW0gdGx2X3R5cGUgdHlwZTsKKysJdV9pbnQ4X3QgZml4ZWRfbGVuOworK307CisrCisrc3RydWN0IHRsdl9kZWZpbml0aW9uIHsKKysJc3RydWN0IHRsdl9kZWYgZGVmWzB4ZmZdOworK307CisrCisrZW51bSBhYmlzX25tX2lwYWNjX3Rlc3Rfbm8geworKwlOTV9JUEFDQ19URVNUTk9fUkxPT1BfQU5UCT0gMHgwMSwKKysJTk1fSVBBQ0NfVEVTVE5PX1JMT09QX1hDVlIJPSAweDAyLAorKwlOTV9JUEFDQ19URVNUTk9fRlVOQ19PQkoJPSAweDAzLAorKwlOTV9JUEFDQ19URVNUTk9fQ0hBTl9VU0FHRQk9IDB4NDAsCisrCU5NX0lQQUNDX1RFU1ROT19CQ0NIX0NIQU5fVVNBR0UJPSAweDQxLAorKwlOTV9JUEFDQ19URVNUTk9fRlJFUV9TWU5DCT0gMHg0MiwKKysJTk1fSVBBQ0NfVEVTVE5PX0JDQ0hfSU5GTwk9IDB4NDMsCisrCU5NX0lQQUNDX1RFU1ROT19UWF9CRUFDT04JPSAweDQ0LAorKwlOTV9JUEFDQ19URVNUTk9fU1lTSU5GT19NT05JVE9SCT0gMHg0NSwKKysJTk1fSVBBQ0NfVEVTVE5PX0JDQ0NIX01PTklUT1IJPSAweDQ2LAorK307CisrCisrLyogZmlyc3QgYnl0ZSBhZnRlciBsZW5ndGggaW5zaWRlIE5NX0FUVF9URVNUX1JFUE9SVCAqLworK2VudW0gYWJpc19ubV9pcGFjY190ZXN0X3JlcyB7CisrCU5NX0lQQUNDX1RFU1RSRVNfU1VDQ0VTUwk9IDAsCisrCU5NX0lQQUNDX1RFU1RSRVNfVElNRU9VVAk9IDEsCisrCU5NX0lQQUNDX1RFU1RSRVNfTk9fQ0hBTlMJPSAyLAorKwlOTV9JUEFDQ19URVNUUkVTX1BBUlRJQUwJPSAzLAorKwlOTV9JUEFDQ19URVNUUkVTX1NUT1BQRUQJPSA0LAorK307CisrCisrLyogaW50ZXJuYWwgSUUgaW5zaWRlIE5NX0FUVF9URVNUX1JFUE9SVCAqLworK2VudW0gYWJpc19ubV9pcGFjY190ZXN0cmVzX2llIHsKKysJTk1fSVBBQ0NfVFJfSUVfRlJFUV9FUlJfTElTVAk9IDMsCisrCU5NX0lQQUNDX1RSX0lFX0NIQU5fVVNBR0UJPSA0LAorKwlOTV9JUEFDQ19UUl9JRV9CQ0NIX0lORk8JPSA2LAorKwlOTV9JUEFDQ19UUl9JRV9SRVNVTFRfREVUQUlMUwk9IDgsCisrCU5NX0lQQUNDX1RSX0lFX0ZSRVFfRVJSCQk9IDE4LAorK307CisrCisrLyogRnJvbSBvcGVuYnNjL3NyYy9hYmlzX25tLmMgKi8KKytzdGF0aWMgY29uc3Qgc3RydWN0IHRsdl9kZWZpbml0aW9uIG5tX2F0dF90bHZkZWYgPSB7CisrCS5kZWYgPSB7CisrCQlbTk1fQVRUX0FCSVNfQ0hBTk5FTF0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMyB9LAorKwkJW05NX0FUVF9BRERfSU5GT10gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9BRERfVEVYVF0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9BRE1fU1RBVEVdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfQVJGQ05fTElTVF09CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0FVVE9OX1JFUE9SVF0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9BVkFJTF9TVEFUVVNdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfQkNDSF9BUkZDTl0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW05NX0FUVF9CU0lDXSA9CQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9CVFNfQUlSX1RJTUVSXSA9CXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfQ0NDSF9MX0lfUF0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9DQ0NIX0xfVF0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9DSEFOX0NPTUJdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfQ09OTl9GQUlMX0NSSVRdID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9ERVNUXSA9CQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9FVkVOVF9UWVBFXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0ZJTEVfSURdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfRklMRV9WRVJTSU9OXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0dTTV9USU1FXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbTk1fQVRUX0hTTl0gPQkJCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfSFdfQ09ORklHXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQkvL0JTMTEgW05NX0FUVF9IV19ERVNDXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0hXX0RFU0NdID0JCXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0lOVEFWRV9QQVJBTV0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9JTlRFUkZfQk9VTkRdID0JCXsgVExWX1RZUEVfRklYRUQsIDYgfSwKKysJCVtOTV9BVFRfTElTVF9SRVFfQVRUUl0gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX01BSU9dID0JCQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX01BTlVGX1NUQVRFXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX01BTlVGX1RIUkVTSF0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9NQU5VRl9JRF0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9NQVhfVEFdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfTURST1BfTElOS10gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW05NX0FUVF9NRFJPUF9ORVhUXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbTk1fQVRUX05BQ0tfQ0FVU0VTXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX05ZMV0gPQkJCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfT1BFUl9TVEFURV0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9PVkVSTF9QRVJJT0RdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfUEhZU19DT05GXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX1BPV0VSX0NMQVNTXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX1BPV0VSX1RIUkVTSF0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMyB9LAorKwkJW05NX0FUVF9QUk9CX0NBVVNFXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAzIH0sCisrCQlbTk1fQVRUX1JBQ0hfQl9USFJFU0hdID0JeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9MREFWR19TTE9UU10gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW05NX0FUVF9SQURfU1VCQ10gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9SRl9NQVhQT1dSX1JdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfU0lURV9JTlBVVFNdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfU0lURV9PVVRQVVRTXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX1NPVVJDRV0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9TUEVDX1BST0JdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfU1RBUlRfVElNRV0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW05NX0FUVF9UMjAwXSA9CQkJeyBUTFZfVFlQRV9GSVhFRCwgNyB9LAorKwkJW05NX0FUVF9URUldID0JCQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX1RFU1RfRFVSXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbTk1fQVRUX1RFU1RfTk9dID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfVEVTVF9SRVBPUlRdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfVlNXUl9USFJFU0hdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtOTV9BVFRfV0lORE9XX1NJWkVdID0gCQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX1RTQ10gPQkJCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfU1dfQ09ORklHXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX1NFVkVSSVRZXSA9IAkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9HRVRfQVJJXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0hXX0NPTkZfQ0hHXSA9IAkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9PVVRTVF9BTEFSTV0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9GSUxFX0RBVEFdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfTUVBU19SRVNdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysjaWYgMAorKwkJLyogQlMxMSBzcGVjaWZpY3MgKi8KKysJCVtOTV9BVFRfQlMxMV9FU05fRldfQ09ERV9OT10gPQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0VTTl9IV19DT0RFX05PXSA9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfRVNOX1BDQl9TRVJJQUxdID0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9CT09UX1NXX1ZFUlNdID0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVsweGQ1XSA9CQkJeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVsweGE4XSA9CQkJeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9QQVNTV09SRF0gPQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX1RYUFdSXSA9CQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX1JTU0lfT0ZGU10gPQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0xJTkVfQ0ZHXSA9IAl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfTDFfUFJPVF9UWVBFXSA9CXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9CSVRfRVJSX1RIRVNIXSA9CXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtOTV9BVFRfQlMxMV9ESVZFUlNJVFldID0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9MTVRfTE9HT05fU0VTU0lPTl09eyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9MTVRfTE9HSU5fVElNRV0gPQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0xNVF9VU0VSX0FDQ19MRVZdID17IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0xNVF9VU0VSX05BTUVdID0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9CVFNfU1RBVEVdCT0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9FMV9TVEFURV0JPQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX1BMTF9NT0RFXQk9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfUExMXQk9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfQ0NMS19BQ0NVUkFDWV0gPQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfQ0NMS19UWVBFXSA9CXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVsweDk1XSA9CQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKyNlbmRpZgorKwkJLyogaXAuYWNjZXNzIHNwZWNpZmljcyAqLworKwkJW05NX0FUVF9JUEFDQ19EU1RfSVBdID0JCXsgVExWX1RZUEVfRklYRUQsIDQgfSwKKysJCVtOTV9BVFRfSVBBQ0NfRFNUX0lQX1BPUlRdID0JeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW05NX0FUVF9JUEFDQ19QUklNX09NTF9DRkddID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19OVl9GTEFHU10gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX0ZSRVFfQ1RSTF0gPQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbTk1fQVRUX0lQQUNDX1NFQ19PTUxfQ0ZHXSA9CXsgVExWX1RZUEVfRklYRUQsIDYgfSwKKysJCVtOTV9BVFRfSVBBQ0NfSVBfSUZfQ0ZHXSA9CXsgVExWX1RZUEVfRklYRUQsIDggfSwKKysJCVtOTV9BVFRfSVBBQ0NfSVBfR1dfQ0ZHXSA9CXsgVExWX1RZUEVfRklYRUQsIDEyIH0sCisrCQlbTk1fQVRUX0lQQUNDX0xPQ0FUSU9OXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfVU5JVF9JRF0gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX1VOSVRfTkFNRV0gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX1NOTVBfQ0ZHXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfQUxNX1RIUkVTSF9MSVNUXT0geyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19DVVJfU1dfQ0ZHXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfU1RSRUFNX0lEXSA9CXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfUkFDXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX09CSl9WRVJTSU9OXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfR1BSU19QQUdJTkdfQ0ZHXSA9eyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19OU0VJXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX0JWQ0ldID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfTlNWQ0ldID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfTlNfQ0ZHXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX0JTU0dQX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX05TX0xJTktfQ0ZHXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfUkxDX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX1NVUFBfRkVBVFVSRVNdID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19DT0RJTkdfU0NIRU1FU10gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX1JMQ19DRkdfMl0gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX1JMQ19DRkdfM10gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX0ZJTEVfREFUQV0gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCX0sCisrfTsKKysKKysjZW5kaWYgLyogX05NX0ggKi8KKy0tIAorMS43LjAuMQorCmRpZmYgLS1naXQgYS93aXJlc2hhcmsvbHVjZW50LWhuYi5wYXRjaCBiL3dpcmVzaGFyay9sdWNlbnQtaG5iLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjODUxOTUKLS0tIC9kZXYvbnVsbAorKysgYi93aXJlc2hhcmsvbHVjZW50LWhuYi5wYXRjaApAQCAtMCwwICsxLDEyMCBAQAorSW5kZXg6IHdpcmVzaGFyay9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LWx1Y2VudF9obmIuYworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tIC9kZXYvbnVsbAorKysrIHdpcmVzaGFyay9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LWx1Y2VudF9obmIuYworQEAgLTAsMCArMSwxMDMgQEAKKysvKiBwYWNrZXQtbHVjZW50X2huYi5jCisrICogUm91dGluZXMgZm9yIHBhY2tldCBkaXNzZWN0aW9uIG9mIEFsY2F0ZWwvTHVjZW50IEhvbWVOb2RlQgorKyAqIENvcHlyaWdodCAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisrICoKKysgKiBUaGlzIHByb3RvY29sIGRlY29kZXIgaXMgYmFzZWQgZW50aXJlbHkgb24gcmV2ZXJzZSBlbmdpbmVlcmluZywgaS5lLgorKyAqIG9uIGVkdWNhdGVkIGd1ZXNzZXMuCisrICoKKysgKiAkSWQ6IHBhY2tldC1sdWNlbnRfaG5iLmMgMjkyNTQgMjAwOS0wNy0zMSAxOToxOToyNVogZ2VyYWxkICQKKysgKgorKyAqIFdpcmVzaGFyayAtIE5ldHdvcmsgdHJhZmZpYyBhbmFseXplcgorKyAqIEJ5IEdlcmFsZCBDb21icyA8Z2VyYWxkQHdpcmVzaGFyay5vcmc+CisrICogQ29weXJpZ2h0IDE5OTggR2VyYWxkIENvbWJzCisrICoKKysgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisrICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKysgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKyAqCisrICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisrICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKysgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisrICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKysgKgorKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisrICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKysgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorKyAqLworKworKyNpZmRlZiBIQVZFX0NPTkZJR19ICisrIyBpbmNsdWRlICJjb25maWcuaCIKKysjZW5kaWYKKysKKysjZGVmaW5lIExITkJfU0NUUF9QUElfTU0JMQorKyNkZWZpbmUgTEhOQl9TQ1RQX1BQSV9HTU0JNgorKworKyNkZWZpbmUgTEhOQl9TQ1RQX1BPUlQJCTYwMDUKKysKKysjaW5jbHVkZSA8Z2xpYi5oPgorKworKyNpbmNsdWRlIDxlcGFuL3BhY2tldC5oPgorKworKy8qIEluaXRpYWxpemUgdGhlIHByb3RvY29sIGFuZCByZWdpc3RlcmVkIGZpZWxkcyAqLworK3N0YXRpYyBpbnQgcHJvdG9fbGhuYiA9IC0xOworKworK3N0YXRpYyBpbnQgaGZfbGhuYl9sZW5ndGggPSAtMTsKKysKKysvKiBJbml0aWFsaXplIHRoZSBzdWJ0cmVlIHBvaW50ZXJzICovCisrc3RhdGljIGdpbnQgZXR0X2xobmIgPSAtMTsKKysKKytzdGF0aWMgZGlzc2VjdG9yX2hhbmRsZV90IHJhbmFwX2hhbmRsZTsKKysKKysvKiBDb2RlIHRvIGFjdHVhbGx5IGRpc3NlY3QgdGhlIHBhY2tldHMgKi8KKytzdGF0aWMgdm9pZAorK2Rpc3NlY3RfbGhuYih0dmJ1ZmZfdCAqdHZiLCBwYWNrZXRfaW5mbyAqcGluZm8sIHByb3RvX3RyZWUgKnRyZWUpCisreworKworKwlpbnQgb2Zmc2V0ID0gMDsKKysJdV9pbnQxNl90IGxlbjsKKysJdHZidWZmX3QgKm5leHRfdHZiOworKworKwljb2xfc2V0X3N0cihwaW5mby0+Y2luZm8sIENPTF9QUk9UT0NPTCwgIkxITkIiKTsKKysJY29sX2NsZWFyKHBpbmZvLT5jaW5mbywgQ09MX0lORk8pOworKworKwlwcm90b190cmVlX2FkZF9pdGVtKHRyZWUsIGhmX2xobmJfbGVuZ3RoLCB0dmIsIG9mZnNldCsyLCAyLCBGQUxTRSk7CisrCWxlbiA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQrMik7CisrCW5leHRfdHZiID0gdHZiX25ld19zdWJzZXQodHZiLCBvZmZzZXQrMis2LCBsZW4tNCwgLTEpOworKworKwljYWxsX2Rpc3NlY3RvcihyYW5hcF9oYW5kbGUsIG5leHRfdHZiLCBwaW5mbywgdHJlZSk7CisrfQorKworK3ZvaWQgcHJvdG9fcmVnaXN0ZXJfbHVjZW50X2huYih2b2lkKQorK3sKKysJc3RhdGljIGhmX3JlZ2lzdGVyX2luZm8gaGZbXSA9IHsKKysJCXsmaGZfbGhuYl9sZW5ndGgsCisrCQkgeyJMZW5ndGgiLCAibGhuYi5sZW4iLAorKwkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAweDAsIE5VTEwsIEhGSUxMfQorKwkJIH0sCisrCX07CisrCisrCXN0YXRpYyBnaW50ICpldHRbXSA9IHsKKysJCSZldHRfbGhuYiwKKysJfTsKKysKKysJcHJvdG9fbGhuYiA9CisrCSAgICBwcm90b19yZWdpc3Rlcl9wcm90b2NvbCgiQWxjYXRlbC9MdWNlbnQgSG9tZU5vZGVCIiwKKysJCQkJICAgICJMdWNlbnQgSE5CIiwgImxobmIiKTsKKysKKysJcHJvdG9fcmVnaXN0ZXJfZmllbGRfYXJyYXkocHJvdG9fbGhuYiwgaGYsIGFycmF5X2xlbmd0aChoZikpOworKwlwcm90b19yZWdpc3Rlcl9zdWJ0cmVlX2FycmF5KGV0dCwgYXJyYXlfbGVuZ3RoKGV0dCkpOworK30KKysKKyt2b2lkIHByb3RvX3JlZ19oYW5kb2ZmX2x1Y2VudF9obmIodm9pZCkKKyt7CisrCWRpc3NlY3Rvcl9oYW5kbGVfdCBsaG5iX2hhbmRsZTsKKysKKysJcmFuYXBfaGFuZGxlID0gZmluZF9kaXNzZWN0b3IoInJhbmFwIik7CisrCisrCWxobmJfaGFuZGxlID0gY3JlYXRlX2Rpc3NlY3Rvcl9oYW5kbGUoZGlzc2VjdF9saG5iLCBwcm90b19saG5iKTsKKysKKysJZGlzc2VjdG9yX2FkZCgic2N0cC5wcGkiLCBMSE5CX1NDVFBfUFBJX01NLCBsaG5iX2hhbmRsZSk7CisrCWRpc3NlY3Rvcl9hZGQoInNjdHAucHBpIiwgTEhOQl9TQ1RQX1BQSV9HTU0sIGxobmJfaGFuZGxlKTsKKysJZGlzc2VjdG9yX2FkZCgic2N0cC5wb3J0IiwgTEhOQl9TQ1RQX1BPUlQsIGxobmJfaGFuZGxlKTsKKyt9CitJbmRleDogd2lyZXNoYXJrL2VwYW4vZGlzc2VjdG9ycy9NYWtlZmlsZS5jb21tb24KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLSB3aXJlc2hhcmsub3JpZy9lcGFuL2Rpc3NlY3RvcnMvTWFrZWZpbGUuY29tbW9uCisrKysgd2lyZXNoYXJrL2VwYW4vZGlzc2VjdG9ycy9NYWtlZmlsZS5jb21tb24KK0BAIC02MDUsNiArNjA1LDcgQEAKKyAJcGFja2V0LWxvb3AuYwkJXAorIAlwYWNrZXQtbHBkLmMJCVwKKyAJcGFja2V0LWxzYy5jCQlcCisrCXBhY2tldC1sdWNlbnRfaG5iLmMJXAorIAlwYWNrZXQtbHdhcHAuYwkJXAorIAlwYWNrZXQtbHdyZXMuYwkJXAorIAlwYWNrZXQtbTJwYS5jCQlcCmRpZmYgLS1naXQgYS93aXJlc2hhcmsvcnNsLWlwYWNjZXNzLnBhdGNoIGIvd2lyZXNoYXJrL3JzbC1pcGFjY2Vzcy5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTIyMGI4Ci0tLSAvZGV2L251bGwKKysrIGIvd2lyZXNoYXJrL3JzbC1pcGFjY2Vzcy5wYXRjaApAQCAtMCwwICsxLDY2NCBAQAorRnJvbSA4ZjM1ZDYyMzY0MWRiYmE5MGU2MTg2NjA0YzExZTg5MmJmNTE1ZWNjIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorRGF0ZTogTW9uLCAxOSBBcHIgMjAxMCAxMzozMjo1OCArMDgwMAorU3ViamVjdDogW1BBVENIIDIvMl0gUlNMIHBhdGNoCisKKy0tLQorIGVwYW4vZGlzc2VjdG9ycy9wYWNrZXQtcnNsLmMgfCAgNTIyICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLQorIDEgZmlsZXMgY2hhbmdlZCwgNTE1IGluc2VydGlvbnMoKyksIDcgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LXJzbC5jIGIvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1yc2wuYworaW5kZXggYjEwYTY3MS4uYTQ1NWNmMyAxMDA2NDQKKy0tLSBhL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtcnNsLmMKKysrKyBiL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtcnNsLmMKK0BAIC0yLDYgKzIsNyBAQAorICAqIFJvdXRpbmVzIGZvciBSYWRpbyBTaWduYWxsaW5nIExpbmsgKFJTTCkgZGlzc2VjdGlvbi4KKyAgKgorICAqIENvcHlyaWdodCAyMDA3LCBBbmRlcnMgQnJvbWFuIDxhbmRlcnMuYnJvbWFuQGVyaWNzc29uLmNvbT4KKysgKiBDb3B5cmlnaHQgMjAwOSwgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAgKgorICAqICRJZCQKKyAgKgorQEAgLTQyLDYgKzQzLDggQEAKKyAjaW5jbHVkZSA8ZXBhbi9sYXBkX3NhcGkuaD4KKyAKKyAjaW5jbHVkZSAicGFja2V0LWdzbV9hX2NvbW1vbi5oIgorKyNpbmNsdWRlICJwYWNrZXQtcnRwLmgiCisrI2luY2x1ZGUgInBhY2tldC1ydGNwLmgiCisgCisgLyogSW5pdGlhbGl6ZSB0aGUgcHJvdG9jb2wgYW5kIHJlZ2lzdGVyZWQgZmllbGRzICovCisgc3RhdGljIGludCBwcm90b19yc2wJCT0gLTE7CitAQCAtMTE1LDYgKzExOCwyNCBAQCBzdGF0aWMgaW50IGhmX3JzbF9lbWxwcF9wcmlvCQk9IC0xOworIHN0YXRpYyBpbnQgaGZfcnNsX3J0ZAkJCQk9IC0xOworIHN0YXRpYyBpbnQgaGZfcnNsX2RlbGF5X2luZAkJCT0gLTE7Cisgc3RhdGljIGludCBoZl9yc2xfdGZvCQkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfc3BlZWNoX21vZGVfcwkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfc3BlZWNoX21vZGVfbQkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfY29ubl9zdGF0CQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9jb25uX2lkCQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9ydHBfcGF5bG9hZAkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfcnRwX2NzZF9mbXRfZAkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfcnRwX2NzZF9mbXRfaXIJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfbG9jYWxfcG9ydAkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfcmVtb3RlX3BvcnQJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX2xvY2FsX2lwCQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9yZW1vdGVfaXAJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX2NzdGF0X3R4X3BrdHMJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX2NzdGF0X3R4X29jdHMJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX2NzdGF0X3J4X3BrdHMJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX2NzdGF0X3J4X29jdHMJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX2NzdGF0X2xvc3RfcGt0cwkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9jc3RhdF9pYV9qaXR0ZXIJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfY3N0YXRfYXZnX3R4X2RseQkJPSAtMTsKKyAKKyAvKiBJbml0aWFsaXplIHRoZSBzdWJ0cmVlIHBvaW50ZXJzICovCisgc3RhdGljIGludCBldHRfcnNsID0gLTE7CitAQCAtMTcyLDYgKzE5MywxNSBAQCBzdGF0aWMgaW50IGV0dF9pZV9jYXVzZSA9IC0xOworIHN0YXRpYyBpbnQgZXR0X2llX21lYXNfcmVzX25vID0gLTE7Cisgc3RhdGljIGludCBldHRfaWVfbWVzc2FnZV9pZCA9IC0xOworIHN0YXRpYyBpbnQgZXR0X2llX3N5c19pbmZvX3R5cGUgPSAtMTsKKytzdGF0aWMgaW50IGV0dF9pZV9zcGVlY2hfbW9kZSA9IC0xOworK3N0YXRpYyBpbnQgZXR0X2llX2Nvbm5fc3RhdCA9IC0xOworK3N0YXRpYyBpbnQgZXR0X2llX2Nvbm5faWQgPSAtMTsKKytzdGF0aWMgaW50IGV0dF9pZV9yZW1vdGVfaXAgPSAtMTsKKytzdGF0aWMgaW50IGV0dF9pZV9yZW1vdGVfcG9ydCA9IC0xOworK3N0YXRpYyBpbnQgZXR0X2llX2xvY2FsX3BvcnQgPSAtMTsKKytzdGF0aWMgaW50IGV0dF9pZV9sb2NhbF9pcCA9IC0xOworK3N0YXRpYyBpbnQgZXR0X2llX3J0cF9wYXlsb2FkID0gLTE7CisrCisgCisgcHJvdG9fdHJlZSAqdG9wX3RyZWU7CisgZGlzc2VjdG9yX2hhbmRsZV90IGdzbV9hX2NjY2hfaGFuZGxlOworQEAgLTIwNyw4ICsyMzcsMTEgQEAgc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyByc2xfbXNnX2Rpc2NfdmFsc1tdID0geworIAl7ICAweDA2LAkJIkNvbW1vbiBDaGFubmVsIE1hbmFnZW1lbnQgbWVzc2FnZXMiIH0sCisgCXsgIDB4MDgsCQkiVFJYIE1hbmFnZW1lbnQgbWVzc2FnZXMiIH0sCisgCXsgIDB4MTYsCQkiTG9jYXRpb24gU2VydmljZXMgbWVzc2FnZXMiIH0sCisrCXsgIDB4M2YsCQkiaXAuYWNjZXNzIFZlbmRvciBTcGVjaWZpYyBtZXNzYWdlcyIgfSwKKyAJeyAwLAkJCU5VTEwgfQorIH07CisrI2RlZmluZSBSU0xfTVNHRElTQ19JUEFDQ0VTUwkweDNmCisrCisgLyoKKyAgKiA5LjIgTUVTU0FHRSBUWVBFCisgICovCitAQCAtMjc1LDYgKzMwOCw0OSBAQCBzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIHJzbF9tc2dfZGlzY192YWxzW10gPSB7CisgCS8qIAkwIDEgLSAtIC0gLSAtIC0gTG9jYXRpb24gU2VydmljZXMgbWVzc2FnZXM6ICovCisgI2RlZmluZSBSU0xfTVNHX0xPQ19JTkYJCQkJCTY1CS8qIDguNy4xICovCisgCisrLyogVmVuZG9yLVNwZWNpZmljIG1lc3NhZ2VzIG9mIGlwLmFjY2VzcyBuYW5vQlRTLiBUaGVyZSBpcyBubyBwdWJsaWMgZG9jdW1lbnRhdGlvbgorKyAqIGFib3V0IHRob3NlIGV4dGVuc2lvbnMsIGFsbCBpbmZvcm1hdGlvbiBpbiB0aGlzIGRpc3NlY3RvciBpcyBiYXNlZCBvbiBsYXdmdWwKKysgKiBwcm90b2NvbCByZXZlcnNlIGVuZ2luZXJpbmcgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4gKi8KKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX01FQVNfUFBfREVGCTB4NjAKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX0hPX0NBTkRfSU5RCTB4NjEKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX0hPX0NBTkRfUkVTUAkweDYyCisrCisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0FDVAkweDQ4CisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0FDVF9BQ0sJMHg0OQorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfUERDSF9BQ1RfTkFDSwkweDRhCisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0RFQUNUCTB4NGIKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfREVBQ1RfQUNLIDB4NGMKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfREVBQ1RfTkFDSyAweDRkCisrCisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19DUkNYCQkweDcwCisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19DUkNYX0FDSwkweDcxCisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19DUkNYX05BQ0sJMHg3MgorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfTURDWAkJMHg3MworKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfTURDWF9BQ0sJMHg3NAorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfTURDWF9OQUNLCTB4NzUKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX0RMQ1hfSU5ECTB4NzYKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX0RMQ1gJCTB4NzcKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX0RMQ1hfQUNLCTB4NzgKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX0RMQ1hfTkFDSwkweDc5CisrCisrI2RlZmluZSBSU0xfSUVfSVBBQ19TUlRQX0NPTkZJRwkJMHhlMAorKyNkZWZpbmUgUlNMX0lFX0lQQUNfUFJPWFlfVURQCQkweGUxCisrI2RlZmluZSBSU0xfSUVfSVBBQ19CU0NNUExfVE9VVAkJMHhlMgorKyNkZWZpbmUgUlNMX0lFX0lQQUNfUkVNT1RFX0lQCQkweGYwCisrI2RlZmluZSBSU0xfSUVfSVBBQ19SRU1PVEVfUE9SVAkJMHhmMQorKyNkZWZpbmUgUlNMX0lFX0lQQUNfUlRQX1BBWUxPQUQJCTB4ZjIKKysjZGVmaW5lIFJTTF9JRV9JUEFDX0xPQ0FMX1BPUlQJCTB4ZjMKKysjZGVmaW5lIFJTTF9JRV9JUEFDX1NQRUVDSF9NT0RFCQkweGY0CisrI2RlZmluZSBSU0xfSUVfSVBBQ19MT0NBTF9JUAkJMHhmNQorKyNkZWZpbmUgUlNMX0lFX0lQQUNfQ09OTl9TVEFUCQkweGY2CisrI2RlZmluZSBSU0xfSUVfSVBBQ19IT19DX1BBUk1TCQkweGY3CisrI2RlZmluZSBSU0xfSUVfSVBBQ19DT05OX0lECQkweGY4CisrI2RlZmluZSBSU0xfSUVfSVBBQ19SVFBfQ1NEX0ZNVAkJMHhmOQorKyNkZWZpbmUgUlNMX0lFX0lQQUNfUlRQX0pJVF9CVUYJCTB4ZmEKKysjZGVmaW5lIFJTTF9JRV9JUEFDX1JUUF9DT01QUgkJMHhmYgorKyNkZWZpbmUgUlNMX0lFX0lQQUNfUlRQX1BBWUxPQUQyCTB4ZmMKKysjZGVmaW5lIFJTTF9JRV9JUEFDX1JUUF9NUExFWAkJMHhmZAorKyNkZWZpbmUgUlNMX0lFX0lQQUNfUlRQX01QTEVYX0lECTB4ZmUKKyAKKyBzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIHJzbF9tc2dfdHlwZV92YWxzW10gPSB7CisgCSAgLyogCTAgMCAwIDAgLSAtIC0gLSBSYWRpbyBMaW5rIExheWVyIE1hbmFnZW1lbnQgbWVzc2FnZXM6ICovCitAQCAtMzM3LDYgKzQxMywyNiBAQCBzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIHJzbF9tc2dfdHlwZV92YWxzW10gPSB7CisgCXsgIDB4M2YsCSJURk8gTU9EaWZpY2F0aW9uIFJFUXVlc3QiIH0sCQkJCQkvKiA4LjQuMzEgKi8KKyAJLyogCTAgMSAtIC0gLSAtIC0gLSBMb2NhdGlvbiBTZXJ2aWNlcyBtZXNzYWdlczogKi8KKyAJeyAgMHg0MSwJIkxvY2F0aW9uIEluZm9ybWF0aW9uIiB9LAkJCQkJCS8qIDguNy4xICovCisrCS8qIGlwLmFjY2VzcyAqLworKwl7ICAweDQ4LAkiaXAuYWNjZXNzIFBEQ0ggQUNUSVZBVElPTiIgfSwKKysJeyAgMHg0OSwJImlwLmFjY2VzcyBQRENIIEFDVElWQVRJT04gQUNLIiB9LAorKwl7ICAweDRhLAkiaXAuYWNjZXNzIFBEQ0ggQUNUSVZBVElPTiBOQUNLIiB9LAorKwl7ICAweDRiLAkiaXAuYWNjZXNzIFBEQ0ggREVBQ1RJVkFUSU9OIiB9LAorKwl7ICAweDRjLAkiaXAuYWNjZXNzIFBEQ0ggREVBQ1RJVkFUSU9OIEFDSyIgfSwKKysJeyAgMHg0ZCwJImlwLmFjY2VzcyBQRENIIERFQUNUSVZBVElPTiBOQUNLIiB9LAorKwl7ICAweDYwLAkiaXAuYWNjZXNzIE1FQVN1cmVtZW50IFBSRVBST0Nlc3NpbmcgRGVGYXVMVCIgfSwKKysJeyAgMHg2MSwJImlwLmFjY2VzcyBIQU5ET292ZXIgQ0FORGlkYXRlIEVOUXVpcnkiIH0sCisrCXsgIDB4NjIsCSJpcC5hY2Nlc3MgSEFORE9vdmVyIENBTkRpZGF0ZSBSRVNQb25zZSIgfSwKKysJeyAgMHg3MCwJImlwLmFjY2VzcyBDUkNYIiB9LAorKwl7ICAweDcxLAkiaXAuYWNjZXNzIENSQ1ggQUNLIiB9LAorKwl7ICAweDcyLAkiaXAuYWNjZXNzIENSQ1ggTkFDSyIgfSwKKysJeyAgMHg3MywJImlwLmFjY2VzcyBNRENYIiB9LAorKwl7ICAweDc0LAkiaXAuYWNjZXNzIE1EQ1ggQUNLIiB9LAorKwl7ICAweDc1LAkiaXAuYWNjZXNzIE1EQ1ggTkFDSyIgfSwKKysJeyAgMHg3NiwJImlwLmFjY2VzcyBETENYIElORGljYXRpb24iIH0sCisrCXsgIDB4NzcsCSJpcC5hY2Nlc3MgRExDWCIgfSwKKysJeyAgMHg3OCwJImlwLmFjY2VzcyBETENYIEFDSyIgfSwKKysJeyAgMHg3OSwJImlwLmFjY2VzcyBETENYIE5BQ0siIH0sCisgCXsgMCwJCU5VTEwgfQorIH07CisgCitAQCAtMzcwLDEwICs0NjYsMTAgQEAgc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyByc2xfbXNnX3R5cGVfdmFsc1tdID0geworICNkZWZpbmUgUlNMX0lFX01FU1NBR0VfSUQJCTI4CisgCisgI2RlZmluZSBSU0xfSUVfU1lTX0lORk9fVFlQRQkzMAorLQorLQorLQorLQorKyNkZWZpbmUgUlNMX0lFX01TX1BPV0VSX1BBUkFNCQkzMQorKyNkZWZpbmUgUlNMX0lFX0JTX1BPV0VSX1BBUkFNCQkzMgorKyNkZWZpbmUgUlNMX0lFX1BSRVBST0NfUEFSQU0JCTMzCisrI2RlZmluZSBSU0xfSUVfUFJFUFJPQ19NRUFTCQkzNAorICNkZWZpbmUgUlNMX0lFX0ZVTExfSU1NX0FTU19JTkYJCQkzNQorICNkZWZpbmUgUlNMX0lFX1NNU0NCX0lORgkJCQkzNgorICNkZWZpbmUgUlNMX0lFX0ZVTExfTVNfVElNSU5HX09GRlNFVAkzNworQEAgLTQ3Niw2ICs1NzIsMjQgQEAgc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyByc2xfaWVfdHlwZV92YWxzW10gPSB7CisgCQkJTm90IHVzZWQKKyAKKyAJKi8KKysJeyAweGUwLAkJIlNSVFAgQ29uZmlndXJhdGlvbiIgfSwKKysJeyAweGUxLAkJIkJTQyBQcm94eSBVRFAgUG9ydCIgfSwKKysJeyAweGUyLAkJIkJTQyBNdWx0aXBsZXggVGltZW91dCIgfSwKKysJeyAweGYwLAkJIlJlbW90ZSBJUCBBZGRyZXNzIiB9LAorKwl7IDB4ZjEsCQkiUmVtb3RlIFJUUCBQb3J0IiB9LAorKwl7IDB4ZjIsCQkiUlRQIFBheWxvYWQgVHlwZSIgfSwKKysJeyAweGYzLAkJIkxvY2FsIFJUUCBQb3J0IiB9LAorKwl7IDB4ZjQsCQkiU3BlZWNoIE1vZGUiIH0sCisrCXsgMHhmNSwJCSJMb2NhbCBJUCBBZGRyZXNzIiB9LAorKwl7IDB4ZjYsCQkiQ29ubmVjdGlvbiBTdGF0aXN0aWNzIiB9LAorKwl7IDB4ZjcsCQkiSGFuZG92ZXIgQyBQYXJhbWV0ZXJzIiB9LAorKwl7IDB4ZjgsCQkiQ29ubmVjdGlvbiBJZGVudGlmaWVyIiB9LAorKwl7IDB4ZjksCQkiUlRQIENTRCBGb3JtYXQiIH0sCisrCXsgMHhmYSwJCSJSVFAgSml0dGVyIEJ1ZmZlciIgfSwKKysJeyAweGZiLAkJIlJUUCBDb21wcmVzc2lvbiIgfSwKKysJeyAweGZjLAkJIlJUUCBQYXlsb2FkIFR5cGUgMiIgfSwKKysJeyAweGZkLAkJIlJUUCBNdWx0aXBsZXgiIH0sCisrCXsgMHhmZSwJCSJSVFAgTXVsdGlwbGV4IElkZW50aWZpZXIiIH0sCisgCXsgMCwJCQlOVUxMIH0KKyB9OworIAorQEAgLTUxMiw2ICs2MjYsOTYgQEAgc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyByc2xfY2hfbm9fQ2JpdHNfdmFsc1tdID0geworIAl7IDAsCQkJTlVMTCB9CisgfTsKKyAKKysvKiBGcm9tIG9wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3Rsdi5oICovCisrZW51bSB0bHZfdHlwZSB7CisrCVRMVl9UWVBFX0ZJWEVELAorKwlUTFZfVFlQRV9ULAorKwlUTFZfVFlQRV9UViwKKysJVExWX1RZUEVfVExWLAorKwlUTFZfVFlQRV9UTDE2ViwKKyt9OworKworK3N0cnVjdCB0bHZfZGVmIHsKKysJZW51bSB0bHZfdHlwZSB0eXBlOworKwl1X2ludDhfdCBmaXhlZF9sZW47CisrfTsKKysKKytzdHJ1Y3QgdGx2X2RlZmluaXRpb24geworKwlzdHJ1Y3QgdGx2X2RlZiBkZWZbMHhmZl07CisrfTsKKysKKytzdGF0aWMgY29uc3Qgc3RydWN0IHRsdl9kZWZpbml0aW9uIHJzbF9hdHRfdGx2ZGVmID0geworKwkuZGVmID0geworKwkJW1JTTF9JRV9DSF9OT10JCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfTElOS19JRF0JCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9BQ1RfVFlQRV0JCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9CU19QT1ddCQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX0NIX0lEXQkJCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfQ0hfTU9ERV0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfRU5DX0lORl0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfRlJBTUVfTk9dCQk9IHsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtSU0xfSUVfSE9fUkVGXQkJCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9MMV9JTkZdCQkJPSB7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbUlNMX0lFX0wzX0lORl0JCQk9IHsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtSU0xfSUVfTVNfSURdCQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9NU19QT1ddCQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX1BBR0lOR19HUlBdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfUEFHSU5HX0xPQURdCQk9IHsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtSU0xfSUVfUEhZX0NUWF0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfQUNDRVNTX0RFTEFZXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX1JBQ0hfTE9BRF0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfUkVRX1JFRl0JCT0geyBUTFZfVFlQRV9GSVhFRCwgMyB9LAorKwkJW1JTTF9JRV9SRUxfTU9ERV0JCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9SRVNPVVJDRV9JTkZdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX1JMTV9DQVVTRV0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfU1RBUlRJTkdfVElNRV0JCT0geyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW1JTTF9JRV9USU1JTkdfQURWXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX1VQTElOS19NRUFTXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9DQVVTRV0JCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX01FQVNfUkVTX05PXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX01FU1NBR0VfSURdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfU1lTX0lORk9fVFlQRV0JCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9NU19QT1dFUl9QQVJBTV0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfQlNfUE9XRVJfUEFSQU1dCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX1BSRVBST0NfUEFSQU1dCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX1BSRVBST0NfTUVBU10JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCS8vW1JTTF9JRV9JTU1fQVNTX0lORk9dCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQkvL1tSU0xfSUVfU01TQ0JfSU5GT10JCT0geyBUTFZfVFlQRV9GSVhFRCwgMjMgfSwKKysJCS8vW1JTTF9JRV9NU19USU1JTkdfT0ZGU0VUXQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfRVJSX01TR10JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfRlVMTF9CQ0NIX0lORl0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfQ0hfTkVFREVEXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX0NCX0NNRF9UWVBFXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX1NNU0NCX01FU1NdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0ZVTExfSU1NX0FTU19JTkZdCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCS8vW1JTTF9JRV9TQUNDSF9JTkZPXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9DQkNIX0xPQURfSU5GXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX1NNU0NCX0NIX0lORF0JCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9HUlBfQ0FMTF9SRUZdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0NIX0RFU0NdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX05DSF9EUlhfSU5GXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9DTURfSU5EXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9FTUxQUF9QUklPXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX1VJQ10JCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX01BSU5fQ0hfUkVGXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX01VTFRJUkFURV9DT05GXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9NVUxUSVJBVEVfQ05UUkxdCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9TVVBfQ09ERUNfVFlQRVNdCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfQ09ERUNfQ09ORl0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfUlREXQkJCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9URk9fU1RBVFVTXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX0xMUF9BUERVXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9JUEFDX1JFTU9URV9JUF0JCT0geyBUTFZfVFlQRV9GSVhFRCwgNCB9LAorKwkJW1JTTF9JRV9JUEFDX1JFTU9URV9QT1JUXQk9IHsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtSU0xfSUVfSVBBQ19MT0NBTF9JUF0JCT0geyBUTFZfVFlQRV9GSVhFRCwgNCB9LAorKwkJW1JTTF9JRV9JUEFDX0NPTk5fU1RBVF0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfSVBBQ19MT0NBTF9QT1JUXQk9IHsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtSU0xfSUVfSVBBQ19TUEVFQ0hfTU9ERV0JPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX0lQQUNfQ09OTl9JRF0JCT0geyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW1JTTF9JRV9JUEFDX1JUUF9QQVlMT0FEMl0JPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCX0sCisrfTsKKysKKyAvKiA5LjMuMSBDaGFubmVsIG51bWJlcgkJCTkuMy4xCU0gVFYgMiAqLworIHN0YXRpYyBpbnQKKyBkaXNzZWN0X3JzbF9pZV9jaF9ubyh0dmJ1ZmZfdCAqdHZiLCBwYWNrZXRfaW5mbyAqcGluZm8gX1VfLCBwcm90b190cmVlICp0cmVlLCBpbnQgb2Zmc2V0LCBnYm9vbGVhbiBpc19tYW5kYXRvcnkpCitAQCAtMjA0Miw3ICsyMjQ2LDYgQEAgZGlzc2VjdF9yc2xfaWVfZXJyX21zZyh0dmJ1ZmZfdCAqdHZiLCBwYWNrZXRfaW5mbyAqcGluZm8sIHByb3RvX3RyZWUgKnRyZWUsIGludAorIAlwcm90b19pdGVtX3NldF9sZW4odGksIGxlbmd0aCsyKTsKKyAKKyAJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfaWVfbGVuZ3RoLCB0dmIsIG9mZnNldCwgMSwgRkFMU0UpOworLQlvZmZzZXQrKzsKKyAKKyAJLyogUmVjZWl2ZWQgTWVzc2FnZSAqLworIAlvZmZzZXQgPSBkaXNzY3RfcnNsX21zZyh0dmIsIHBpbmZvLCBpZV90cmVlLCBvZmZzZXQpOworQEAgLTI5MDcsMTIgKzMxMTAsMTg0IEBAIGRpc3NlY3RfcnNsX2llX3Rmb190cmFuc3BfY29udCh0dmJ1ZmZfdCAqdHZiLCBwYWNrZXRfaW5mbyAqcGluZm8gX1VfLCBwcm90b190cmVlCisgfQorIAorIHN0YXRpYyBpbnQKKytkaXNzY3RfcnNsX2lwYWNjZXNzX21zZyh0dmJ1ZmZfdCAqdHZiLCBwYWNrZXRfaW5mbyAqcGluZm8sIHByb3RvX3RyZWUgKnRyZWUsCQkJCSAgICBpbnQgb2Zmc2V0KQorK3sKKysJZ3VpbnQ4IG1zZ190eXBlOworKwlndWludDMyIGxvY2FsX2FkZHIgPSAwOworKwlndWludDE2IGxvY2FsX3BvcnQgPSAwOworKwlhZGRyZXNzIHNyY19hZGRyOworKworKwltc2dfdHlwZSA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KSYweDdmOworKwlvZmZzZXQrKzsKKysKKysjaWYgMAorKwlzd2l0Y2ggKG1zZ190eXBlKSB7CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfQ1JDWDoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19DUkNYX0FDSzoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19DUkNYX05BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfTURDWDoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19NRENYX0FDSzoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19NRENYX05BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfRExDWF9JTkQ6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfRExDWDoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19ETENYX0FDSzoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19ETENYX05BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9BQ1Q6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9BQ1RfQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfQUNUX05BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9ERUFDVDoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0RFQUNUX0FDSzoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0RFQUNUX05BQ0s6CisrCQkvKiBDaGFubmVsIG51bWJlcgkJCTkuMy4xCU0gVFYgMgkJKi8KKysJCW9mZnNldCA9IGRpc3NlY3RfcnNsX2llX2NoX25vKHR2YiwgcGluZm8sIHRyZWUsIG9mZnNldCwgVFJVRSk7CisrCQlicmVhazsKKysJfQorKyNlbmRpZgorKwkvKiBwYXJzZSBUTFYgYXR0cmlidXRlcyAqLworKwl3aGlsZSAodHZiX3JlcG9ydGVkX2xlbmd0aF9yZW1haW5pbmcodHZiLCBvZmZzZXQpICE9IDApIHsKKysJCWd1aW50OCB0YWc7CisrCQl1bnNpZ25lZCBpbnQgbGVuLCBobGVuLCBsZW5fbGVuOworKwkJY29uc3Qgc3RydWN0IHRsdl9kZWYgKnRkZWY7CisrCQlwcm90b19pdGVtICp0aTsKKysJCXByb3RvX3RyZWUgKmllX3RyZWU7CisrCisrCQl0YWcgPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCk7CisrCQl0ZGVmID0gJnJzbF9hdHRfdGx2ZGVmLmRlZlt0YWddOworKworKwkJc3dpdGNoICh0ZGVmLT50eXBlKSB7CisrCQljYXNlIFRMVl9UWVBFX0ZJWEVEOgorKwkJCWhsZW4gPSAxOworKwkJCWxlbl9sZW4gPSAwOworKwkJCWxlbiA9IHRkZWYtPmZpeGVkX2xlbjsKKysJCQlicmVhazsKKysJCWNhc2UgVExWX1RZUEVfVDoKKysJCQlobGVuID0gMTsKKysJCQlsZW5fbGVuID0gMDsKKysJCQlsZW4gPSAwOworKwkJCWJyZWFrOworKwkJY2FzZSBUTFZfVFlQRV9UVjoKKysJCQlobGVuID0gMTsKKysJCQlsZW5fbGVuID0gMDsKKysJCQlsZW4gPSAxOworKwkJCWJyZWFrOworKwkJY2FzZSBUTFZfVFlQRV9UTFY6CisrCQkJaGxlbiA9IDI7CisrCQkJbGVuX2xlbiA9IDE7CisrCQkJbGVuID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQrMSk7CisrCQkJYnJlYWs7CisrCQljYXNlIFRMVl9UWVBFX1RMMTZWOgorKwkJCWhsZW4gPSAzOworKwkJCWxlbl9sZW4gPSAyOworKwkJCWxlbiA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzEpIDw8IDggfAorKwkJCQkJdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQrMik7CisrCQkJYnJlYWs7CisrCQlkZWZhdWx0OgorKwkJCWhsZW4gPSBsZW5fbGVuID0gbGVuID0gMDsKKysJCQlESVNTRUNUT1JfQVNTRVJUX05PVF9SRUFDSEVEKCk7CisrCQkJYnJlYWs7CisrCQl9CisrCisrCQl0aSA9IHByb3RvX3RyZWVfYWRkX2l0ZW0odHJlZSwgaGZfcnNsX2llX2lkLCB0dmIsIG9mZnNldCwgMSwgRkFMU0UpOworKwkJaWVfdHJlZSA9IHByb3RvX2l0ZW1fYWRkX3N1YnRyZWUodGksIGV0dF9pZV9sb2NhbF9wb3J0KTsKKysJCW9mZnNldCArPSBobGVuOworKworKwkJc3dpdGNoICh0YWcpIHsKKysJCWNhc2UgUlNMX0lFX0NIX05POgorKwkJCWRpc3NlY3RfcnNsX2llX2NoX25vKHR2YiwgcGluZm8sIGllX3RyZWUsIG9mZnNldCwgRkFMU0UpOworKwkJCWJyZWFrOworKwkJY2FzZSBSU0xfSUVfRlJBTUVfTk86CisrCQkJZGlzc2VjdF9yc2xfaWVfZnJhbWVfbm8odHZiLCBwaW5mbywgaWVfdHJlZSwgb2Zmc2V0LCBGQUxTRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIFJTTF9JRV9NU19QT1c6CisrCQkJZGlzc2VjdF9yc2xfaWVfbXNfcG93KHR2YiwgcGluZm8sIGllX3RyZWUsIG9mZnNldCwgRkFMU0UpOworKwkJCWJyZWFrOworKwkJY2FzZSBSU0xfSUVfSVBBQ19SRU1PVEVfSVA6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfcmVtb3RlX2lwLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQlicmVhazsKKysJCWNhc2UgUlNMX0lFX0lQQUNfUkVNT1RFX1BPUlQ6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfcmVtb3RlX3BvcnQsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCWJyZWFrOworKwkJY2FzZSBSU0xfSUVfSVBBQ19MT0NBTF9JUDoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9sb2NhbF9pcCwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQkJbG9jYWxfYWRkciA9IHR2Yl9nZXRfaXB2NCh0dmIsIG9mZnNldCk7CisrCQkJYnJlYWs7CisrCQljYXNlIFJTTF9JRV9JUEFDX0xPQ0FMX1BPUlQ6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfbG9jYWxfcG9ydCwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQkJbG9jYWxfcG9ydCA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQpOworKwkJCWJyZWFrOworKwkJY2FzZSBSU0xfSUVfSVBBQ19TUEVFQ0hfTU9ERToKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9zcGVlY2hfbW9kZV9zLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9zcGVlY2hfbW9kZV9tLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQlicmVhazsKKysJCWNhc2UgUlNMX0lFX0lQQUNfUlRQX1BBWUxPQUQ6CisrCQljYXNlIFJTTF9JRV9JUEFDX1JUUF9QQVlMT0FEMjoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9ydHBfcGF5bG9hZCwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIFJTTF9JRV9JUEFDX1JUUF9DU0RfRk1UOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX3J0cF9jc2RfZm10X2QsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX3J0cF9jc2RfZm10X2lyLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQlicmVhazsKKysJCWNhc2UgUlNMX0lFX0lQQUNfQ09OTl9JRDoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9jb25uX2lkLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQlicmVhazsKKysJCWNhc2UgUlNMX0lFX0lQQUNfQ09OTl9TVEFUOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX2NzdGF0X3R4X3BrdHMsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIDQsIEZBTFNFKTsKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9jc3RhdF90eF9vY3RzLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0KzQsIDQsIEZBTFNFKTsKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9jc3RhdF9yeF9wa3RzLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0KzgsIDQsIEZBTFNFKTsKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9jc3RhdF9yeF9vY3RzLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0KzEyLCA0LCBGQUxTRSk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfY3N0YXRfbG9zdF9wa3RzLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0KzE2LCA0LCBGQUxTRSk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfY3N0YXRfaWFfaml0dGVyLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0KzIwLCA0LCBGQUxTRSk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfY3N0YXRfYXZnX3R4X2RseSwgdHZiLAorKwkJCQkJICAgIG9mZnNldCsyNCwgNCwgRkFMU0UpOworKwkJCWJyZWFrOworKwkJfQorKwkJb2Zmc2V0ICs9IGxlbjsKKysJfQorKworKwlzd2l0Y2ggKG1zZ190eXBlKSB7CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfQ1JDWF9BQ0s6CisrCQkvKiBOb3RpZnkgdGhlIFJUUCBhbmQgUlRDUCBkaXNzZWN0b3JzIGFib3V0IGEgbmV3IFJUUCBzdHJlYW0gKi8KKysJCXNyY19hZGRyLnR5cGUgPSBBVF9JUHY0OworKwkJc3JjX2FkZHIubGVuID0gNDsKKysJCXNyY19hZGRyLmRhdGEgPSAoZ3VpbnQ4ICopJmxvY2FsX2FkZHI7CisrCQlydHBfYWRkX2FkZHJlc3MocGluZm8sICZzcmNfYWRkciwgbG9jYWxfcG9ydCwgMCwKKysJCQkJIkdTTSBBLWJpcy9JUCIsIHBpbmZvLT5mZC0+bnVtLCAwLCBOVUxMKTsKKysJCXJ0Y3BfYWRkX2FkZHJlc3MocGluZm8sICZzcmNfYWRkciwgbG9jYWxfcG9ydCsxLCAwLAorKwkJCQkgIkdTTSBBLWJpcy9JUCIsIHBpbmZvLT5mZC0+bnVtKTsKKysJCWJyZWFrOworKwl9CisrCXJldHVybiBvZmZzZXQ7CisrfQorKworK3N0YXRpYyBpbnQKKyBkaXNzY3RfcnNsX21zZyh0dmJ1ZmZfdCAqdHZiLCBwYWNrZXRfaW5mbyAqcGluZm8sIHByb3RvX3RyZWUgKnRyZWUsIGludCBvZmZzZXQpCisgeworLQlndWludDgJbXNnX3R5cGU7CisrCWd1aW50OAltc2dfZGlzYywgbXNnX3R5cGU7CisgCisrCW1zZ19kaXNjID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQrKykgPj4gMTsKKyAJbXNnX3R5cGUgPSB0dmJfZ2V0X2d1aW50OCh0dmIsb2Zmc2V0KSYweDdmOworIAlwcm90b190cmVlX2FkZF9pdGVtKHRyZWUsIGhmX3JzbF9tc2dfdHlwZSwgdHZiLCBvZmZzZXQsIDEsIEZBTFNFKTsKKysKKysJaWYgKG1zZ19kaXNjID09IFJTTF9NU0dESVNDX0lQQUNDRVNTKSB7CisrCQlvZmZzZXQgPSBkaXNzY3RfcnNsX2lwYWNjZXNzX21zZyh0dmIsIHBpbmZvLCB0cmVlLCBvZmZzZXQpOworKwkJcmV0dXJuIG9mZnNldDsKKysJfQorIAlvZmZzZXQrKzsKKyAKKyAJc3dpdGNoIChtc2dfdHlwZSl7CitAQCAtMzQ4MCw2ICszODU1LDE4IEBAIGRpc3NjdF9yc2xfbXNnKHR2YnVmZl90ICp0dmIsIHBhY2tldF9pbmZvICpwaW5mbywgcHJvdG9fdHJlZSAqdHJlZSwgaW50IG9mZnNldCkKKyAJCS8qIExMUCBBUERVIDkuMy41OCBNIExWIDItTiAqLworIAkJb2Zmc2V0ID0gZGlzc2VjdF9yc2xfaWVfbGxwX2FwZHUodHZiLCBwaW5mbywgdHJlZSwgb2Zmc2V0LCBUUlVFKTsKKyAJCWJyZWFrOworKwkvKiB0aGUgZm9sbG93aW5nIG1lc3NhZ2VzIGFyZSBpcC5hY2Nlc3Mgc3BlY2lmaWMgYnV0IHNlbnQgd2l0aG91dAorKwkgKiBpcC5hY2Nlc3MgbWVtc3NhZ2UgZGlzY3JpbWluYXRvciAqLworKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX01FQVNfUFBfREVGOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX0hPX0NBTkRfSU5ROgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX0hPX0NBTkRfUkVTUDoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0FDVDoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0FDVF9BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9BQ1RfTkFDSzoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0RFQUNUOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfREVBQ1RfQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfREVBQ1RfTkFDSzoKKysJCW9mZnNldCA9IGRpc3NjdF9yc2xfaXBhY2Nlc3NfbXNnKHR2YiwgcGluZm8sIHRyZWUsIG9mZnNldC0xKTsKKyAJZGVmYXVsdDoKKyAJCWJyZWFrOworIAl9CitAQCAtMzQ4Nyw2ICszODc0LDQwIEBAIGRpc3NjdF9yc2xfbXNnKHR2YnVmZl90ICp0dmIsIHBhY2tldF9pbmZvICpwaW5mbywgcHJvdG9fdHJlZSAqdHJlZSwgaW50IG9mZnNldCkKKyAJcmV0dXJuIG9mZnNldDsKKyAKKyB9CisrCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyByc2xfaXBhY2Nfc3BtX3NfdmFsc1tdID0geworKwl7IDAsCSJHU00gRlIgY29kZWMgKEdTTSB0eXBlIDEsIEZTKSIgfSwKKysJeyAxLAkiR1NNIEVGUiBjb2RlYyAoR1NNIHR5cGUgMiwgRlMpIiB9LAorKwl7IDIsIAkiR1NNIEFNUi9GUiBjb2RlYyAoR1NNIHR5cGUgMywgRlMpIiB9LAorKwl7IDMsCSJHU00gSFIgY29kZWMgKEdTTSB0eXBlIDEsIEhTKSIgfSwKKysJeyA1LAkiR1NNIEFNUi9IUiBjb2RlYyAoR1NNIHR5cGUgMywgSFMpIiB9LAorKwl7IDB4ZiwJIkFzIHNwZWNpZmllZCBieSBSVFAgUGF5bG9hZCBUeXBlIElFIiB9LAorKwl7IDAsCU5VTEwgfQorK307CisrCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyByc2xfaXBhY2Nfc3BtX21fdmFsc1tdID0geworKwl7IDAsCSJTZW5kIGFuZCBSZWNlaXZlIiB9LAorKwl7IDEsCSJSZWNlaXZlIE9ubHkiIH0sCisrCXsgMiwJIlNlbmQgT25seSIgfSwKKysJeyAwLCAJTlVMTCB9CisrfTsKKysKKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIHJzbF9pcGFjY19ydHBfY3NkX2ZtdF9kX3ZhbHNbXSA9IHsKKysJeyAwLAkiRXh0ZXJuYWwgVFJBVSBmb3JtYXQiIH0sCisrCXsgMSwJIk5vbi1UUkFVIFBhY2tlZCBmb3JtYXQiIH0sCisrCXsgMiwJIlRSQVUgd2l0aGluIHRoZSBCVFMiIH0sCisrCXsgMywJIklXRi1GcmVlIEJUUy1CVFMgRGF0YSIgfSwKKysJeyAwLCAJTlVMTCB9CisrfTsKKysKKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIHJzbF9pcGFjY19ydHBfY3NkX2ZtdF9pcl92YWxzW10gPSB7CisrCXsgMCwJIjhrYi9zIiB9LAorKwl7IDEsCSIxNmtiL3MiIH0sCisrCXsgMiwJIjMya2IvcyIgfSwKKysJeyAzLAkiNjRrYi9zIiB9LAorKwl7IDAsCU5VTEwgfQorK307CisrCisgc3RhdGljIHZvaWQKKyBkaXNzZWN0X3JzbCh0dmJ1ZmZfdCAqdHZiLCBwYWNrZXRfaW5mbyAqcGluZm8sIHByb3RvX3RyZWUgKnRyZWUpCisgeworQEAgLTM1MTQsNyArMzkzNSw2IEBAIGRpc3NlY3RfcnNsKHR2YnVmZl90ICp0dmIsIHBhY2tldF9pbmZvICpwaW5mbywgcHJvdG9fdHJlZSAqdHJlZSkKKyAJCS8qIDkuMSBNZXNzYWdlIGRpc2NyaW1pbmF0b3IgKi8KKyAJCXByb3RvX3RyZWVfYWRkX2l0ZW0ocnNsX3RyZWUsIGhmX3JzbF9tc2dfZHNjLCB0dmIsIG9mZnNldCwgMSwgRkFMU0UpOworIAkJcHJvdG9fdHJlZV9hZGRfaXRlbShyc2xfdHJlZSwgaGZfcnNsX1RfYml0LCB0dmIsIG9mZnNldCwgMSwgRkFMU0UpOworLQkJb2Zmc2V0Kys7CisgCisgCQlvZmZzZXQgPSBkaXNzY3RfcnNsX21zZyh0dmIsIHBpbmZvLCByc2xfdHJlZSwgb2Zmc2V0KTsKKyAKK0BAIC0zODg0LDYgKzQzMDQsODYgQEAgdm9pZCBwcm90b19yZWdpc3Rlcl9yc2wodm9pZCkKKyAJCQlGVF9VSU5UOCwgQkFTRV9ERUMsIFZBTFMocnNsX2VtbHBwX3ByaW9fdmFscyksIDB4MDMsCisgCQkJTlVMTCwgSEZJTEwgfQorIAkJfSwKKysJCXsgJmhmX3JzbF9zcGVlY2hfbW9kZV9zLAorKwkJCXsgImlwLmFjY2VzcyBTcGVlY2ggTW9kZSBTIiwgInJzbC5pcGFjYy5zcGVlY2hfbW9kZV9zIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhyc2xfaXBhY2Nfc3BtX3NfdmFscyksCisrCQkJICAweGYsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9yc2xfc3BlZWNoX21vZGVfbSwKKysJCQl7ICJpcC5hY2Nlc3MgU3BlZWNoIE1vZGUgTSIsICJyc2wuaXBhY2Muc3BlZWNoX21vZGVfbSIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMocnNsX2lwYWNjX3NwbV9tX3ZhbHMpLAorKwkJCSAgMHhmMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX3JzbF9jb25uX3N0YXQsCisrCQkJeyAiaXAuYWNjZXNzIENvbm5lY3Rpb24gU3RhdGlzdGljcyIsInJzbC5pcGFjYy5jb25uX3N0YXQiLAorKwkJCSAgRlRfQllURVMsIEJBU0VfTk9ORSwgTlVMTCwgMHgwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfcnNsX2Nvbm5faWQsCisrCQkJeyAiaXAuYWNjZXNzIENvbm5lY3Rpb24gSUQiLAkicnNsLmlwYWNjLmNvbm5faWQiLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMHgwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfcnNsX3J0cF9wYXlsb2FkLAorKwkJCXsgImlwLmFjY2VzcyBSVFAgUGF5bG9hZCBUeXBlIiwJInJzbC5pcGFjYy5ydHBfcGF5bG9hZCIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9ERUMsIE5VTEwsIDB4MCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX3JzbF9ydHBfY3NkX2ZtdF9kLAorKwkJCXsgImlwLmFjY2VzcyBSVFAgQ1NEIEZvcm1hdCBEIiwgInJzbC5pcGFjYy5ydHBfY3NkX2ZtdF9kIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhyc2xfaXBhY2NfcnRwX2NzZF9mbXRfZF92YWxzKSwKKysJCQkgIDB4MGYsIE5VTEwsIEhGSUxMIH0sCisrCQl9LAorKwkJeyAmaGZfcnNsX3J0cF9jc2RfZm10X2lyLAorKwkJCXsgImlwLmFjY2VzcyBSVFAgQ1NEIEZvcm1hdCBJUiIsICJyc2wuaXBhY2MucnRwX2NzZF9mbXRfaXIiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKHJzbF9pcGFjY19ydHBfY3NkX2ZtdF9pcl92YWxzKSwKKysJCQkgIDB4ZjAsIE5VTEwsIEhGSUxMIH0sCisrCQl9LAorKwkJeyAmaGZfcnNsX2xvY2FsX3BvcnQsCisrCQkJeyAiaXAuYWNjZXNzIExvY2FsIFJUUCBQb3J0IiwJInJzbC5pcGFjYy5sb2NhbF9wb3J0IiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDB4MCwKKysJCQkgICJpcC5hY2Nlc3MgTG9jYWwgUlRQIFBvcnQiLCBIRklMTCB9LAorKwkJfSwKKysJCXsgJmhmX3JzbF9yZW1vdGVfcG9ydCwKKysJCQl7ICJpcC5hY2Nlc3MgUmVtb3RlIFJUUCBQb3J0IiwJInJzbC5pcGFjYy5yZW1vdGVfcG9ydCIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAweDAsCisrCQkJICAiaXAuYWNjZXNzIFJlbW90ZSBSVFAgUG9ydCIsIEhGSUxMIH0sCisrCQl9LAorKwkJeyAmaGZfcnNsX2xvY2FsX2lwLAorKwkJCXsgImlwLmFjY2VzcyBMb2NhbCBJUCBBZGRyZXNzIiwJInJzbC5pcGFjYy5sb2NhbF9pcCIsCisrCQkJICBGVF9JUHY0LCBCQVNFX05PTkUsIE5VTEwsIDB4MCwKKysJCQkgICJpcC5hY2Nlc3MgTG9jYWwgSVAgQWRkcmVzcyIsIEhGSUxMIH0sCisrCQl9LAorKwkJeyAmaGZfcnNsX3JlbW90ZV9pcCwKKysJCQl7ICJpcC5hY2Nlc3MgUmVtb3RlIElQIEFkZHJlc3MiLCAicnNsLmlwYWNjLnJlbW90ZV9pcCIsCisrCQkJICBGVF9JUHY0LCBCQVNFX05PTkUsIE5VTEwsIDB4MCwKKysJCQkgICJpcC5hY2Nlc3MgUmVtb3RlIElQIEFkZHJlc3MiLCBIRklMTCB9LAorKwkJfSwKKysJCXsgJmhmX3JzbF9jc3RhdF90eF9wa3RzLAorKwkJCXsgIlBhY2tldHMgU2VudCIsICJyc2wuaXBhY2MuY3N0YXQudHhfcGt0cyIsCisrCQkJICBGVF9VSU5UMzIsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfcnNsX2NzdGF0X3R4X29jdHMsCisrCQkJeyAiT2N0ZXRzIFNlbnQiLCAicnNsLmlwYWNjLmNzdGF0LnR4X29jdGV0cyIsCisrCQkJICBGVF9VSU5UMzIsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfcnNsX2NzdGF0X3J4X3BrdHMsCisrCQkJeyAiUGFja2V0cyBSZWNlaXZlZCIsICJyc2wuaXBhY2MuY3N0YXQucnhfcGt0cyIsCisrCQkJICBGVF9VSU5UMzIsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfcnNsX2NzdGF0X3J4X29jdHMsCisrCQkJeyAiT2N0ZXRzIFJlY2VpdmVkIiwgInJzbC5pcGFjYy5jc3RhdC5yeF9vY3RldHMiLAorKwkJCSAgRlRfVUlOVDMyLCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX3JzbF9jc3RhdF9sb3N0X3BrdHMsCisrCQkJeyAiUGFja2V0cyBMb3N0IiwgInJzbC5pcGFjYy5jc3RhdC5sb3N0X3BrdHMiLAorKwkJCSAgRlRfVUlOVDMyLCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX3JzbF9jc3RhdF9pYV9qaXR0ZXIsCisrCQkJeyAiSW50ZXItYXJyaXZhbCBKaXR0ZXIiLCAicnNsLmlwYWNjLmNzdGF0LmlhX2ppdHRlciIsCisrCQkJICBGVF9VSU5UMzIsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfcnNsX2NzdGF0X2F2Z190eF9kbHksCisrCQkJeyAiQXZlcmFnZSBUeCBEZWxheSIsICJyc2wuaXBhY2MuY3N0YXQuYXZnX3R4X2RlbGF5IiwKKysJCQkgIEZUX1VJTlQzMiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisgCX07CisgCXN0YXRpYyBnaW50ICpldHRbXSA9IHsKKyAJCSZldHRfcnNsLAorQEAgLTM5NDEsNiArNDQ0MSwxNCBAQCB2b2lkIHByb3RvX3JlZ2lzdGVyX3JzbCh2b2lkKQorIAkJJmV0dF9pZV9tZWFzX3Jlc19ubywKKyAJCSZldHRfaWVfbWVzc2FnZV9pZCwKKyAJCSZldHRfaWVfc3lzX2luZm9fdHlwZSwKKysJCSZldHRfaWVfc3BlZWNoX21vZGUsCisrCQkmZXR0X2llX2Nvbm5fc3RhdCwKKysJCSZldHRfaWVfY29ubl9pZCwKKysJCSZldHRfaWVfcmVtb3RlX2lwLAorKwkJJmV0dF9pZV9yZW1vdGVfcG9ydCwKKysJCSZldHRfaWVfbG9jYWxfcG9ydCwKKysJCSZldHRfaWVfbG9jYWxfaXAsCisrCQkmZXR0X2llX3J0cF9wYXlsb2FkLAorIAl9OworIAorIAkvKiBSZWdpc3RlciB0aGUgcHJvdG9jb2wgbmFtZSBhbmQgZGVzY3JpcHRpb24gKi8KKy0tIAorMS43LjAuMQorCmRpZmYgLS1naXQgYS93aXJlc2hhcmsvcnNsLXN5c3RlbV9pbmZvLnBhdGNoIGIvd2lyZXNoYXJrL3JzbC1zeXN0ZW1faW5mby5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTQ1YzY1Ci0tLSAvZGV2L251bGwKKysrIGIvd2lyZXNoYXJrL3JzbC1zeXN0ZW1faW5mby5wYXRjaApAQCAtMCwwICsxLDEzIEBACitJbmRleDogd2lyZXNoYXJrL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtcnNsLmMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLSB3aXJlc2hhcmsub3JpZy9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LXJzbC5jCisrKysgd2lyZXNoYXJrL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtcnNsLmMKK0BAIC0yMjkxLDcgKzIyOTEsNyBAQAorIAorIAlwcm90b190cmVlX2FkZF90ZXh0KGllX3RyZWUsIHR2YixvZmZzZXQsbGVuZ3RoLCJMYXllciAzIG1lc3NhZ2UiKTsKKyAJbmV4dF90dmIgPSB0dmJfbmV3X3N1YnNldCh0dmIsIG9mZnNldCwgbGVuZ3RoLCBsZW5ndGgpOworLQkvKiBjYWxsX2Rpc3NlY3Rvcihnc21fYV9kdGFwX2hhbmRsZSwgbmV4dF90dmIsIHBpbmZvLCB0b3BfdHJlZSk7Ki8KKysJY2FsbF9kaXNzZWN0b3IoZ3NtX2FfY2NjaF9oYW5kbGUsIG5leHRfdHZiLCBwaW5mbywgdG9wX3RyZWUpOworIAorIAlvZmZzZXQgPSBvZmZzZXQgKyBsZW5ndGg7CisgCg==