ZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9LY29uZmlnIGIvZHJpdmVycy91c2IvZ2FkZ2V0L0tjb25maWcKaW5kZXggMDU3Njg4OC4uNzRlYWE3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L0tjb25maWcKQEAgLTIwOCw2ICsyMDgsMjcgQEAKIAogCSAgIFNlbGVjdCB0aGlzIG9ubHkgaWYgeW91ciBPTUFQIGJvYXJkIGhhcyBhIE1pbmktQUIgY29ubmVjdG9yLgogCitjb25maWcgVVNCX0dBREdFVF9TM0MyNDEwCisJYm9vbGVhbiAiUzNDMjQxMCBVU0IgRGV2aWNlIENvbnRyb2xsZXIiCisJZGVwZW5kcyBvbiBBUkNIX1MzQzI0MTAKKwloZWxwCisJICBTYW1zdW5nJ3MgUzNDMjQxMCBpcyBhbiBBUk0tNCBwcm9jZXNzb3Igd2l0aCBhbiBpbnRlZ3JhdGVkCisJICBmdWxsIHNwZWVkIFVTQiAxLjEgZGV2aWNlIGNvbnRyb2xsZXIuICBJdCBoYXMgNCBjb25maWd1cmFibGUKKwkgIGVuZHBvaW50cywgYXMgd2VsbCBhcyBlbmRwb2ludCB6ZXJvIChmb3IgY29udHJvbCB0cmFuc2ZlcnMpLgorCisJICBUaGlzIGRyaXZlciBoYXMgYmVlbiB0ZXN0ZWQgb24gdGhlIFMzQzI0MTAsIFMzQzI0MTIsIGFuZAorCSAgUzNDMjQ0MCBwcm9jZXNzb3JzLgorCitjb25maWcgVVNCX1MzQzI0MTAKKwl0cmlzdGF0ZQorCWRlcGVuZHMgb24gVVNCX0dBREdFVF9TM0MyNDEwCisJZGVmYXVsdCBVU0JfR0FER0VUCisJc2VsZWN0IFVTQl9HQURHRVRfU0VMRUNURUQKKworY29uZmlnIFVTQl9TM0MyNDEwX0RFQlVHCisJYm9vbGVhbiAiUzNDMjQxMCB1ZGMgZGVidWcgbWVzc2FnZXMiCisJZGVwZW5kcyBvbiBVU0JfR0FER0VUX1MzQzI0MTAKKwogY29uZmlnIFVTQl9HQURHRVRfQVQ5MQogCWJvb2xlYW4gIkFUOTEgVVNCIERldmljZSBQb3J0IgogCWRlcGVuZHMgb24gQVJDSF9BVDkxICYmICFBUkNIX0FUOTFTQU05UkwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL2dhZGdldC9NYWtlZmlsZQppbmRleCAyZDQxZTg0Li5iZmYyNzgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L01ha2VmaWxlCkBAIC03LDYgKzcsNyBAQAogb2JqLSQoQ09ORklHX1VTQl9HT0tVKQkJKz0gZ29rdV91ZGMubwogb2JqLSQoQ09ORklHX1VTQl9PTUFQKQkJKz0gb21hcF91ZGMubwogb2JqLSQoQ09ORklHX1VTQl9MSDdBNDBYKQkrPSBsaDdhNDB4X3VkYy5vCitvYmotJChDT05GSUdfVVNCX1MzQzI0MTApCSs9IHMzYzI0MTBfdWRjLm8KIG9iai0kKENPTkZJR19VU0JfQVQ5MSkJCSs9IGF0OTFfdWRjLm8KIG9iai0kKENPTkZJR19VU0JfRlNMX1VTQjIpCSs9IGZzbF91c2IyX3VkYy5vCiBvYmotJChDT05GSUdfVVNCX002NjU5MikJKz0gbTY2NTkyLXVkYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvczNjMjQxMF91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9zM2MyNDEwX3VkYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MDc0OGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvczNjMjQxMF91ZGMuYwpAQCAtMCwwICsxLDIwNzggQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL3VzYi9nYWRnZXQvczNjMjQxMF91ZGMuYworICoKKyAqIFNhbXN1bmcgUzNDMjR4eCBzZXJpZXMgb24tY2hpcCBmdWxsIHNwZWVkIFVTQiBkZXZpY2UgY29udHJvbGxlcnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBIZXJiZXJ0IFD2dHpsIC0gQXJuYXVkIFBhdGFyZAorICoJQWRkaXRpb25hbCBjbGVhbnVwcyBieSBCZW4gRG9va3MgPGJlbi1saW51eEBmbHVmZi5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKworI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorCisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvdXNiX2dhZGdldC5oPgorCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2lycXMuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1jbG9jay5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtdWRjLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvdWRjLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCisjaW5jbHVkZSAiczNjMjQxMF91ZGMuaCIKKworI2RlZmluZSBEUklWRVJfREVTQwkiUzNDMjQxMCBVU0IgRGV2aWNlIENvbnRyb2xsZXIgR2FkZ2V0IgorI2RlZmluZSBEUklWRVJfVkVSU0lPTgkiMjkgQXByIDIwMDciCisjZGVmaW5lIERSSVZFUl9BVVRIT1IJIkhlcmJlcnQgUPZ0emwgPGhlcmJlcnRAMTN0aGZsb29yLmF0PiwgIiBcCisJCQkiQXJuYXVkIFBhdGFyZCA8YXJuYXVkLnBhdGFyZEBydHAtbmV0Lm9yZz4iCisKK3N0YXRpYyBjb25zdCBjaGFyCQlnYWRnZXRfbmFtZVtdID0gInMzYzI0MTBfdWRjIjsKK3N0YXRpYyBjb25zdCBjaGFyCQlkcml2ZXJfZGVzY1tdID0gRFJJVkVSX0RFU0M7CisKK3N0YXRpYyBzdHJ1Y3QgczNjMjQxMF91ZGMJKnRoZV9jb250cm9sbGVyOworc3RhdGljIHN0cnVjdCBjbGsJCSp1ZGNfY2xvY2s7CitzdGF0aWMgc3RydWN0IGNsawkJKnVzYl9idXNfY2xvY2s7CitzdGF0aWMgdm9pZCBfX2lvbWVtCQkqYmFzZV9hZGRyOworc3RhdGljIHU2NAkJCXJzcmNfc3RhcnQ7CitzdGF0aWMgdTY0CQkJcnNyY19sZW47CitzdGF0aWMgc3RydWN0IGRlbnRyeQkJKnMzYzI0MTBfdWRjX2RlYnVnZnNfcm9vdDsKKworc3RhdGljIGlubGluZSB1MzIgdWRjX3JlYWQodTMyIHJlZykKK3sKKwlyZXR1cm4gcmVhZGIoYmFzZV9hZGRyICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHVkY193cml0ZSh1MzIgdmFsdWUsIHUzMiByZWcpCit7CisJd3JpdGViKHZhbHVlLCBiYXNlX2FkZHIgKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdWRjX3dyaXRlYih2b2lkIF9faW9tZW0gKmJhc2UsIHUzMiB2YWx1ZSwgdTMyIHJlZykKK3sKKwl3cml0ZWIodmFsdWUsIGJhc2UgKyByZWcpOworfQorCitzdGF0aWMgc3RydWN0IHMzYzI0MTBfdWRjX21hY2hfaW5mbyAqdWRjX2luZm87CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogREVCVUcgRlVOQ1RJT04gKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBERUJVR19OT1JNQUwJMQorI2RlZmluZSBERUJVR19WRVJCT1NFCTIKKworI2lmZGVmIENPTkZJR19VU0JfUzNDMjQxMF9ERUJVRworI2RlZmluZSBVU0JfUzNDMjQxMF9ERUJVR19MRVZFTCAwCisKK3N0YXRpYyB1aW50MzJfdCBzM2MyNDEwX3RpY2tzID0gMDsKKworc3RhdGljIGludCBkcHJpbnRrKGludCBsZXZlbCwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJc3RhdGljIGNoYXIgcHJpbnRrX2J1ZlsxMDI0XTsKKwlzdGF0aWMgbG9uZyBwcmV2dGlja3M7CisJc3RhdGljIGludCBpbnZvY2F0aW9uOworCXZhX2xpc3QgYXJnczsKKwlpbnQgbGVuOworCisJaWYgKGxldmVsID4gVVNCX1MzQzI0MTBfREVCVUdfTEVWRUwpCisJCXJldHVybiAwOworCisJaWYgKHMzYzI0MTBfdGlja3MgIT0gcHJldnRpY2tzKSB7CisJCXByZXZ0aWNrcyA9IHMzYzI0MTBfdGlja3M7CisJCWludm9jYXRpb24gPSAwOworCX0KKworCWxlbiA9IHNjbnByaW50ZihwcmludGtfYnVmLAorCQkJc2l6ZW9mKHByaW50a19idWYpLCAiJTFsdS4lMDJkIFVTQjogIiwKKwkJCXByZXZ0aWNrcywgaW52b2NhdGlvbisrKTsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJbGVuID0gdnNjbnByaW50ZihwcmludGtfYnVmK2xlbiwKKwkJCXNpemVvZihwcmludGtfYnVmKS1sZW4sIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCisJcmV0dXJuIHByaW50ayhLRVJOX0RFQlVHICIlcyIsIHByaW50a19idWYpOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgZHByaW50ayhpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXJldHVybiAwOworfQorI2VuZGlmCitzdGF0aWMgaW50IHMzYzI0MTBfdWRjX2RlYnVnZnNfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwKQoreworCXUzMiBhZGRyX3JlZyxwd3JfcmVnLGVwX2ludF9yZWcsdXNiX2ludF9yZWc7CisJdTMyIGVwX2ludF9lbl9yZWcsIHVzYl9pbnRfZW5fcmVnLCBlcDBfY3NyOworCXUzMiBlcDFfaV9jc3IxLGVwMV9pX2NzcjIsZXAxX29fY3NyMSxlcDFfb19jc3IyOworCXUzMiBlcDJfaV9jc3IxLGVwMl9pX2NzcjIsZXAyX29fY3NyMSxlcDJfb19jc3IyOworCisJYWRkcl9yZWcgICAgICAgPSB1ZGNfcmVhZChTM0MyNDEwX1VEQ19GVU5DX0FERFJfUkVHKTsKKwlwd3JfcmVnICAgICAgICA9IHVkY19yZWFkKFMzQzI0MTBfVURDX1BXUl9SRUcpOworCWVwX2ludF9yZWcgICAgID0gdWRjX3JlYWQoUzNDMjQxMF9VRENfRVBfSU5UX1JFRyk7CisJdXNiX2ludF9yZWcgICAgPSB1ZGNfcmVhZChTM0MyNDEwX1VEQ19VU0JfSU5UX1JFRyk7CisJZXBfaW50X2VuX3JlZyAgPSB1ZGNfcmVhZChTM0MyNDEwX1VEQ19FUF9JTlRfRU5fUkVHKTsKKwl1c2JfaW50X2VuX3JlZyA9IHVkY19yZWFkKFMzQzI0MTBfVURDX1VTQl9JTlRfRU5fUkVHKTsKKwl1ZGNfd3JpdGUoMCwgUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKKwllcDBfY3NyICAgICAgICA9IHVkY19yZWFkKFMzQzI0MTBfVURDX0lOX0NTUjFfUkVHKTsKKwl1ZGNfd3JpdGUoMSwgUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKKwllcDFfaV9jc3IxICAgICA9IHVkY19yZWFkKFMzQzI0MTBfVURDX0lOX0NTUjFfUkVHKTsKKwllcDFfaV9jc3IyICAgICA9IHVkY19yZWFkKFMzQzI0MTBfVURDX0lOX0NTUjJfUkVHKTsKKwllcDFfb19jc3IxICAgICA9IHVkY19yZWFkKFMzQzI0MTBfVURDX0lOX0NTUjFfUkVHKTsKKwllcDFfb19jc3IyICAgICA9IHVkY19yZWFkKFMzQzI0MTBfVURDX0lOX0NTUjJfUkVHKTsKKwl1ZGNfd3JpdGUoMiwgUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKKwllcDJfaV9jc3IxICAgICA9IHVkY19yZWFkKFMzQzI0MTBfVURDX0lOX0NTUjFfUkVHKTsKKwllcDJfaV9jc3IyICAgICA9IHVkY19yZWFkKFMzQzI0MTBfVURDX0lOX0NTUjJfUkVHKTsKKwllcDJfb19jc3IxICAgICA9IHVkY19yZWFkKFMzQzI0MTBfVURDX0lOX0NTUjFfUkVHKTsKKwllcDJfb19jc3IyICAgICA9IHVkY19yZWFkKFMzQzI0MTBfVURDX0lOX0NTUjJfUkVHKTsKKworCXNlcV9wcmludGYobSwgIkZVTkNfQUREUl9SRUcgIDogMHglMDRYXG4iCisJCSAiUFdSX1JFRyAgICAgICAgOiAweCUwNFhcbiIKKwkJICJFUF9JTlRfUkVHICAgICA6IDB4JTA0WFxuIgorCQkgIlVTQl9JTlRfUkVHICAgIDogMHglMDRYXG4iCisJCSAiRVBfSU5UX0VOX1JFRyAgOiAweCUwNFhcbiIKKwkJICJVU0JfSU5UX0VOX1JFRyA6IDB4JTA0WFxuIgorCQkgIkVQMF9DU1IgICAgICAgIDogMHglMDRYXG4iCisJCSAiRVAxX0lfQ1NSMSAgICAgOiAweCUwNFhcbiIKKwkJICJFUDFfSV9DU1IyICAgICA6IDB4JTA0WFxuIgorCQkgIkVQMV9PX0NTUjEgICAgIDogMHglMDRYXG4iCisJCSAiRVAxX09fQ1NSMiAgICAgOiAweCUwNFhcbiIKKwkJICJFUDJfSV9DU1IxICAgICA6IDB4JTA0WFxuIgorCQkgIkVQMl9JX0NTUjIgICAgIDogMHglMDRYXG4iCisJCSAiRVAyX09fQ1NSMSAgICAgOiAweCUwNFhcbiIKKwkJICJFUDJfT19DU1IyICAgICA6IDB4JTA0WFxuIiwKKwkJCWFkZHJfcmVnLHB3cl9yZWcsZXBfaW50X3JlZyx1c2JfaW50X3JlZywKKwkJCWVwX2ludF9lbl9yZWcsIHVzYl9pbnRfZW5fcmVnLCBlcDBfY3NyLAorCQkJZXAxX2lfY3NyMSxlcDFfaV9jc3IyLGVwMV9vX2NzcjEsZXAxX29fY3NyMiwKKwkJCWVwMl9pX2NzcjEsZXAyX2lfY3NyMixlcDJfb19jc3IxLGVwMl9vX2NzcjIKKwkJKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHMzYzI0MTBfdWRjX2RlYnVnZnNfZm9wc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgczNjMjQxMF91ZGNfZGVidWdmc19zZXFfc2hvdywgTlVMTCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHMzYzI0MTBfdWRjX2RlYnVnZnNfZm9wcyA9IHsKKwkub3BlbgkJPSBzM2MyNDEwX3VkY19kZWJ1Z2ZzX2ZvcHNfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKKy8qIGlvIG1hY3JvcyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgczNjMjQxMF91ZGNfY2xlYXJfZXAwX29wcih2b2lkIF9faW9tZW0gKmJhc2UpCit7CisJdWRjX3dyaXRlYihiYXNlLCBTM0MyNDEwX1VEQ19JTkRFWF9FUDAsIFMzQzI0MTBfVURDX0lOREVYX1JFRyk7CisJdWRjX3dyaXRlYihiYXNlLCBTM0MyNDEwX1VEQ19FUDBfQ1NSX1NPUEtUUkRZLAorCQkJUzNDMjQxMF9VRENfRVAwX0NTUl9SRUcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgczNjMjQxMF91ZGNfY2xlYXJfZXAwX3NzdCh2b2lkIF9faW9tZW0gKmJhc2UpCit7CisJdWRjX3dyaXRlYihiYXNlLCBTM0MyNDEwX1VEQ19JTkRFWF9FUDAsIFMzQzI0MTBfVURDX0lOREVYX1JFRyk7CisJd3JpdGViKDB4MDAsIGJhc2UgKyBTM0MyNDEwX1VEQ19FUDBfQ1NSX1JFRyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzM2MyNDEwX3VkY19jbGVhcl9lcDBfc2Uodm9pZCBfX2lvbWVtICpiYXNlKQoreworCXVkY193cml0ZWIoYmFzZSwgUzNDMjQxMF9VRENfSU5ERVhfRVAwLCBTM0MyNDEwX1VEQ19JTkRFWF9SRUcpOworCXVkY193cml0ZWIoYmFzZSwgUzNDMjQxMF9VRENfRVAwX0NTUl9TU0UsIFMzQzI0MTBfVURDX0VQMF9DU1JfUkVHKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHMzYzI0MTBfdWRjX3NldF9lcDBfaXByKHZvaWQgX19pb21lbSAqYmFzZSkKK3sKKwl1ZGNfd3JpdGViKGJhc2UsIFMzQzI0MTBfVURDX0lOREVYX0VQMCwgUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKKwl1ZGNfd3JpdGViKGJhc2UsIFMzQzI0MTBfVURDX0VQMF9DU1JfSVBLUkRZLCBTM0MyNDEwX1VEQ19FUDBfQ1NSX1JFRyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzM2MyNDEwX3VkY19zZXRfZXAwX2RlKHZvaWQgX19pb21lbSAqYmFzZSkKK3sKKwl1ZGNfd3JpdGViKGJhc2UsIFMzQzI0MTBfVURDX0lOREVYX0VQMCwgUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKKwl1ZGNfd3JpdGViKGJhc2UsIFMzQzI0MTBfVURDX0VQMF9DU1JfREUsIFMzQzI0MTBfVURDX0VQMF9DU1JfUkVHKTsKK30KKworaW5saW5lIHZvaWQgczNjMjQxMF91ZGNfc2V0X2VwMF9zcyh2b2lkIF9faW9tZW0gKmIpCit7CisJdWRjX3dyaXRlYihiLCBTM0MyNDEwX1VEQ19JTkRFWF9FUDAsIFMzQzI0MTBfVURDX0lOREVYX1JFRyk7CisJdWRjX3dyaXRlYihiLCBTM0MyNDEwX1VEQ19FUDBfQ1NSX1NFTkRTVEwsIFMzQzI0MTBfVURDX0VQMF9DU1JfUkVHKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHMzYzI0MTBfdWRjX3NldF9lcDBfZGVfb3V0KHZvaWQgX19pb21lbSAqYmFzZSkKK3sKKwl1ZGNfd3JpdGViKGJhc2UsIFMzQzI0MTBfVURDX0lOREVYX0VQMCwgUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKKworCXVkY193cml0ZWIoYmFzZSwoUzNDMjQxMF9VRENfRVAwX0NTUl9TT1BLVFJEWQorCQkJCXwgUzNDMjQxMF9VRENfRVAwX0NTUl9ERSksCisJCQlTM0MyNDEwX1VEQ19FUDBfQ1NSX1JFRyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzM2MyNDEwX3VkY19zZXRfZXAwX3NzZV9vdXQodm9pZCBfX2lvbWVtICpiYXNlKQoreworCXVkY193cml0ZWIoYmFzZSwgUzNDMjQxMF9VRENfSU5ERVhfRVAwLCBTM0MyNDEwX1VEQ19JTkRFWF9SRUcpOworCXVkY193cml0ZWIoYmFzZSwgKFMzQzI0MTBfVURDX0VQMF9DU1JfU09QS1RSRFkKKwkJCQl8IFMzQzI0MTBfVURDX0VQMF9DU1JfU1NFKSwKKwkJCVMzQzI0MTBfVURDX0VQMF9DU1JfUkVHKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHMzYzI0MTBfdWRjX3NldF9lcDBfZGVfaW4odm9pZCBfX2lvbWVtICpiYXNlKQoreworCXVkY193cml0ZWIoYmFzZSwgUzNDMjQxMF9VRENfSU5ERVhfRVAwLCBTM0MyNDEwX1VEQ19JTkRFWF9SRUcpOworCXVkY193cml0ZWIoYmFzZSwgKFMzQzI0MTBfVURDX0VQMF9DU1JfSVBLUkRZCisJCQl8IFMzQzI0MTBfVURDX0VQMF9DU1JfREUpLAorCQlTM0MyNDEwX1VEQ19FUDBfQ1NSX1JFRyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJL08gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKglzM2MyNDEwX3VkY19kb25lCisgKi8KK3N0YXRpYyB2b2lkIHMzYzI0MTBfdWRjX2RvbmUoc3RydWN0IHMzYzI0MTBfZXAgKmVwLAorCQlzdHJ1Y3QgczNjMjQxMF9yZXF1ZXN0ICpyZXEsIGludCBzdGF0dXMpCit7CisJdW5zaWduZWQgaGFsdGVkID0gZXAtPmhhbHRlZDsKKworCWxpc3RfZGVsX2luaXQoJnJlcS0+cXVldWUpOworCisJaWYgKGxpa2VseSAocmVxLT5yZXEuc3RhdHVzID09IC1FSU5QUk9HUkVTUykpCisJCXJlcS0+cmVxLnN0YXR1cyA9IHN0YXR1czsKKwllbHNlCisJCXN0YXR1cyA9IHJlcS0+cmVxLnN0YXR1czsKKworCWVwLT5oYWx0ZWQgPSAxOworCXJlcS0+cmVxLmNvbXBsZXRlKCZlcC0+ZXAsICZyZXEtPnJlcSk7CisJZXAtPmhhbHRlZCA9IGhhbHRlZDsKK30KKworc3RhdGljIHZvaWQgczNjMjQxMF91ZGNfbnVrZShzdHJ1Y3QgczNjMjQxMF91ZGMgKnVkYywKKwkJc3RydWN0IHMzYzI0MTBfZXAgKmVwLCBpbnQgc3RhdHVzKQoreworCS8qIFNhbml0eSBjaGVjayAqLworCWlmICgmZXAtPnF1ZXVlID09IE5VTEwpCisJCXJldHVybjsKKworCXdoaWxlICghbGlzdF9lbXB0eSAoJmVwLT5xdWV1ZSkpIHsKKwkJc3RydWN0IHMzYzI0MTBfcmVxdWVzdCAqcmVxOworCQlyZXEgPSBsaXN0X2VudHJ5IChlcC0+cXVldWUubmV4dCwgc3RydWN0IHMzYzI0MTBfcmVxdWVzdCwKKwkJCQlxdWV1ZSk7CisJCXMzYzI0MTBfdWRjX2RvbmUoZXAsIHJlcSwgc3RhdHVzKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzM2MyNDEwX3VkY19jbGVhcl9lcF9zdGF0ZShzdHJ1Y3QgczNjMjQxMF91ZGMgKmRldikKK3sKKwl1bnNpZ25lZCBpOworCisJLyogaGFyZHdhcmUgU0VUX3tDT05GSUdVUkFUSU9OLElOVEVSRkFDRX0gYXV0b21hZ2ljIHJlc2V0cyBlbmRwb2ludAorCSAqIGZpZm9zLCBhbmQgcGVuZGluZyB0cmFuc2FjdGlvbnMgbXVzdG4ndCBiZSBjb250aW51ZWQgaW4gYW55IGNhc2UuCisJICovCisKKwlmb3IgKGkgPSAxOyBpIDwgUzNDMjQxMF9FTkRQT0lOVFM7IGkrKykKKwkJczNjMjQxMF91ZGNfbnVrZShkZXYsICZkZXYtPmVwW2ldLCAtRUNPTk5BQk9SVEVEKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgczNjMjQxMF91ZGNfZmlmb19jb3VudF9vdXQodm9pZCkKK3sKKwlpbnQgdG1wOworCisJdG1wID0gdWRjX3JlYWQoUzNDMjQxMF9VRENfT1VUX0ZJRk9fQ05UMl9SRUcpIDw8IDg7CisJdG1wIHw9IHVkY19yZWFkKFMzQzI0MTBfVURDX09VVF9GSUZPX0NOVDFfUkVHKTsKKwlyZXR1cm4gdG1wOworfQorCisvKgorICoJczNjMjQxMF91ZGNfd3JpdGVfcGFja2V0CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHMzYzI0MTBfdWRjX3dyaXRlX3BhY2tldChpbnQgZmlmbywKKwkJc3RydWN0IHMzYzI0MTBfcmVxdWVzdCAqcmVxLAorCQl1bnNpZ25lZCBtYXgpCit7CisJdW5zaWduZWQgbGVuID0gbWluKHJlcS0+cmVxLmxlbmd0aCAtIHJlcS0+cmVxLmFjdHVhbCwgbWF4KTsKKwl1OCAqYnVmID0gcmVxLT5yZXEuYnVmICsgcmVxLT5yZXEuYWN0dWFsOworCisJcHJlZmV0Y2goYnVmKTsKKworCWRwcmludGsoREVCVUdfVkVSQk9TRSwgIiVzICVkICVkICVkICVkXG4iLCBfX2Z1bmNfXywKKwkJcmVxLT5yZXEuYWN0dWFsLCByZXEtPnJlcS5sZW5ndGgsIGxlbiwgcmVxLT5yZXEuYWN0dWFsICsgbGVuKTsKKworCXJlcS0+cmVxLmFjdHVhbCArPSBsZW47CisKKwl1ZGVsYXkoNSk7CisJd3JpdGVzYihiYXNlX2FkZHIgKyBmaWZvLCBidWYsIGxlbik7CisJcmV0dXJuIGxlbjsKK30KKworLyoKKyAqCXMzYzI0MTBfdWRjX3dyaXRlX2ZpZm8KKyAqCisgKiByZXR1cm46ICAwID0gc3RpbGwgcnVubmluZywgMSA9IGNvbXBsZXRlZCwgbmVnYXRpdmUgPSBlcnJubworICovCitzdGF0aWMgaW50IHMzYzI0MTBfdWRjX3dyaXRlX2ZpZm8oc3RydWN0IHMzYzI0MTBfZXAgKmVwLAorCQlzdHJ1Y3QgczNjMjQxMF9yZXF1ZXN0ICpyZXEpCit7CisJdW5zaWduZWQJY291bnQ7CisJaW50CQlpc19sYXN0OworCXUzMgkJaWR4OworCWludAkJZmlmb19yZWc7CisJdTMyCQllcF9jc3I7CisKKwlpZHggPSBlcC0+YkVuZHBvaW50QWRkcmVzcyAmIDB4N0Y7CisJc3dpdGNoIChpZHgpIHsKKwlkZWZhdWx0OgorCQlpZHggPSAwOworCWNhc2UgMDoKKwkJZmlmb19yZWcgPSBTM0MyNDEwX1VEQ19FUDBfRklGT19SRUc7CisJCWJyZWFrOworCWNhc2UgMToKKwkJZmlmb19yZWcgPSBTM0MyNDEwX1VEQ19FUDFfRklGT19SRUc7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJZmlmb19yZWcgPSBTM0MyNDEwX1VEQ19FUDJfRklGT19SRUc7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJZmlmb19yZWcgPSBTM0MyNDEwX1VEQ19FUDNfRklGT19SRUc7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJZmlmb19yZWcgPSBTM0MyNDEwX1VEQ19FUDRfRklGT19SRUc7CisJCWJyZWFrOworCX0KKworCWNvdW50ID0gczNjMjQxMF91ZGNfd3JpdGVfcGFja2V0KGZpZm9fcmVnLCByZXEsIGVwLT5lcC5tYXhwYWNrZXQpOworCisJLyogbGFzdCBwYWNrZXQgaXMgb2Z0ZW4gc2hvcnQgKHNvbWV0aW1lcyBhIHpscCkgKi8KKwlpZiAoY291bnQgIT0gZXAtPmVwLm1heHBhY2tldCkKKwkJaXNfbGFzdCA9IDE7CisJZWxzZSBpZiAocmVxLT5yZXEubGVuZ3RoICE9IHJlcS0+cmVxLmFjdHVhbCB8fCByZXEtPnJlcS56ZXJvKQorCQlpc19sYXN0ID0gMDsKKwllbHNlCisJCWlzX2xhc3QgPSAyOworCisJLyogT25seSBlcDAgZGVidWcgbWVzc2FnZXMgYXJlIGludGVyZXN0aW5nICovCisJaWYgKGlkeCA9PSAwKQorCQlkcHJpbnRrKERFQlVHX05PUk1BTCwKKwkJCSJXcml0dGVuIGVwJWQgJWQuJWQgb2YgJWQgYiBbbGFzdCAlZCx6ICVkXVxuIiwKKwkJCWlkeCwgY291bnQsIHJlcS0+cmVxLmFjdHVhbCwgcmVxLT5yZXEubGVuZ3RoLAorCQkJaXNfbGFzdCwgcmVxLT5yZXEuemVybyk7CisKKwlpZiAoaXNfbGFzdCkgeworCQkvKiBUaGUgb3JkZXIgaXMgaW1wb3J0YW50LiBJdCBwcmV2ZW50cyBzZW5kaW5nIDIgcGFja2V0cworCQkgKiBhdCB0aGUgc2FtZSB0aW1lICovCisKKwkJaWYgKGlkeCA9PSAwKSB7CisJCQkvKiBSZXNldCBzaWduYWwgPT4gbm8gbmVlZCB0byBzYXkgJ2RhdGEgc2VudCcgKi8KKwkJCWlmICghICh1ZGNfcmVhZChTM0MyNDEwX1VEQ19VU0JfSU5UX1JFRykKKwkJCQkJJiBTM0MyNDEwX1VEQ19VU0JJTlRfUkVTRVQpKQorCQkJCXMzYzI0MTBfdWRjX3NldF9lcDBfZGVfaW4oYmFzZV9hZGRyKTsKKwkJCWVwLT5kZXYtPmVwMHN0YXRlPUVQMF9JRExFOworCQl9IGVsc2UgeworCQkJdWRjX3dyaXRlKGlkeCwgUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKKwkJCWVwX2NzciA9IHVkY19yZWFkKFMzQzI0MTBfVURDX0lOX0NTUjFfUkVHKTsKKwkJCXVkY193cml0ZShpZHgsIFMzQzI0MTBfVURDX0lOREVYX1JFRyk7CisJCQl1ZGNfd3JpdGUoZXBfY3NyIHwgUzNDMjQxMF9VRENfSUNTUjFfUEtUUkRZLAorCQkJCQlTM0MyNDEwX1VEQ19JTl9DU1IxX1JFRyk7CisJCX0KKworCQlzM2MyNDEwX3VkY19kb25lKGVwLCByZXEsIDApOworCQlpc19sYXN0ID0gMTsKKwl9IGVsc2UgeworCQlpZiAoaWR4ID09IDApIHsKKwkJCS8qIFJlc2V0IHNpZ25hbCA9PiBubyBuZWVkIHRvIHNheSAnZGF0YSBzZW50JyAqLworCQkJaWYgKCEgKHVkY19yZWFkKFMzQzI0MTBfVURDX1VTQl9JTlRfUkVHKQorCQkJCQkmIFMzQzI0MTBfVURDX1VTQklOVF9SRVNFVCkpCisJCQkJczNjMjQxMF91ZGNfc2V0X2VwMF9pcHIoYmFzZV9hZGRyKTsKKwkJfSBlbHNlIHsKKwkJCXVkY193cml0ZShpZHgsIFMzQzI0MTBfVURDX0lOREVYX1JFRyk7CisJCQllcF9jc3IgPSB1ZGNfcmVhZChTM0MyNDEwX1VEQ19JTl9DU1IxX1JFRyk7CisJCQl1ZGNfd3JpdGUoaWR4LCBTM0MyNDEwX1VEQ19JTkRFWF9SRUcpOworCQkJdWRjX3dyaXRlKGVwX2NzciB8IFMzQzI0MTBfVURDX0lDU1IxX1BLVFJEWSwKKwkJCQkJUzNDMjQxMF9VRENfSU5fQ1NSMV9SRUcpOworCQl9CisJfQorCisJcmV0dXJuIGlzX2xhc3Q7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHMzYzI0MTBfdWRjX3JlYWRfcGFja2V0KGludCBmaWZvLCB1OCAqYnVmLAorCQlzdHJ1Y3QgczNjMjQxMF9yZXF1ZXN0ICpyZXEsIHVuc2lnbmVkIGF2YWlsKQoreworCXVuc2lnbmVkIGxlbjsKKworCWxlbiA9IG1pbihyZXEtPnJlcS5sZW5ndGggLSByZXEtPnJlcS5hY3R1YWwsIGF2YWlsKTsKKwlyZXEtPnJlcS5hY3R1YWwgKz0gbGVuOworCisJcmVhZHNiKGZpZm8gKyBiYXNlX2FkZHIsIGJ1ZiwgbGVuKTsKKwlyZXR1cm4gbGVuOworfQorCisvKgorICogcmV0dXJuOiAgMCA9IHN0aWxsIHJ1bm5pbmcsIDEgPSBxdWV1ZSBlbXB0eSwgbmVnYXRpdmUgPSBlcnJubworICovCitzdGF0aWMgaW50IHMzYzI0MTBfdWRjX3JlYWRfZmlmbyhzdHJ1Y3QgczNjMjQxMF9lcCAqZXAsCisJCQkJIHN0cnVjdCBzM2MyNDEwX3JlcXVlc3QgKnJlcSkKK3sKKwl1OAkJKmJ1ZjsKKwl1MzIJCWVwX2NzcjsKKwl1bnNpZ25lZAlidWZmZXJzcGFjZTsKKwlpbnQJCWlzX2xhc3Q9MTsKKwl1bnNpZ25lZAlhdmFpbDsKKwlpbnQJCWZpZm9fY291bnQgPSAwOworCXUzMgkJaWR4OworCWludAkJZmlmb19yZWc7CisKKwlpZHggPSBlcC0+YkVuZHBvaW50QWRkcmVzcyAmIDB4N0Y7CisKKwlzd2l0Y2ggKGlkeCkgeworCWRlZmF1bHQ6CisJCWlkeCA9IDA7CisJY2FzZSAwOgorCQlmaWZvX3JlZyA9IFMzQzI0MTBfVURDX0VQMF9GSUZPX1JFRzsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlmaWZvX3JlZyA9IFMzQzI0MTBfVURDX0VQMV9GSUZPX1JFRzsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlmaWZvX3JlZyA9IFMzQzI0MTBfVURDX0VQMl9GSUZPX1JFRzsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlmaWZvX3JlZyA9IFMzQzI0MTBfVURDX0VQM19GSUZPX1JFRzsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlmaWZvX3JlZyA9IFMzQzI0MTBfVURDX0VQNF9GSUZPX1JFRzsKKwkJYnJlYWs7CisJfQorCisJaWYgKCFyZXEtPnJlcS5sZW5ndGgpCisJCXJldHVybiAxOworCisJYnVmID0gcmVxLT5yZXEuYnVmICsgcmVxLT5yZXEuYWN0dWFsOworCWJ1ZmZlcnNwYWNlID0gcmVxLT5yZXEubGVuZ3RoIC0gcmVxLT5yZXEuYWN0dWFsOworCWlmICghYnVmZmVyc3BhY2UpIHsKKwkJZHByaW50ayhERUJVR19OT1JNQUwsICIlczogYnVmZmVyIGZ1bGwhXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtMTsKKwl9CisKKwl1ZGNfd3JpdGUoaWR4LCBTM0MyNDEwX1VEQ19JTkRFWF9SRUcpOworCisJZmlmb19jb3VudCA9IHMzYzI0MTBfdWRjX2ZpZm9fY291bnRfb3V0KCk7CisJZHByaW50ayhERUJVR19OT1JNQUwsICIlcyBmaWZvIGNvdW50IDogJWRcbiIsIF9fZnVuY19fLCBmaWZvX2NvdW50KTsKKworCWlmIChmaWZvX2NvdW50ID4gZXAtPmVwLm1heHBhY2tldCkKKwkJYXZhaWwgPSBlcC0+ZXAubWF4cGFja2V0OworCWVsc2UKKwkJYXZhaWwgPSBmaWZvX2NvdW50OworCisJZmlmb19jb3VudCA9IHMzYzI0MTBfdWRjX3JlYWRfcGFja2V0KGZpZm9fcmVnLCBidWYsIHJlcSwgYXZhaWwpOworCisJLyogY2hlY2tpbmcgdGhpcyB3aXRoIGVwMCBpcyBub3QgYWNjdXJhdGUgYXMgd2UgYWxyZWFkeQorCSAqIHJlYWQgYSBjb250cm9sIHJlcXVlc3QKKwkgKiovCisJaWYgKGlkeCAhPSAwICYmIGZpZm9fY291bnQgPCBlcC0+ZXAubWF4cGFja2V0KSB7CisJCWlzX2xhc3QgPSAxOworCQkvKiBvdmVyZmxvd2VkIHRoaXMgcmVxdWVzdD8gIGZsdXNoIGV4dHJhIGRhdGEgKi8KKwkJaWYgKGZpZm9fY291bnQgIT0gYXZhaWwpCisJCQlyZXEtPnJlcS5zdGF0dXMgPSAtRU9WRVJGTE9XOworCX0gZWxzZSB7CisJCWlzX2xhc3QgPSAocmVxLT5yZXEubGVuZ3RoIDw9IHJlcS0+cmVxLmFjdHVhbCkgPyAxIDogMDsKKwl9CisKKwl1ZGNfd3JpdGUoaWR4LCBTM0MyNDEwX1VEQ19JTkRFWF9SRUcpOworCWZpZm9fY291bnQgPSBzM2MyNDEwX3VkY19maWZvX2NvdW50X291dCgpOworCisJLyogT25seSBlcDAgZGVidWcgbWVzc2FnZXMgYXJlIGludGVyZXN0aW5nICovCisJaWYgKGlkeCA9PSAwKQorCQlkcHJpbnRrKERFQlVHX1ZFUkJPU0UsICIlcyBmaWZvIGNvdW50IDogJWQgW2xhc3QgJWRdXG4iLAorCQkJX19mdW5jX18sIGZpZm9fY291bnQsaXNfbGFzdCk7CisKKwlpZiAoaXNfbGFzdCkgeworCQlpZiAoaWR4ID09IDApIHsKKwkJCXMzYzI0MTBfdWRjX3NldF9lcDBfZGVfb3V0KGJhc2VfYWRkcik7CisJCQllcC0+ZGV2LT5lcDBzdGF0ZSA9IEVQMF9JRExFOworCQl9IGVsc2UgeworCQkJdWRjX3dyaXRlKGlkeCwgUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKKwkJCWVwX2NzciA9IHVkY19yZWFkKFMzQzI0MTBfVURDX09VVF9DU1IxX1JFRyk7CisJCQl1ZGNfd3JpdGUoaWR4LCBTM0MyNDEwX1VEQ19JTkRFWF9SRUcpOworCQkJdWRjX3dyaXRlKGVwX2NzciAmIH5TM0MyNDEwX1VEQ19PQ1NSMV9QS1RSRFksCisJCQkJCVMzQzI0MTBfVURDX09VVF9DU1IxX1JFRyk7CisJCX0KKworCQlzM2MyNDEwX3VkY19kb25lKGVwLCByZXEsIDApOworCX0gZWxzZSB7CisJCWlmIChpZHggPT0gMCkgeworCQkJczNjMjQxMF91ZGNfY2xlYXJfZXAwX29wcihiYXNlX2FkZHIpOworCQl9IGVsc2UgeworCQkJdWRjX3dyaXRlKGlkeCwgUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKKwkJCWVwX2NzciA9IHVkY19yZWFkKFMzQzI0MTBfVURDX09VVF9DU1IxX1JFRyk7CisJCQl1ZGNfd3JpdGUoaWR4LCBTM0MyNDEwX1VEQ19JTkRFWF9SRUcpOworCQkJdWRjX3dyaXRlKGVwX2NzciAmIH5TM0MyNDEwX1VEQ19PQ1NSMV9QS1RSRFksCisJCQkJCVMzQzI0MTBfVURDX09VVF9DU1IxX1JFRyk7CisJCX0KKwl9CisKKwlyZXR1cm4gaXNfbGFzdDsKK30KKworc3RhdGljIGludCBzM2MyNDEwX3VkY19yZWFkX2ZpZm9fY3JxKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmNycSkKK3sKKwl1bnNpZ25lZCBjaGFyICpvdXRidWYgPSAodW5zaWduZWQgY2hhciopY3JxOworCWludCBieXRlc19yZWFkID0gMDsKKworCXVkY193cml0ZSgwLCBTM0MyNDEwX1VEQ19JTkRFWF9SRUcpOworCisJYnl0ZXNfcmVhZCA9IHMzYzI0MTBfdWRjX2ZpZm9fY291bnRfb3V0KCk7CisKKwlkcHJpbnRrKERFQlVHX05PUk1BTCwgIiVzOiBmaWZvX2NvdW50PSVkXG4iLCBfX2Z1bmNfXywgYnl0ZXNfcmVhZCk7CisKKwlpZiAoYnl0ZXNfcmVhZCA+IHNpemVvZihzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0KSkKKwkJYnl0ZXNfcmVhZCA9IHNpemVvZihzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0KTsKKworCXJlYWRzYihTM0MyNDEwX1VEQ19FUDBfRklGT19SRUcgKyBiYXNlX2FkZHIsIG91dGJ1ZiwgYnl0ZXNfcmVhZCk7CisKKwlkcHJpbnRrKERFQlVHX1ZFUkJPU0UsICIlczogbGVuPSVkICUwMng6JTAyeCB7JXgsJXgsJXh9XG4iLCBfX2Z1bmNfXywKKwkJYnl0ZXNfcmVhZCwgY3JxLT5iUmVxdWVzdCwgY3JxLT5iUmVxdWVzdFR5cGUsCisJCWNycS0+d1ZhbHVlLCBjcnEtPndJbmRleCwgY3JxLT53TGVuZ3RoKTsKKworCXJldHVybiBieXRlc19yZWFkOworfQorCitzdGF0aWMgaW50IHMzYzI0MTBfdWRjX2dldF9zdGF0dXMoc3RydWN0IHMzYzI0MTBfdWRjICpkZXYsCisJCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmNycSkKK3sKKwl1MTYgc3RhdHVzID0gMDsKKwl1OCBlcF9udW0gPSBjcnEtPndJbmRleCAmIDB4N0Y7CisJdTggaXNfaW4gPSBjcnEtPndJbmRleCAmIFVTQl9ESVJfSU47CisKKwlzd2l0Y2ggKGNycS0+YlJlcXVlc3RUeXBlICYgVVNCX1JFQ0lQX01BU0spIHsKKwljYXNlIFVTQl9SRUNJUF9JTlRFUkZBQ0U6CisJCWJyZWFrOworCisJY2FzZSBVU0JfUkVDSVBfREVWSUNFOgorCQlzdGF0dXMgPSBkZXYtPmRldnN0YXR1czsKKwkJYnJlYWs7CisKKwljYXNlIFVTQl9SRUNJUF9FTkRQT0lOVDoKKwkJaWYgKGVwX251bSA+IDQgfHwgY3JxLT53TGVuZ3RoID4gMikKKwkJCXJldHVybiAxOworCisJCWlmIChlcF9udW0gPT0gMCkgeworCQkJdWRjX3dyaXRlKDAsIFMzQzI0MTBfVURDX0lOREVYX1JFRyk7CisJCQlzdGF0dXMgPSB1ZGNfcmVhZChTM0MyNDEwX1VEQ19JTl9DU1IxX1JFRyk7CisJCQlzdGF0dXMgPSBzdGF0dXMgJiBTM0MyNDEwX1VEQ19FUDBfQ1NSX1NFTkRTVEw7CisJCX0gZWxzZSB7CisJCQl1ZGNfd3JpdGUoZXBfbnVtLCBTM0MyNDEwX1VEQ19JTkRFWF9SRUcpOworCQkJaWYgKGlzX2luKSB7CisJCQkJc3RhdHVzID0gdWRjX3JlYWQoUzNDMjQxMF9VRENfSU5fQ1NSMV9SRUcpOworCQkJCXN0YXR1cyA9IHN0YXR1cyAmIFMzQzI0MTBfVURDX0lDU1IxX1NFTkRTVEw7CisJCQl9IGVsc2UgeworCQkJCXN0YXR1cyA9IHVkY19yZWFkKFMzQzI0MTBfVURDX09VVF9DU1IxX1JFRyk7CisJCQkJc3RhdHVzID0gc3RhdHVzICYgUzNDMjQxMF9VRENfT0NTUjFfU0VORFNUTDsKKwkJCX0KKwkJfQorCisJCXN0YXR1cyA9IHN0YXR1cyA/IDEgOiAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAxOworCX0KKworCS8qIFNlZW1zIHRvIGJlIG5lZWRlZCB0byBnZXQgaXQgd29ya2luZy4gb3VjaCA6KCAqLworCXVkZWxheSg1KTsKKwl1ZGNfd3JpdGUoc3RhdHVzICYgMHhGRiwgUzNDMjQxMF9VRENfRVAwX0ZJRk9fUkVHKTsKKwl1ZGNfd3JpdGUoc3RhdHVzID4+IDgsIFMzQzI0MTBfVURDX0VQMF9GSUZPX1JFRyk7CisJczNjMjQxMF91ZGNfc2V0X2VwMF9kZV9pbihiYXNlX2FkZHIpOworCisJcmV0dXJuIDA7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdXNiIHN0YXRlIG1hY2hpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IHMzYzI0MTBfdWRjX3NldF9oYWx0KHN0cnVjdCB1c2JfZXAgKl9lcCwgaW50IHZhbHVlKTsKKworc3RhdGljIHZvaWQgczNjMjQxMF91ZGNfaGFuZGxlX2VwMF9pZGxlKHN0cnVjdCBzM2MyNDEwX3VkYyAqZGV2LAorCQkJCQlzdHJ1Y3QgczNjMjQxMF9lcCAqZXAsCisJCQkJCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmNycSwKKwkJCQkJdTMyIGVwMGNzcikKK3sKKwlpbnQgbGVuLCByZXQsIHRtcDsKKworCS8qIHN0YXJ0IGNvbnRyb2wgcmVxdWVzdD8gKi8KKwlpZiAoIShlcDBjc3IgJiBTM0MyNDEwX1VEQ19FUDBfQ1NSX09QS1JEWSkpCisJCXJldHVybjsKKworCXMzYzI0MTBfdWRjX251a2UoZGV2LCBlcCwgLUVQUk9UTyk7CisKKwlsZW4gPSBzM2MyNDEwX3VkY19yZWFkX2ZpZm9fY3JxKGNycSk7CisJaWYgKGxlbiAhPSBzaXplb2YoKmNycSkpIHsKKwkJZHByaW50ayhERUJVR19OT1JNQUwsICJzZXR1cCBiZWdpbjogZmlmbyBSRUFEIEVSUk9SIgorCQkJIiB3YW50ZWQgJWQgYnl0ZXMgZ290ICVkLiBTdGFsbGluZyBvdXQuLi5cbiIsCisJCQlzaXplb2YoKmNycSksIGxlbik7CisJCXMzYzI0MTBfdWRjX3NldF9lcDBfc3MoYmFzZV9hZGRyKTsKKwkJcmV0dXJuOworCX0KKworCWRwcmludGsoREVCVUdfTk9STUFMLCAiYlJlcXVlc3QgPSAlZCBiUmVxdWVzdFR5cGUgJWQgd0xlbmd0aCA9ICVkXG4iLAorCQljcnEtPmJSZXF1ZXN0LCBjcnEtPmJSZXF1ZXN0VHlwZSwgY3JxLT53TGVuZ3RoKTsKKworCS8qIGNvcGUgd2l0aCBhdXRvbWFnaWMgZm9yIHNvbWUgc3RhbmRhcmQgcmVxdWVzdHMuICovCisJZGV2LT5yZXFfc3RkID0gKGNycS0+YlJlcXVlc3RUeXBlICYgVVNCX1RZUEVfTUFTSykKKwkJPT0gVVNCX1RZUEVfU1RBTkRBUkQ7CisJZGV2LT5yZXFfY29uZmlnID0gMDsKKwlkZXYtPnJlcV9wZW5kaW5nID0gMTsKKworCXN3aXRjaCAoY3JxLT5iUmVxdWVzdCkgeworCWNhc2UgVVNCX1JFUV9TRVRfQ09ORklHVVJBVElPTjoKKwkJZHByaW50ayhERUJVR19OT1JNQUwsICJVU0JfUkVRX1NFVF9DT05GSUdVUkFUSU9OIC4uLiBcbiIpOworCisJCWlmIChjcnEtPmJSZXF1ZXN0VHlwZSA9PSBVU0JfUkVDSVBfREVWSUNFKSB7CisJCQlkZXYtPnJlcV9jb25maWcgPSAxOworCQkJczNjMjQxMF91ZGNfc2V0X2VwMF9kZV9vdXQoYmFzZV9hZGRyKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgVVNCX1JFUV9TRVRfSU5URVJGQUNFOgorCQlkcHJpbnRrKERFQlVHX05PUk1BTCwgIlVTQl9SRVFfU0VUX0lOVEVSRkFDRSAuLi4gXG4iKTsKKworCQlpZiAoY3JxLT5iUmVxdWVzdFR5cGUgPT0gVVNCX1JFQ0lQX0lOVEVSRkFDRSkgeworCQkJZGV2LT5yZXFfY29uZmlnID0gMTsKKwkJCXMzYzI0MTBfdWRjX3NldF9lcDBfZGVfb3V0KGJhc2VfYWRkcik7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFVTQl9SRVFfU0VUX0FERFJFU1M6CisJCWRwcmludGsoREVCVUdfTk9STUFMLCAiVVNCX1JFUV9TRVRfQUREUkVTUyAuLi4gXG4iKTsKKworCQlpZiAoY3JxLT5iUmVxdWVzdFR5cGUgPT0gVVNCX1JFQ0lQX0RFVklDRSkgeworCQkJdG1wID0gY3JxLT53VmFsdWUgJiAweDdGOworCQkJZGV2LT5hZGRyZXNzID0gdG1wOworCQkJdWRjX3dyaXRlKCh0bXAgfCBTM0MyNDEwX1VEQ19GVU5DQUREUl9VUERBVEUpLAorCQkJCQlTM0MyNDEwX1VEQ19GVU5DX0FERFJfUkVHKTsKKwkJCXMzYzI0MTBfdWRjX3NldF9lcDBfZGVfb3V0KGJhc2VfYWRkcik7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFVTQl9SRVFfR0VUX1NUQVRVUzoKKwkJZHByaW50ayhERUJVR19OT1JNQUwsICJVU0JfUkVRX0dFVF9TVEFUVVMgLi4uIFxuIik7CisJCXMzYzI0MTBfdWRjX2NsZWFyX2VwMF9vcHIoYmFzZV9hZGRyKTsKKworCQlpZiAoZGV2LT5yZXFfc3RkKSB7CisJCQlpZiAoIXMzYzI0MTBfdWRjX2dldF9zdGF0dXMoZGV2LCBjcnEpKSB7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBVU0JfUkVRX0NMRUFSX0ZFQVRVUkU6CisJCXMzYzI0MTBfdWRjX2NsZWFyX2VwMF9vcHIoYmFzZV9hZGRyKTsKKworCQlpZiAoY3JxLT5iUmVxdWVzdFR5cGUgIT0gVVNCX1JFQ0lQX0VORFBPSU5UKQorCQkJYnJlYWs7CisKKwkJaWYgKGNycS0+d1ZhbHVlICE9IFVTQl9FTkRQT0lOVF9IQUxUIHx8IGNycS0+d0xlbmd0aCAhPSAwKQorCQkJYnJlYWs7CisKKwkJczNjMjQxMF91ZGNfc2V0X2hhbHQoJmRldi0+ZXBbY3JxLT53SW5kZXggJiAweDdmXS5lcCwgMCk7CisJCXMzYzI0MTBfdWRjX3NldF9lcDBfZGVfb3V0KGJhc2VfYWRkcik7CisJCXJldHVybjsKKworCWNhc2UgVVNCX1JFUV9TRVRfRkVBVFVSRToKKwkJczNjMjQxMF91ZGNfY2xlYXJfZXAwX29wcihiYXNlX2FkZHIpOworCisJCWlmIChjcnEtPmJSZXF1ZXN0VHlwZSAhPSBVU0JfUkVDSVBfRU5EUE9JTlQpCisJCQlicmVhazsKKworCQlpZiAoY3JxLT53VmFsdWUgIT0gVVNCX0VORFBPSU5UX0hBTFQgfHwgY3JxLT53TGVuZ3RoICE9IDApCisJCQlicmVhazsKKworCQlzM2MyNDEwX3VkY19zZXRfaGFsdCgmZGV2LT5lcFtjcnEtPndJbmRleCAmIDB4N2ZdLmVwLCAxKTsKKwkJczNjMjQxMF91ZGNfc2V0X2VwMF9kZV9vdXQoYmFzZV9hZGRyKTsKKwkJcmV0dXJuOworCisJZGVmYXVsdDoKKwkJczNjMjQxMF91ZGNfY2xlYXJfZXAwX29wcihiYXNlX2FkZHIpOworCQlicmVhazsKKwl9CisKKwlpZiAoY3JxLT5iUmVxdWVzdFR5cGUgJiBVU0JfRElSX0lOKQorCQlkZXYtPmVwMHN0YXRlID0gRVAwX0lOX0RBVEFfUEhBU0U7CisJZWxzZQorCQlkZXYtPmVwMHN0YXRlID0gRVAwX09VVF9EQVRBX1BIQVNFOworCisJcmV0ID0gZGV2LT5kcml2ZXItPnNldHVwKCZkZXYtPmdhZGdldCwgY3JxKTsKKwlpZiAocmV0IDwgMCkgeworCQlpZiAoZGV2LT5yZXFfY29uZmlnKSB7CisJCQlkcHJpbnRrKERFQlVHX05PUk1BTCwgImNvbmZpZyBjaGFuZ2UgJTAyeCBmYWlsICVkP1xuIiwKKwkJCQljcnEtPmJSZXF1ZXN0LCByZXQpOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKHJldCA9PSAtRU9QTk9UU1VQUCkKKwkJCWRwcmludGsoREVCVUdfTk9STUFMLCAiT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWRcbiIpOworCQllbHNlCisJCQlkcHJpbnRrKERFQlVHX05PUk1BTCwKKwkJCQkiZGV2LT5kcml2ZXItPnNldHVwIGZhaWxlZC4gKCVkKVxuIiwgcmV0KTsKKworCQl1ZGVsYXkoNSk7CisJCXMzYzI0MTBfdWRjX3NldF9lcDBfc3MoYmFzZV9hZGRyKTsKKwkJczNjMjQxMF91ZGNfc2V0X2VwMF9kZV9vdXQoYmFzZV9hZGRyKTsKKwkJZGV2LT5lcDBzdGF0ZSA9IEVQMF9JRExFOworCQkvKiBkZWZlcnJlZCBpL28gPT0gbm8gcmVzcG9uc2UgeWV0ICovCisJfSBlbHNlIGlmIChkZXYtPnJlcV9wZW5kaW5nKSB7CisJCWRwcmludGsoREVCVUdfVkVSQk9TRSwgImRldi0+cmVxX3BlbmRpbmcuLi4gd2hhdCBub3c/XG4iKTsKKwkJZGV2LT5yZXFfcGVuZGluZz0wOworCX0KKworCWRwcmludGsoREVCVUdfVkVSQk9TRSwgImVwMHN0YXRlICVzXG4iLCBlcDBzdGF0ZXNbZGV2LT5lcDBzdGF0ZV0pOworfQorCitzdGF0aWMgdm9pZCBzM2MyNDEwX3VkY19oYW5kbGVfZXAwKHN0cnVjdCBzM2MyNDEwX3VkYyAqZGV2KQoreworCXUzMgkJCWVwMGNzcjsKKwlzdHJ1Y3QgczNjMjQxMF9lcAkqZXAgPSAmZGV2LT5lcFswXTsKKwlzdHJ1Y3QgczNjMjQxMF9yZXF1ZXN0CSpyZXE7CisJc3RydWN0IHVzYl9jdHJscmVxdWVzdAljcnE7CisKKwlpZiAobGlzdF9lbXB0eSgmZXAtPnF1ZXVlKSkKKwkJcmVxID0gTlVMTDsKKwllbHNlCisJCXJlcSA9IGxpc3RfZW50cnkoZXAtPnF1ZXVlLm5leHQsIHN0cnVjdCBzM2MyNDEwX3JlcXVlc3QsIHF1ZXVlKTsKKworCS8qIFdlIG1ha2UgdGhlIGFzc3VtcHRpb24gdGhhdCBTM0MyNDEwX1VEQ19JTl9DU1IxX1JFRyBlcXVhbCB0bworCSAqIFMzQzI0MTBfVURDX0VQMF9DU1JfUkVHIHdoZW4gaW5kZXggaXMgemVybyAqLworCisJdWRjX3dyaXRlKDAsIFMzQzI0MTBfVURDX0lOREVYX1JFRyk7CisJZXAwY3NyID0gdWRjX3JlYWQoUzNDMjQxMF9VRENfSU5fQ1NSMV9SRUcpOworCisJZHByaW50ayhERUJVR19OT1JNQUwsICJlcDBjc3IgJXggZXAwc3RhdGUgJXNcbiIsCisJCWVwMGNzciwgZXAwc3RhdGVzW2Rldi0+ZXAwc3RhdGVdKTsKKworCS8qIGNsZWFyIHN0YWxsIHN0YXR1cyAqLworCWlmIChlcDBjc3IgJiBTM0MyNDEwX1VEQ19FUDBfQ1NSX1NFTlRTVEwpIHsKKwkJczNjMjQxMF91ZGNfbnVrZShkZXYsIGVwLCAtRVBJUEUpOworCQlkcHJpbnRrKERFQlVHX05PUk1BTCwgIi4uLiBjbGVhciBTRU5UX1NUQUxMIC4uLlxuIik7CisJCXMzYzI0MTBfdWRjX2NsZWFyX2VwMF9zc3QoYmFzZV9hZGRyKTsKKwkJZGV2LT5lcDBzdGF0ZSA9IEVQMF9JRExFOworCQlyZXR1cm47CisJfQorCisJLyogY2xlYXIgc2V0dXAgZW5kICovCisJaWYgKGVwMGNzciAmIFMzQzI0MTBfVURDX0VQMF9DU1JfU0UpIHsKKwkJZHByaW50ayhERUJVR19OT1JNQUwsICIuLi4gc2VydmljZWQgU0VUVVBfRU5EIC4uLlxuIik7CisJCXMzYzI0MTBfdWRjX251a2UoZGV2LCBlcCwgMCk7CisJCXMzYzI0MTBfdWRjX2NsZWFyX2VwMF9zZShiYXNlX2FkZHIpOworCQlkZXYtPmVwMHN0YXRlID0gRVAwX0lETEU7CisJfQorCisJc3dpdGNoIChkZXYtPmVwMHN0YXRlKSB7CisJY2FzZSBFUDBfSURMRToKKwkJczNjMjQxMF91ZGNfaGFuZGxlX2VwMF9pZGxlKGRldiwgZXAsICZjcnEsIGVwMGNzcik7CisJCWJyZWFrOworCisJY2FzZSBFUDBfSU5fREFUQV9QSEFTRToJCQkvKiBHRVRfREVTQ1JJUFRPUiBldGMgKi8KKwkJZHByaW50ayhERUJVR19OT1JNQUwsICJFUDBfSU5fREFUQV9QSEFTRSAuLi4gd2hhdCBub3c/XG4iKTsKKwkJaWYgKCEoZXAwY3NyICYgUzNDMjQxMF9VRENfRVAwX0NTUl9JUEtSRFkpICYmIHJlcSkgeworCQkJczNjMjQxMF91ZGNfd3JpdGVfZmlmbyhlcCwgcmVxKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgRVAwX09VVF9EQVRBX1BIQVNFOgkJLyogU0VUX0RFU0NSSVBUT1IgZXRjICovCisJCWRwcmludGsoREVCVUdfTk9STUFMLCAiRVAwX09VVF9EQVRBX1BIQVNFIC4uLiB3aGF0IG5vdz9cbiIpOworCQlpZiAoKGVwMGNzciAmIFMzQzI0MTBfVURDX0VQMF9DU1JfT1BLUkRZKSAmJiByZXEgKSB7CisJCQlzM2MyNDEwX3VkY19yZWFkX2ZpZm8oZXAscmVxKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgRVAwX0VORF9YRkVSOgorCQlkcHJpbnRrKERFQlVHX05PUk1BTCwgIkVQMF9FTkRfWEZFUiAuLi4gd2hhdCBub3c/XG4iKTsKKwkJZGV2LT5lcDBzdGF0ZSA9IEVQMF9JRExFOworCQlicmVhazsKKworCWNhc2UgRVAwX1NUQUxMOgorCQlkcHJpbnRrKERFQlVHX05PUk1BTCwgIkVQMF9TVEFMTCAuLi4gd2hhdCBub3c/XG4iKTsKKwkJZGV2LT5lcDBzdGF0ZSA9IEVQMF9JRExFOworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKgloYW5kbGVfZXAgLSBNYW5hZ2UgSS9PIGVuZHBvaW50cworICovCisKK3N0YXRpYyB2b2lkIHMzYzI0MTBfdWRjX2hhbmRsZV9lcChzdHJ1Y3QgczNjMjQxMF9lcCAqZXApCit7CisJc3RydWN0IHMzYzI0MTBfcmVxdWVzdAkqcmVxOworCWludAkJCWlzX2luID0gZXAtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOOworCXUzMgkJCWVwX2NzcjE7CisJdTMyCQkJaWR4OworCisJaWYgKGxpa2VseSAoIWxpc3RfZW1wdHkoJmVwLT5xdWV1ZSkpKQorCQlyZXEgPSBsaXN0X2VudHJ5KGVwLT5xdWV1ZS5uZXh0LAorCQkJCXN0cnVjdCBzM2MyNDEwX3JlcXVlc3QsIHF1ZXVlKTsKKwllbHNlCisJCXJlcSA9IE5VTEw7CisKKwlpZHggPSBlcC0+YkVuZHBvaW50QWRkcmVzcyAmIDB4N0Y7CisKKwlpZiAoaXNfaW4pIHsKKwkJdWRjX3dyaXRlKGlkeCwgUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKKwkJZXBfY3NyMSA9IHVkY19yZWFkKFMzQzI0MTBfVURDX0lOX0NTUjFfUkVHKTsKKwkJZHByaW50ayhERUJVR19WRVJCT1NFLCAiZXAlMDFkIHdyaXRlIGNzcjolMDJ4ICVkXG4iLAorCQkJaWR4LCBlcF9jc3IxLCByZXEgPyAxIDogMCk7CisKKwkJaWYgKGVwX2NzcjEgJiBTM0MyNDEwX1VEQ19JQ1NSMV9TRU5UU1RMKSB7CisJCQlkcHJpbnRrKERFQlVHX1ZFUkJPU0UsICJzdFxuIik7CisJCQl1ZGNfd3JpdGUoaWR4LCBTM0MyNDEwX1VEQ19JTkRFWF9SRUcpOworCQkJdWRjX3dyaXRlKGVwX2NzcjEgJiB+UzNDMjQxMF9VRENfSUNTUjFfU0VOVFNUTCwKKwkJCQkJUzNDMjQxMF9VRENfSU5fQ1NSMV9SRUcpOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKCEoZXBfY3NyMSAmIFMzQzI0MTBfVURDX0lDU1IxX1BLVFJEWSkgJiYgcmVxKSB7CisJCQlzM2MyNDEwX3VkY193cml0ZV9maWZvKGVwLHJlcSk7CisJCX0KKwl9IGVsc2UgeworCQl1ZGNfd3JpdGUoaWR4LCBTM0MyNDEwX1VEQ19JTkRFWF9SRUcpOworCQllcF9jc3IxID0gdWRjX3JlYWQoUzNDMjQxMF9VRENfT1VUX0NTUjFfUkVHKTsKKwkJZHByaW50ayhERUJVR19WRVJCT1NFLCAiZXAlMDFkIHJkIGNzcjolMDJ4XG4iLCBpZHgsIGVwX2NzcjEpOworCisJCWlmIChlcF9jc3IxICYgUzNDMjQxMF9VRENfT0NTUjFfU0VOVFNUTCkgeworCQkJdWRjX3dyaXRlKGlkeCwgUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKKwkJCXVkY193cml0ZShlcF9jc3IxICYgflMzQzI0MTBfVURDX09DU1IxX1NFTlRTVEwsCisJCQkJCVMzQzI0MTBfVURDX09VVF9DU1IxX1JFRyk7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoKGVwX2NzcjEgJiBTM0MyNDEwX1VEQ19PQ1NSMV9QS1RSRFkpICYmIHJlcSkgeworCQkJczNjMjQxMF91ZGNfcmVhZF9maWZvKGVwLHJlcSk7CisJCX0KKwl9Cit9CisKKyNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLWlycS5oPgorCisvKgorICoJczNjMjQxMF91ZGNfaXJxIC0gaW50ZXJydXB0IGhhbmRsZXIKKyAqLworc3RhdGljIGlycXJldHVybl90IHMzYzI0MTBfdWRjX2lycShpbnQgaXJxLCB2b2lkICpfZGV2KQoreworCXN0cnVjdCBzM2MyNDEwX3VkYyAqZGV2ID0gX2RldjsKKwlpbnQgdXNiX3N0YXR1czsKKwlpbnQgdXNiZF9zdGF0dXM7CisJaW50IHB3cl9yZWc7CisJaW50IGVwMGNzcjsKKwlpbnQgaTsKKwl1MzIgaWR4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5sb2NrLCBmbGFncyk7CisKKwkvKiBEcml2ZXIgY29ubmVjdGVkID8gKi8KKwlpZiAoIWRldi0+ZHJpdmVyKSB7CisJCS8qIENsZWFyIGludGVycnVwdHMgKi8KKwkJdWRjX3dyaXRlKHVkY19yZWFkKFMzQzI0MTBfVURDX1VTQl9JTlRfUkVHKSwKKwkJCQlTM0MyNDEwX1VEQ19VU0JfSU5UX1JFRyk7CisJCXVkY193cml0ZSh1ZGNfcmVhZChTM0MyNDEwX1VEQ19FUF9JTlRfUkVHKSwKKwkJCQlTM0MyNDEwX1VEQ19FUF9JTlRfUkVHKTsKKwl9CisKKwkvKiBTYXZlIGluZGV4ICovCisJaWR4ID0gdWRjX3JlYWQoUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKKworCS8qIFJlYWQgc3RhdHVzIHJlZ2lzdGVycyAqLworCXVzYl9zdGF0dXMgPSB1ZGNfcmVhZChTM0MyNDEwX1VEQ19VU0JfSU5UX1JFRyk7CisJdXNiZF9zdGF0dXMgPSB1ZGNfcmVhZChTM0MyNDEwX1VEQ19FUF9JTlRfUkVHKTsKKwlwd3JfcmVnID0gdWRjX3JlYWQoUzNDMjQxMF9VRENfUFdSX1JFRyk7CisKKwl1ZGNfd3JpdGViKGJhc2VfYWRkciwgUzNDMjQxMF9VRENfSU5ERVhfRVAwLCBTM0MyNDEwX1VEQ19JTkRFWF9SRUcpOworCWVwMGNzciA9IHVkY19yZWFkKFMzQzI0MTBfVURDX0lOX0NTUjFfUkVHKTsKKworCWRwcmludGsoREVCVUdfTk9STUFMLCAidXNicz0lMDJ4LCB1c2Jkcz0lMDJ4LCBwd3I9JTAyeCBlcDBjc3I9JTAyeFxuIiwKKwkJdXNiX3N0YXR1cywgdXNiZF9zdGF0dXMsIHB3cl9yZWcsIGVwMGNzcik7CisKKwkvKgorCSAqIE5vdywgaGFuZGxlIGludGVycnVwdHMuIFRoZXJlJ3MgdHdvIHR5cGVzIDoKKwkgKiAtIFJlc2V0LCBSZXN1bWUsIFN1c3BlbmQgY29taW5nIC0+IHVzYl9pbnRfcmVnCisJICogLSBFUCAtPiBlcF9pbnRfcmVnCisJICovCisKKwkvKiBSRVNFVCAqLworCWlmICh1c2Jfc3RhdHVzICYgUzNDMjQxMF9VRENfVVNCSU5UX1JFU0VUKSB7CisJCS8qIHR3byBraW5kIG9mIHJlc2V0IDoKKwkJICogLSByZXNldCBzdGFydCAtPiBwd3IgcmVnID0gOAorCQkgKiAtIHJlc2V0IGVuZCAgIC0+IHB3ciByZWcgPSAwCisJCSAqKi8KKwkJZHByaW50ayhERUJVR19OT1JNQUwsICJVU0IgcmVzZXQgY3NyICV4IHB3ciAleFxuIiwKKwkJCWVwMGNzciwgcHdyX3JlZyk7CisKKwkJZGV2LT5nYWRnZXQuc3BlZWQgPSBVU0JfU1BFRURfVU5LTk9XTjsKKwkJdWRjX3dyaXRlKDB4MDAsIFMzQzI0MTBfVURDX0lOREVYX1JFRyk7CisJCXVkY193cml0ZSgoZGV2LT5lcFswXS5lcC5tYXhwYWNrZXQgJiAweDdmZikgPj4gMywKKwkJCQlTM0MyNDEwX1VEQ19NQVhQX1JFRyk7CisJCWRldi0+YWRkcmVzcyA9IDA7CisKKwkJZGV2LT5lcDBzdGF0ZSA9IEVQMF9JRExFOworCQlkZXYtPmdhZGdldC5zcGVlZCA9IFVTQl9TUEVFRF9GVUxMOworCisJCS8qIGNsZWFyIGludGVycnVwdCAqLworCQl1ZGNfd3JpdGUoUzNDMjQxMF9VRENfVVNCSU5UX1JFU0VULAorCQkJCVMzQzI0MTBfVURDX1VTQl9JTlRfUkVHKTsKKworCQl1ZGNfd3JpdGUoaWR4LCBTM0MyNDEwX1VEQ19JTkRFWF9SRUcpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCS8qIFJFU1VNRSAqLworCWlmICh1c2Jfc3RhdHVzICYgUzNDMjQxMF9VRENfVVNCSU5UX1JFU1VNRSkgeworCQlkcHJpbnRrKERFQlVHX05PUk1BTCwgIlVTQiByZXN1bWVcbiIpOworCisJCS8qIGNsZWFyIGludGVycnVwdCAqLworCQl1ZGNfd3JpdGUoUzNDMjQxMF9VRENfVVNCSU5UX1JFU1VNRSwKKwkJCQlTM0MyNDEwX1VEQ19VU0JfSU5UX1JFRyk7CisKKwkJaWYgKGRldi0+Z2FkZ2V0LnNwZWVkICE9IFVTQl9TUEVFRF9VTktOT1dOCisJCQkJJiYgZGV2LT5kcml2ZXIKKwkJCQkmJiBkZXYtPmRyaXZlci0+cmVzdW1lKQorCQkJZGV2LT5kcml2ZXItPnJlc3VtZSgmZGV2LT5nYWRnZXQpOworCX0KKworCS8qIFNVU1BFTkQgKi8KKwlpZiAodXNiX3N0YXR1cyAmIFMzQzI0MTBfVURDX1VTQklOVF9TVVNQRU5EKSB7CisJCWRwcmludGsoREVCVUdfTk9STUFMLCAiVVNCIHN1c3BlbmRcbiIpOworCisJCS8qIGNsZWFyIGludGVycnVwdCAqLworCQl1ZGNfd3JpdGUoUzNDMjQxMF9VRENfVVNCSU5UX1NVU1BFTkQsCisJCQkJUzNDMjQxMF9VRENfVVNCX0lOVF9SRUcpOworCisJCWlmIChkZXYtPmdhZGdldC5zcGVlZCAhPSBVU0JfU1BFRURfVU5LTk9XTgorCQkJCSYmIGRldi0+ZHJpdmVyCisJCQkJJiYgZGV2LT5kcml2ZXItPnN1c3BlbmQpCisJCQlkZXYtPmRyaXZlci0+c3VzcGVuZCgmZGV2LT5nYWRnZXQpOworCisJCWRldi0+ZXAwc3RhdGUgPSBFUDBfSURMRTsKKwl9CisKKwkvKiBFUCAqLworCS8qIGNvbnRyb2wgdHJhZmZpYyAqLworCS8qIGNoZWNrIG9uIGVwMGNzciAhPSAwIGlzIG5vdCBhIGdvb2QgaWRlYSBhcyBjbGVhcmluZyBpbl9wa3RfcmVhZHkKKwkgKiBnZW5lcmF0ZSBhbiBpbnRlcnJ1cHQKKwkgKi8KKwlpZiAodXNiZF9zdGF0dXMgJiBTM0MyNDEwX1VEQ19JTlRfRVAwKSB7CisJCWRwcmludGsoREVCVUdfVkVSQk9TRSwgIlVTQiBlcDAgaXJxXG4iKTsKKwkJLyogQ2xlYXIgdGhlIGludGVycnVwdCBiaXQgYnkgc2V0dGluZyBpdCB0byAxICovCisJCXVkY193cml0ZShTM0MyNDEwX1VEQ19JTlRfRVAwLCBTM0MyNDEwX1VEQ19FUF9JTlRfUkVHKTsKKwkJczNjMjQxMF91ZGNfaGFuZGxlX2VwMChkZXYpOworCX0KKworCS8qIGVuZHBvaW50IGRhdGEgdHJhbnNmZXJzICovCisJZm9yIChpID0gMTsgaSA8IFMzQzI0MTBfRU5EUE9JTlRTOyBpKyspIHsKKwkJdTMyIHRtcCA9IDEgPDwgaTsKKwkJaWYgKHVzYmRfc3RhdHVzICYgdG1wKSB7CisJCQlkcHJpbnRrKERFQlVHX1ZFUkJPU0UsICJVU0IgZXAlZCBpcnFcbiIsIGkpOworCisJCQkvKiBDbGVhciB0aGUgaW50ZXJydXB0IGJpdCBieSBzZXR0aW5nIGl0IHRvIDEgKi8KKwkJCXVkY193cml0ZSh0bXAsIFMzQzI0MTBfVURDX0VQX0lOVF9SRUcpOworCQkJczNjMjQxMF91ZGNfaGFuZGxlX2VwKCZkZXYtPmVwW2ldKTsKKwkJfQorCX0KKworCWRwcmludGsoREVCVUdfVkVSQk9TRSwgImlycTogJWQgczNjMjQxMF91ZGNfZG9uZS5cbiIsIGlycSk7CisKKwkvKiBSZXN0b3JlIG9sZCBpbmRleCAqLworCXVkY193cml0ZShpZHgsIFMzQzI0MTBfVURDX0lOREVYX1JFRyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzM2MyNDEwX2VwX29wcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgczNjMjQxMF9lcCAqdG9fczNjMjQxMF9lcChzdHJ1Y3QgdXNiX2VwICplcCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGVwLCBzdHJ1Y3QgczNjMjQxMF9lcCwgZXApOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzM2MyNDEwX3VkYyAqdG9fczNjMjQxMF91ZGMoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGdhZGdldCwgc3RydWN0IHMzYzI0MTBfdWRjLCBnYWRnZXQpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzM2MyNDEwX3JlcXVlc3QgKnRvX3MzYzI0MTBfcmVxKHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxKQoreworCXJldHVybiBjb250YWluZXJfb2YocmVxLCBzdHJ1Y3QgczNjMjQxMF9yZXF1ZXN0LCByZXEpOworfQorCisvKgorICoJczNjMjQxMF91ZGNfZXBfZW5hYmxlCisgKi8KK3N0YXRpYyBpbnQgczNjMjQxMF91ZGNfZXBfZW5hYmxlKHN0cnVjdCB1c2JfZXAgKl9lcCwKKwkJCQkgY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICpkZXNjKQoreworCXN0cnVjdCBzM2MyNDEwX3VkYwkqZGV2OworCXN0cnVjdCBzM2MyNDEwX2VwCSplcDsKKwl1MzIJCQltYXgsIHRtcDsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKwl1MzIJCQljc3IxLGNzcjI7CisJdTMyCQkJaW50X2VuX3JlZzsKKworCWVwID0gdG9fczNjMjQxMF9lcChfZXApOworCisJaWYgKCFfZXAgfHwgIWRlc2MgfHwgZXAtPmRlc2MKKwkJCXx8IF9lcC0+bmFtZSA9PSBlcDBuYW1lCisJCQl8fCBkZXNjLT5iRGVzY3JpcHRvclR5cGUgIT0gVVNCX0RUX0VORFBPSU5UKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldiA9IGVwLT5kZXY7CisJaWYgKCFkZXYtPmRyaXZlciB8fCBkZXYtPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfVU5LTk9XTikKKwkJcmV0dXJuIC1FU0hVVERPV047CisKKwltYXggPSBsZTE2X3RvX2NwdShkZXNjLT53TWF4UGFja2V0U2l6ZSkgJiAweDFmZmY7CisKKwlsb2NhbF9pcnFfc2F2ZSAoZmxhZ3MpOworCV9lcC0+bWF4cGFja2V0ID0gbWF4ICYgMHg3ZmY7CisJZXAtPmRlc2MgPSBkZXNjOworCWVwLT5oYWx0ZWQgPSAwOworCWVwLT5iRW5kcG9pbnRBZGRyZXNzID0gZGVzYy0+YkVuZHBvaW50QWRkcmVzczsKKworCS8qIHNldCBtYXggcGFja2V0ICovCisJdWRjX3dyaXRlKGVwLT5udW0sIFMzQzI0MTBfVURDX0lOREVYX1JFRyk7CisJdWRjX3dyaXRlKG1heCA+PiAzLCBTM0MyNDEwX1VEQ19NQVhQX1JFRyk7CisKKwkvKiBzZXQgdHlwZSwgZGlyZWN0aW9uLCBhZGRyZXNzOyByZXNldCBmaWZvIGNvdW50ZXJzICovCisJaWYgKGRlc2MtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKSB7CisJCWNzcjEgPSBTM0MyNDEwX1VEQ19JQ1NSMV9GRkxVU0h8UzNDMjQxMF9VRENfSUNTUjFfQ0xSRFQ7CisJCWNzcjIgPSBTM0MyNDEwX1VEQ19JQ1NSMl9NT0RFSU58UzNDMjQxMF9VRENfSUNTUjJfRE1BSUVOOworCisJCXVkY193cml0ZShlcC0+bnVtLCBTM0MyNDEwX1VEQ19JTkRFWF9SRUcpOworCQl1ZGNfd3JpdGUoY3NyMSwgUzNDMjQxMF9VRENfSU5fQ1NSMV9SRUcpOworCQl1ZGNfd3JpdGUoZXAtPm51bSwgUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKKwkJdWRjX3dyaXRlKGNzcjIsIFMzQzI0MTBfVURDX0lOX0NTUjJfUkVHKTsKKwl9IGVsc2UgeworCQkvKiBkb24ndCBmbHVzaCBpbiBmaWZvIG9yIGl0IHdpbGwgY2F1c2UgZW5kcG9pbnQgaW50ZXJydXB0ICovCisJCWNzcjEgPSBTM0MyNDEwX1VEQ19JQ1NSMV9DTFJEVDsKKwkJY3NyMiA9IFMzQzI0MTBfVURDX0lDU1IyX0RNQUlFTjsKKworCQl1ZGNfd3JpdGUoZXAtPm51bSwgUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKKwkJdWRjX3dyaXRlKGNzcjEsIFMzQzI0MTBfVURDX0lOX0NTUjFfUkVHKTsKKwkJdWRjX3dyaXRlKGVwLT5udW0sIFMzQzI0MTBfVURDX0lOREVYX1JFRyk7CisJCXVkY193cml0ZShjc3IyLCBTM0MyNDEwX1VEQ19JTl9DU1IyX1JFRyk7CisKKwkJY3NyMSA9IFMzQzI0MTBfVURDX09DU1IxX0ZGTFVTSCB8IFMzQzI0MTBfVURDX09DU1IxX0NMUkRUOworCQljc3IyID0gUzNDMjQxMF9VRENfT0NTUjJfRE1BSUVOOworCisJCXVkY193cml0ZShlcC0+bnVtLCBTM0MyNDEwX1VEQ19JTkRFWF9SRUcpOworCQl1ZGNfd3JpdGUoY3NyMSwgUzNDMjQxMF9VRENfT1VUX0NTUjFfUkVHKTsKKwkJdWRjX3dyaXRlKGVwLT5udW0sIFMzQzI0MTBfVURDX0lOREVYX1JFRyk7CisJCXVkY193cml0ZShjc3IyLCBTM0MyNDEwX1VEQ19PVVRfQ1NSMl9SRUcpOworCX0KKworCS8qIGVuYWJsZSBpcnFzICovCisJaW50X2VuX3JlZyA9IHVkY19yZWFkKFMzQzI0MTBfVURDX0VQX0lOVF9FTl9SRUcpOworCXVkY193cml0ZShpbnRfZW5fcmVnIHwgKDEgPDwgZXAtPm51bSksIFMzQzI0MTBfVURDX0VQX0lOVF9FTl9SRUcpOworCisJLyogcHJpbnQgc29tZSBkZWJ1ZyBtZXNzYWdlICovCisJdG1wID0gZGVzYy0+YkVuZHBvaW50QWRkcmVzczsKKwlkcHJpbnRrIChERUJVR19OT1JNQUwsICJlbmFibGUgJXMoJWQpIGVwJXglcy1ibGsgbWF4ICUwMnhcbiIsCisJCSBfZXAtPm5hbWUsZXAtPm51bSwgdG1wLAorCQkgZGVzYy0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9ESVJfSU4gPyAiaW4iIDogIm91dCIsIG1heCk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZSAoZmxhZ3MpOworCXMzYzI0MTBfdWRjX3NldF9oYWx0KF9lcCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHMzYzI0MTBfdWRjX2VwX2Rpc2FibGUKKyAqLworc3RhdGljIGludCBzM2MyNDEwX3VkY19lcF9kaXNhYmxlKHN0cnVjdCB1c2JfZXAgKl9lcCkKK3sKKwlzdHJ1Y3QgczNjMjQxMF9lcCAqZXAgPSB0b19zM2MyNDEwX2VwKF9lcCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgaW50X2VuX3JlZzsKKworCWlmICghX2VwIHx8ICFlcC0+ZGVzYykgeworCQlkcHJpbnRrKERFQlVHX05PUk1BTCwgIiVzIG5vdCBlbmFibGVkXG4iLAorCQkJX2VwID8gZXAtPmVwLm5hbWUgOiBOVUxMKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJZHByaW50ayhERUJVR19OT1JNQUwsICJlcF9kaXNhYmxlOiAlc1xuIiwgX2VwLT5uYW1lKTsKKworCWVwLT5kZXNjID0gTlVMTDsKKwllcC0+aGFsdGVkID0gMTsKKworCXMzYzI0MTBfdWRjX251a2UgKGVwLT5kZXYsIGVwLCAtRVNIVVRET1dOKTsKKworCS8qIGRpc2FibGUgaXJxcyAqLworCWludF9lbl9yZWcgPSB1ZGNfcmVhZChTM0MyNDEwX1VEQ19FUF9JTlRfRU5fUkVHKTsKKwl1ZGNfd3JpdGUoaW50X2VuX3JlZyAmIH4oMTw8ZXAtPm51bSksIFMzQzI0MTBfVURDX0VQX0lOVF9FTl9SRUcpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJZHByaW50ayhERUJVR19OT1JNQUwsICIlcyBkaXNhYmxlZFxuIiwgX2VwLT5uYW1lKTsKKworCXJldHVybiAwOworfQorCisvKgorICogczNjMjQxMF91ZGNfYWxsb2NfcmVxdWVzdAorICovCitzdGF0aWMgc3RydWN0IHVzYl9yZXF1ZXN0ICoKK3MzYzI0MTBfdWRjX2FsbG9jX3JlcXVlc3Qoc3RydWN0IHVzYl9lcCAqX2VwLCBnZnBfdCBtZW1fZmxhZ3MpCit7CisJc3RydWN0IHMzYzI0MTBfcmVxdWVzdCAqcmVxOworCisJZHByaW50ayhERUJVR19WRVJCT1NFLCIlcyglcCwlZClcbiIsIF9fZnVuY19fLCBfZXAsIG1lbV9mbGFncyk7CisKKwlpZiAoIV9lcCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXEgPSBremFsbG9jIChzaXplb2Yoc3RydWN0IHMzYzI0MTBfcmVxdWVzdCksIG1lbV9mbGFncyk7CisJaWYgKCFyZXEpCisJCXJldHVybiBOVUxMOworCisJSU5JVF9MSVNUX0hFQUQgKCZyZXEtPnF1ZXVlKTsKKwlyZXR1cm4gJnJlcS0+cmVxOworfQorCisvKgorICogczNjMjQxMF91ZGNfZnJlZV9yZXF1ZXN0CisgKi8KK3N0YXRpYyB2b2lkCitzM2MyNDEwX3VkY19mcmVlX3JlcXVlc3Qoc3RydWN0IHVzYl9lcCAqX2VwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKl9yZXEpCit7CisJc3RydWN0IHMzYzI0MTBfZXAJKmVwID0gdG9fczNjMjQxMF9lcChfZXApOworCXN0cnVjdCBzM2MyNDEwX3JlcXVlc3QJKnJlcSA9IHRvX3MzYzI0MTBfcmVxKF9yZXEpOworCisJZHByaW50ayhERUJVR19WRVJCT1NFLCAiJXMoJXAsJXApXG4iLCBfX2Z1bmNfXywgX2VwLCBfcmVxKTsKKworCWlmICghZXAgfHwgIV9yZXEgfHwgKCFlcC0+ZGVzYyAmJiBfZXAtPm5hbWUgIT0gZXAwbmFtZSkpCisJCXJldHVybjsKKworCVdBUk5fT04gKCFsaXN0X2VtcHR5ICgmcmVxLT5xdWV1ZSkpOworCWtmcmVlKHJlcSk7Cit9CisKKy8qCisgKglzM2MyNDEwX3VkY19hbGxvY19idWZmZXIKKyAqLworc3RhdGljIHZvaWQgKnMzYzI0MTBfdWRjX2FsbG9jX2J1ZmZlcihzdHJ1Y3QgdXNiX2VwICpfZXAsCisJCXVuc2lnbmVkIGJ5dGVzLCBkbWFfYWRkcl90ICpkbWEsIGdmcF90IG1lbV9mbGFncykKK3sKKwljaGFyICpyZXR2YWw7CisKKwlkcHJpbnRrKERFQlVHX1ZFUkJPU0UsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoIXRoZV9jb250cm9sbGVyLT5kcml2ZXIpCisJCXJldHVybiBOVUxMOworCisJcmV0dmFsID0ga21hbGxvYyAoYnl0ZXMsIG1lbV9mbGFncyk7CisJKmRtYSA9IChkbWFfYWRkcl90KSByZXR2YWw7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIHMzYzI0MTBfdWRjX2ZyZWVfYnVmZmVyCisgKi8KK3N0YXRpYyB2b2lkIHMzYzI0MTBfdWRjX2ZyZWVfYnVmZmVyIChzdHJ1Y3QgdXNiX2VwICpfZXAsIHZvaWQgKmJ1ZiwKKwkJZG1hX2FkZHJfdCBkbWEsIHVuc2lnbmVkIGJ5dGVzKQoreworCWRwcmludGsoREVCVUdfVkVSQk9TRSwgIiVzKClcbiIsIF9fZnVuY19fKTsKKworCWlmIChieXRlcykKKwkJa2ZyZWUgKGJ1Zik7Cit9CisKKy8qCisgKglzM2MyNDEwX3VkY19xdWV1ZQorICovCitzdGF0aWMgaW50IHMzYzI0MTBfdWRjX3F1ZXVlKHN0cnVjdCB1c2JfZXAgKl9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpfcmVxLAorCQlnZnBfdCBnZnBfZmxhZ3MpCit7CisJc3RydWN0IHMzYzI0MTBfcmVxdWVzdAkqcmVxID0gdG9fczNjMjQxMF9yZXEoX3JlcSk7CisJc3RydWN0IHMzYzI0MTBfZXAJKmVwID0gdG9fczNjMjQxMF9lcChfZXApOworCXN0cnVjdCBzM2MyNDEwX3VkYwkqZGV2OworCXUzMgkJCWVwX2NzciA9IDA7CisJaW50CQkJZmlmb19jb3VudCA9IDA7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisKKwlpZiAodW5saWtlbHkgKCFfZXAgfHwgKCFlcC0+ZGVzYyAmJiBlcC0+ZXAubmFtZSAhPSBlcDBuYW1lKSkpIHsKKwkJZHByaW50ayhERUJVR19OT1JNQUwsICIlczogaW52YWxpZCBhcmdzXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRldiA9IGVwLT5kZXY7CisJaWYgKHVubGlrZWx5ICghZGV2LT5kcml2ZXIKKwkJCXx8IGRldi0+Z2FkZ2V0LnNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOKSkgeworCQlyZXR1cm4gLUVTSFVURE9XTjsKKwl9CisKKwlsb2NhbF9pcnFfc2F2ZSAoZmxhZ3MpOworCisJaWYgKHVubGlrZWx5KCFfcmVxIHx8ICFfcmVxLT5jb21wbGV0ZQorCQkJfHwgIV9yZXEtPmJ1ZiB8fCAhbGlzdF9lbXB0eSgmcmVxLT5xdWV1ZSkpKSB7CisJCWlmICghX3JlcSkKKwkJCWRwcmludGsoREVCVUdfTk9STUFMLCAiJXM6IDEgWCBYIFhcbiIsIF9fZnVuY19fKTsKKwkJZWxzZSB7CisJCQlkcHJpbnRrKERFQlVHX05PUk1BTCwgIiVzOiAwICUwMWQgJTAxZCAlMDFkXG4iLAorCQkJCV9fZnVuY19fLCAhX3JlcS0+Y29tcGxldGUsIV9yZXEtPmJ1ZiwKKwkJCQkhbGlzdF9lbXB0eSgmcmVxLT5xdWV1ZSkpOworCQl9CisKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlfcmVxLT5zdGF0dXMgPSAtRUlOUFJPR1JFU1M7CisJX3JlcS0+YWN0dWFsID0gMDsKKworCWRwcmludGsoREVCVUdfVkVSQk9TRSwgIiVzOiBlcCV4IGxlbiAlZFxuIiwKKwkJIF9fZnVuY19fLCBlcC0+YkVuZHBvaW50QWRkcmVzcywgX3JlcS0+bGVuZ3RoKTsKKworCWlmIChlcC0+YkVuZHBvaW50QWRkcmVzcykgeworCQl1ZGNfd3JpdGUoZXAtPmJFbmRwb2ludEFkZHJlc3MgJiAweDdGLCBTM0MyNDEwX1VEQ19JTkRFWF9SRUcpOworCisJCWVwX2NzciA9IHVkY19yZWFkKChlcC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9ESVJfSU4pCisJCQkJPyBTM0MyNDEwX1VEQ19JTl9DU1IxX1JFRworCQkJCTogUzNDMjQxMF9VRENfT1VUX0NTUjFfUkVHKTsKKwkJZmlmb19jb3VudCA9IHMzYzI0MTBfdWRjX2ZpZm9fY291bnRfb3V0KCk7CisJfSBlbHNlIHsKKwkJdWRjX3dyaXRlKDAsIFMzQzI0MTBfVURDX0lOREVYX1JFRyk7CisJCWVwX2NzciA9IHVkY19yZWFkKFMzQzI0MTBfVURDX0lOX0NTUjFfUkVHKTsKKwkJZmlmb19jb3VudCA9IHMzYzI0MTBfdWRjX2ZpZm9fY291bnRfb3V0KCk7CisJfQorCisJLyoga2lja3N0YXJ0IHRoaXMgaS9vIHF1ZXVlPyAqLworCWlmIChsaXN0X2VtcHR5KCZlcC0+cXVldWUpICYmICFlcC0+aGFsdGVkKSB7CisJCWlmIChlcC0+YkVuZHBvaW50QWRkcmVzcyA9PSAwIC8qIGVwMCAqLykgeworCQkJc3dpdGNoIChkZXYtPmVwMHN0YXRlKSB7CisJCQljYXNlIEVQMF9JTl9EQVRBX1BIQVNFOgorCQkJCWlmICghKGVwX2NzciZTM0MyNDEwX1VEQ19FUDBfQ1NSX0lQS1JEWSkKKwkJCQkJCSYmIHMzYzI0MTBfdWRjX3dyaXRlX2ZpZm8oZXAsCisJCQkJCQkJcmVxKSkgeworCQkJCQlkZXYtPmVwMHN0YXRlID0gRVAwX0lETEU7CisJCQkJCXJlcSA9IE5VTEw7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIEVQMF9PVVRfREFUQV9QSEFTRToKKwkJCQlpZiAoKCFfcmVxLT5sZW5ndGgpCisJCQkJCXx8ICgoZXBfY3NyICYgUzNDMjQxMF9VRENfT0NTUjFfUEtUUkRZKQorCQkJCQkJJiYgczNjMjQxMF91ZGNfcmVhZF9maWZvKGVwLAorCQkJCQkJCXJlcSkpKSB7CisJCQkJCWRldi0+ZXAwc3RhdGUgPSBFUDBfSURMRTsKKwkJCQkJcmVxID0gTlVMTDsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkJCXJldHVybiAtRUwySExUOworCQkJfQorCQl9IGVsc2UgaWYgKChlcC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9ESVJfSU4pICE9IDAKKwkJCQkmJiAoIShlcF9jc3ImUzNDMjQxMF9VRENfT0NTUjFfUEtUUkRZKSkKKwkJCQkmJiBzM2MyNDEwX3VkY193cml0ZV9maWZvKGVwLCByZXEpKSB7CisJCQlyZXEgPSBOVUxMOworCQl9IGVsc2UgaWYgKChlcF9jc3IgJiBTM0MyNDEwX1VEQ19PQ1NSMV9QS1RSRFkpCisJCQkJJiYgZmlmb19jb3VudAorCQkJCSYmIHMzYzI0MTBfdWRjX3JlYWRfZmlmbyhlcCwgcmVxKSkgeworCQkJcmVxID0gTlVMTDsKKwkJfQorCX0KKworCS8qIHBpbyBvciBkbWEgaXJxIGhhbmRsZXIgYWR2YW5jZXMgdGhlIHF1ZXVlLiAqLworCWlmIChsaWtlbHkgKHJlcSAhPSAwKSkKKwkJbGlzdF9hZGRfdGFpbCgmcmVxLT5xdWV1ZSwgJmVwLT5xdWV1ZSk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlkcHJpbnRrKERFQlVHX1ZFUkJPU0UsICIlcyBva1xuIiwgX19mdW5jX18pOworCXJldHVybiAwOworfQorCisvKgorICoJczNjMjQxMF91ZGNfZGVxdWV1ZQorICovCitzdGF0aWMgaW50IHMzYzI0MTBfdWRjX2RlcXVldWUoc3RydWN0IHVzYl9lcCAqX2VwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKl9yZXEpCit7CisJc3RydWN0IHMzYzI0MTBfZXAJKmVwID0gdG9fczNjMjQxMF9lcChfZXApOworCXN0cnVjdCBzM2MyNDEwX3VkYwkqdWRjOworCWludAkJCXJldHZhbCA9IC1FSU5WQUw7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisJc3RydWN0IHMzYzI0MTBfcmVxdWVzdAkqcmVxID0gTlVMTDsKKworCWRwcmludGsoREVCVUdfVkVSQk9TRSwgIiVzKCVwLCVwKVxuIiwgX19mdW5jX18sIF9lcCwgX3JlcSk7CisKKwlpZiAoIXRoZV9jb250cm9sbGVyLT5kcml2ZXIpCisJCXJldHVybiAtRVNIVVRET1dOOworCisJaWYgKCFfZXAgfHwgIV9yZXEpCisJCXJldHVybiByZXR2YWw7CisKKwl1ZGMgPSB0b19zM2MyNDEwX3VkYyhlcC0+Z2FkZ2V0KTsKKworCWxvY2FsX2lycV9zYXZlIChmbGFncyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5IChyZXEsICZlcC0+cXVldWUsIHF1ZXVlKSB7CisJCWlmICgmcmVxLT5yZXEgPT0gX3JlcSkgeworCQkJbGlzdF9kZWxfaW5pdCAoJnJlcS0+cXVldWUpOworCQkJX3JlcS0+c3RhdHVzID0gLUVDT05OUkVTRVQ7CisJCQlyZXR2YWwgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAocmV0dmFsID09IDApIHsKKwkJZHByaW50ayhERUJVR19WRVJCT1NFLAorCQkJImRlcXVldWVkIHJlcSAlcCBmcm9tICVzLCBsZW4gJWQgYnVmICVwXG4iLAorCQkJcmVxLCBfZXAtPm5hbWUsIF9yZXEtPmxlbmd0aCwgX3JlcS0+YnVmKTsKKworCQlzM2MyNDEwX3VkY19kb25lKGVwLCByZXEsIC1FQ09OTlJFU0VUKTsKKwl9CisKKwlsb2NhbF9pcnFfcmVzdG9yZSAoZmxhZ3MpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBzM2MyNDEwX3VkY19zZXRfaGFsdAorICovCitzdGF0aWMgaW50IHMzYzI0MTBfdWRjX3NldF9oYWx0KHN0cnVjdCB1c2JfZXAgKl9lcCwgaW50IHZhbHVlKQoreworCXN0cnVjdCBzM2MyNDEwX2VwCSplcCA9IHRvX3MzYzI0MTBfZXAoX2VwKTsKKwl1MzIJCQllcF9jc3IgPSAwOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCXUzMgkJCWlkeDsKKworCWlmICh1bmxpa2VseSAoIV9lcCB8fCAoIWVwLT5kZXNjICYmIGVwLT5lcC5uYW1lICE9IGVwMG5hbWUpKSkgeworCQlkcHJpbnRrKERFQlVHX05PUk1BTCwgIiVzOiBpbnZhbCAyXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWxvY2FsX2lycV9zYXZlIChmbGFncyk7CisKKwlpZHggPSBlcC0+YkVuZHBvaW50QWRkcmVzcyAmIDB4N0Y7CisKKwlpZiAoaWR4ID09IDApIHsKKwkJczNjMjQxMF91ZGNfc2V0X2VwMF9zcyhiYXNlX2FkZHIpOworCQlzM2MyNDEwX3VkY19zZXRfZXAwX2RlX291dChiYXNlX2FkZHIpOworCX0gZWxzZSB7CisJCXVkY193cml0ZShpZHgsIFMzQzI0MTBfVURDX0lOREVYX1JFRyk7CisJCWVwX2NzciA9IHVkY19yZWFkKChlcC0+YkVuZHBvaW50QWRkcmVzcyAmVVNCX0RJUl9JTikKKwkJCQk/IFMzQzI0MTBfVURDX0lOX0NTUjFfUkVHCisJCQkJOiBTM0MyNDEwX1VEQ19PVVRfQ1NSMV9SRUcpOworCisJCWlmICgoZXAtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKSAhPSAwKSB7CisJCQlpZiAodmFsdWUpCisJCQkJdWRjX3dyaXRlKGVwX2NzciB8IFMzQzI0MTBfVURDX0lDU1IxX1NFTkRTVEwsCisJCQkJCVMzQzI0MTBfVURDX0lOX0NTUjFfUkVHKTsKKwkJCWVsc2UgeworCQkJCWVwX2NzciAmPSB+UzNDMjQxMF9VRENfSUNTUjFfU0VORFNUTDsKKwkJCQl1ZGNfd3JpdGUoZXBfY3NyLCBTM0MyNDEwX1VEQ19JTl9DU1IxX1JFRyk7CisJCQkJZXBfY3NyIHw9IFMzQzI0MTBfVURDX0lDU1IxX0NMUkRUOworCQkJCXVkY193cml0ZShlcF9jc3IsIFMzQzI0MTBfVURDX0lOX0NTUjFfUkVHKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICh2YWx1ZSkKKwkJCQl1ZGNfd3JpdGUoZXBfY3NyIHwgUzNDMjQxMF9VRENfT0NTUjFfU0VORFNUTCwKKwkJCQkJUzNDMjQxMF9VRENfT1VUX0NTUjFfUkVHKTsKKwkJCWVsc2UgeworCQkJCWVwX2NzciAmPSB+UzNDMjQxMF9VRENfT0NTUjFfU0VORFNUTDsKKwkJCQl1ZGNfd3JpdGUoZXBfY3NyLCBTM0MyNDEwX1VEQ19PVVRfQ1NSMV9SRUcpOworCQkJCWVwX2NzciB8PSBTM0MyNDEwX1VEQ19PQ1NSMV9DTFJEVDsKKwkJCQl1ZGNfd3JpdGUoZXBfY3NyLCBTM0MyNDEwX1VEQ19PVVRfQ1NSMV9SRUcpOworCQkJfQorCQl9CisJfQorCisJZXAtPmhhbHRlZCA9IHZhbHVlID8gMSA6IDA7CisJbG9jYWxfaXJxX3Jlc3RvcmUgKGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9lcF9vcHMgczNjMjQxMF9lcF9vcHMgPSB7CisJLmVuYWJsZQkJPSBzM2MyNDEwX3VkY19lcF9lbmFibGUsCisJLmRpc2FibGUJPSBzM2MyNDEwX3VkY19lcF9kaXNhYmxlLAorCisJLmFsbG9jX3JlcXVlc3QJPSBzM2MyNDEwX3VkY19hbGxvY19yZXF1ZXN0LAorCS5mcmVlX3JlcXVlc3QJPSBzM2MyNDEwX3VkY19mcmVlX3JlcXVlc3QsCisKKwkuYWxsb2NfYnVmZmVyCT0gczNjMjQxMF91ZGNfYWxsb2NfYnVmZmVyLAorCS5mcmVlX2J1ZmZlcgk9IHMzYzI0MTBfdWRjX2ZyZWVfYnVmZmVyLAorCisJLnF1ZXVlCQk9IHMzYzI0MTBfdWRjX3F1ZXVlLAorCS5kZXF1ZXVlCT0gczNjMjQxMF91ZGNfZGVxdWV1ZSwKKworCS5zZXRfaGFsdAk9IHMzYzI0MTBfdWRjX3NldF9oYWx0LAorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHVzYl9nYWRnZXRfb3BzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICoJczNjMjQxMF91ZGNfZ2V0X2ZyYW1lCisgKi8KK3N0YXRpYyBpbnQgczNjMjQxMF91ZGNfZ2V0X2ZyYW1lKHN0cnVjdCB1c2JfZ2FkZ2V0ICpfZ2FkZ2V0KQoreworCWludCB0bXA7CisKKwlkcHJpbnRrKERFQlVHX1ZFUkJPU0UsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwl0bXAgPSB1ZGNfcmVhZChTM0MyNDEwX1VEQ19GUkFNRV9OVU0yX1JFRykgPDwgODsKKwl0bXAgfD0gdWRjX3JlYWQoUzNDMjQxMF9VRENfRlJBTUVfTlVNMV9SRUcpOworCXJldHVybiB0bXA7Cit9CisKKy8qCisgKglzM2MyNDEwX3VkY193YWtldXAKKyAqLworc3RhdGljIGludCBzM2MyNDEwX3VkY193YWtldXAoc3RydWN0IHVzYl9nYWRnZXQgKl9nYWRnZXQpCit7CisJZHByaW50ayhERUJVR19OT1JNQUwsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglzM2MyNDEwX3VkY19zZXRfc2VsZnBvd2VyZWQKKyAqLworc3RhdGljIGludCBzM2MyNDEwX3VkY19zZXRfc2VsZnBvd2VyZWQoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCwgaW50IHZhbHVlKQoreworCXN0cnVjdCBzM2MyNDEwX3VkYyAqdWRjID0gdG9fczNjMjQxMF91ZGMoZ2FkZ2V0KTsKKworCWRwcmludGsoREVCVUdfTk9STUFMLCAiJXMoKVxuIiwgX19mdW5jX18pOworCisJaWYgKHZhbHVlKQorCQl1ZGMtPmRldnN0YXR1cyB8PSAoMSA8PCBVU0JfREVWSUNFX1NFTEZfUE9XRVJFRCk7CisJZWxzZQorCQl1ZGMtPmRldnN0YXR1cyAmPSB+KDEgPDwgVVNCX0RFVklDRV9TRUxGX1BPV0VSRUQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHMzYzI0MTBfdWRjX2Rpc2FibGUoc3RydWN0IHMzYzI0MTBfdWRjICpkZXYpOworc3RhdGljIHZvaWQgczNjMjQxMF91ZGNfZW5hYmxlKHN0cnVjdCBzM2MyNDEwX3VkYyAqZGV2KTsKKworc3RhdGljIGludCBzM2MyNDEwX3VkY19zZXRfcHVsbHVwKHN0cnVjdCBzM2MyNDEwX3VkYyAqdWRjLCBpbnQgaXNfb24pCit7CisJZHByaW50ayhERUJVR19OT1JNQUwsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAodWRjX2luZm8gJiYgdWRjX2luZm8tPnVkY19jb21tYW5kKSB7CisJCWlmIChpc19vbikKKwkJCXMzYzI0MTBfdWRjX2VuYWJsZSh1ZGMpOworCQllbHNlIHsKKwkJCWlmICh1ZGMtPmdhZGdldC5zcGVlZCAhPSBVU0JfU1BFRURfVU5LTk9XTikgeworCQkJCWlmICh1ZGMtPmRyaXZlciAmJiB1ZGMtPmRyaXZlci0+ZGlzY29ubmVjdCkKKwkJCQkJdWRjLT5kcml2ZXItPmRpc2Nvbm5lY3QoJnVkYy0+Z2FkZ2V0KTsKKworCQkJfQorCQkJczNjMjQxMF91ZGNfZGlzYWJsZSh1ZGMpOworCQl9CisJfQorCWVsc2UKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczNjMjQxMF91ZGNfdmJ1c19zZXNzaW9uKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQsIGludCBpc19hY3RpdmUpCit7CisJc3RydWN0IHMzYzI0MTBfdWRjICp1ZGMgPSB0b19zM2MyNDEwX3VkYyhnYWRnZXQpOworCisJZHByaW50ayhERUJVR19OT1JNQUwsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwl1ZGMtPnZidXMgPSAoaXNfYWN0aXZlICE9IDApOworCXMzYzI0MTBfdWRjX3NldF9wdWxsdXAodWRjLCBpc19hY3RpdmUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHMzYzI0MTBfdWRjX3B1bGx1cChzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0LCBpbnQgaXNfb24pCit7CisJc3RydWN0IHMzYzI0MTBfdWRjICp1ZGMgPSB0b19zM2MyNDEwX3VkYyhnYWRnZXQpOworCisJZHByaW50ayhERUJVR19OT1JNQUwsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlzM2MyNDEwX3VkY19zZXRfcHVsbHVwKHVkYywgaXNfb24gPyAwIDogMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzM2MyNDEwX3VkY192YnVzX2lycShpbnQgaXJxLCB2b2lkICpfZGV2KQoreworCXN0cnVjdCBzM2MyNDEwX3VkYwkqZGV2ID0gX2RldjsKKwl1bnNpZ25lZCBpbnQJCXZhbHVlOworCisJZHByaW50ayhERUJVR19OT1JNQUwsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisJdmFsdWUgPSBzM2MyNDEwX2dwaW9fZ2V0cGluKHVkY19pbmZvLT52YnVzX3Bpbik7CisKKwlpZiAodWRjX2luZm8tPnZidXNfcGluX2ludmVydGVkKQorCQl2YWx1ZSA9ICF2YWx1ZTsKKworCWlmICh2YWx1ZSAhPSBkZXYtPnZidXMpCisJCXMzYzI0MTBfdWRjX3ZidXNfc2Vzc2lvbigmZGV2LT5nYWRnZXQsIHZhbHVlKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBzM2MyNDEwX3ZidXNfZHJhdyhzdHJ1Y3QgdXNiX2dhZGdldCAqX2dhZGdldCwgdW5zaWduZWQgbWEpCit7CisJZHByaW50ayhERUJVR19OT1JNQUwsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAodWRjX2luZm8gJiYgdWRjX2luZm8tPnZidXNfZHJhdykgeworCQl1ZGNfaW5mby0+dmJ1c19kcmF3KG1hKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FTk9UU1VQUDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZ2FkZ2V0X29wcyBzM2MyNDEwX29wcyA9IHsKKwkuZ2V0X2ZyYW1lCQk9IHMzYzI0MTBfdWRjX2dldF9mcmFtZSwKKwkud2FrZXVwCQkJPSBzM2MyNDEwX3VkY193YWtldXAsCisJLnNldF9zZWxmcG93ZXJlZAk9IHMzYzI0MTBfdWRjX3NldF9zZWxmcG93ZXJlZCwKKwkucHVsbHVwCQkJPSBzM2MyNDEwX3VkY19wdWxsdXAsCisJLnZidXNfc2Vzc2lvbgkJPSBzM2MyNDEwX3VkY192YnVzX3Nlc3Npb24sCisJLnZidXNfZHJhdwkJPSBzM2MyNDEwX3ZidXNfZHJhdywKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnYWRnZXQgZHJpdmVyIGhhbmRsaW5nLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBzM2MyNDEwX3VkY19kaXNhYmxlCisgKi8KK3N0YXRpYyB2b2lkIHMzYzI0MTBfdWRjX2Rpc2FibGUoc3RydWN0IHMzYzI0MTBfdWRjICpkZXYpCit7CisJZHByaW50ayhERUJVR19OT1JNQUwsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJdWRjX3dyaXRlKDB4MDAsIFMzQzI0MTBfVURDX1VTQl9JTlRfRU5fUkVHKTsKKwl1ZGNfd3JpdGUoMHgwMCwgUzNDMjQxMF9VRENfRVBfSU5UX0VOX1JFRyk7CisKKwkvKiBDbGVhciB0aGUgaW50ZXJydXB0IHJlZ2lzdGVycyAqLworCXVkY193cml0ZShTM0MyNDEwX1VEQ19VU0JJTlRfUkVTRVQKKwkJCQl8IFMzQzI0MTBfVURDX1VTQklOVF9SRVNVTUUKKwkJCQl8IFMzQzI0MTBfVURDX1VTQklOVF9TVVNQRU5ELAorCQkJUzNDMjQxMF9VRENfVVNCX0lOVF9SRUcpOworCisJdWRjX3dyaXRlKDB4MUYsIFMzQzI0MTBfVURDX0VQX0lOVF9SRUcpOworCisJLyogR29vZCBieWUsIGNydWVsIHdvcmxkICovCisJaWYgKHVkY19pbmZvICYmIHVkY19pbmZvLT51ZGNfY29tbWFuZCkKKwkJdWRjX2luZm8tPnVkY19jb21tYW5kKFMzQzI0MTBfVURDX1BfRElTQUJMRSk7CisKKwkvKiBTZXQgc3BlZWQgdG8gdW5rbm93biAqLworCWRldi0+Z2FkZ2V0LnNwZWVkID0gVVNCX1NQRUVEX1VOS05PV047Cit9CisKKy8qCisgKiBzM2MyNDEwX3VkY19yZWluaXQKKyAqLworc3RhdGljIHZvaWQgczNjMjQxMF91ZGNfcmVpbml0KHN0cnVjdCBzM2MyNDEwX3VkYyAqZGV2KQoreworCXUzMiBpOworCisJLyogZGV2aWNlL2VwMCByZWNvcmRzIGluaXQgKi8KKwlJTklUX0xJU1RfSEVBRCAoJmRldi0+Z2FkZ2V0LmVwX2xpc3QpOworCUlOSVRfTElTVF9IRUFEICgmZGV2LT5nYWRnZXQuZXAwLT5lcF9saXN0KTsKKwlkZXYtPmVwMHN0YXRlID0gRVAwX0lETEU7CisKKwlmb3IgKGkgPSAwOyBpIDwgUzNDMjQxMF9FTkRQT0lOVFM7IGkrKykgeworCQlzdHJ1Y3QgczNjMjQxMF9lcCAqZXAgPSAmZGV2LT5lcFtpXTsKKworCQlpZiAoaSAhPSAwKQorCQkJbGlzdF9hZGRfdGFpbCAoJmVwLT5lcC5lcF9saXN0LCAmZGV2LT5nYWRnZXQuZXBfbGlzdCk7CisKKwkJZXAtPmRldiA9IGRldjsKKwkJZXAtPmRlc2MgPSBOVUxMOworCQllcC0+aGFsdGVkID0gMDsKKwkJSU5JVF9MSVNUX0hFQUQgKCZlcC0+cXVldWUpOworCX0KK30KKworLyoKKyAqIHMzYzI0MTBfdWRjX2VuYWJsZQorICovCitzdGF0aWMgdm9pZCBzM2MyNDEwX3VkY19lbmFibGUoc3RydWN0IHMzYzI0MTBfdWRjICpkZXYpCit7CisJaW50IGk7CisKKwlkcHJpbnRrKERFQlVHX05PUk1BTCwgInMzYzI0MTBfdWRjX2VuYWJsZSBjYWxsZWRcbiIpOworCisJLyogZGV2LT5nYWRnZXQuc3BlZWQgPSBVU0JfU1BFRURfVU5LTk9XTjsgKi8KKwlkZXYtPmdhZGdldC5zcGVlZCA9IFVTQl9TUEVFRF9GVUxMOworCisJLyogU2V0IE1BWFAgZm9yIGFsbCBlbmRwb2ludHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUzNDMjQxMF9FTkRQT0lOVFM7IGkrKykgeworCQl1ZGNfd3JpdGUoaSwgUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKKwkJdWRjX3dyaXRlKChkZXYtPmVwW2ldLmVwLm1heHBhY2tldCAmIDB4N2ZmKSA+PiAzLAorCQkJCVMzQzI0MTBfVURDX01BWFBfUkVHKTsKKwl9CisKKwkvKiBTZXQgZGVmYXVsdCBwb3dlciBzdGF0ZSAqLworCXVkY193cml0ZShERUZBVUxUX1BPV0VSX1NUQVRFLCBTM0MyNDEwX1VEQ19QV1JfUkVHKTsKKworCS8qIEVuYWJsZSByZXNldCBhbmQgc3VzcGVuZCBpbnRlcnJ1cHQgaW50ZXJydXB0cyAqLworCXVkY193cml0ZShTM0MyNDEwX1VEQ19VU0JJTlRfUkVTRVQgfCBTM0MyNDEwX1VEQ19VU0JJTlRfU1VTUEVORCwKKwkJCVMzQzI0MTBfVURDX1VTQl9JTlRfRU5fUkVHKTsKKworCS8qIEVuYWJsZSBlcDAgaW50ZXJydXB0ICovCisJdWRjX3dyaXRlKFMzQzI0MTBfVURDX0lOVF9FUDAsIFMzQzI0MTBfVURDX0VQX0lOVF9FTl9SRUcpOworCisJLyogdGltZSB0byBzYXkgImhlbGxvLCB3b3JsZCIgKi8KKwlpZiAodWRjX2luZm8gJiYgdWRjX2luZm8tPnVkY19jb21tYW5kKQorCQl1ZGNfaW5mby0+dWRjX2NvbW1hbmQoUzNDMjQxMF9VRENfUF9FTkFCTEUpOworfQorCisvKgorICoJdXNiX2dhZGdldF9yZWdpc3Rlcl9kcml2ZXIKKyAqLworaW50IHVzYl9nYWRnZXRfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQoreworCXN0cnVjdCBzM2MyNDEwX3VkYyAqdWRjID0gdGhlX2NvbnRyb2xsZXI7CisJaW50CQlyZXR2YWw7CisKKwlkcHJpbnRrKERFQlVHX05PUk1BTCwgInVzYl9nYWRnZXRfcmVnaXN0ZXJfZHJpdmVyKCkgJyVzJ1xuIiwKKwkJZHJpdmVyLT5kcml2ZXIubmFtZSk7CisKKwkvKiBTYW5pdHkgY2hlY2tzICovCisJaWYgKCF1ZGMpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKHVkYy0+ZHJpdmVyKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKCFkcml2ZXItPmJpbmQgfHwgIWRyaXZlci0+c2V0dXAKKwkJCXx8IGRyaXZlci0+c3BlZWQgIT0gVVNCX1NQRUVEX0ZVTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIGRyaXZlcjogYmluZCAlcCBzZXR1cCAlcCBzcGVlZCAlZFxuIiwKKwkJCWRyaXZlci0+YmluZCwgZHJpdmVyLT5zZXR1cCwgZHJpdmVyLT5zcGVlZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKyNpZiBkZWZpbmVkKE1PRFVMRSkKKwlpZiAoIWRyaXZlci0+dW5iaW5kKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBkcml2ZXI6IG5vIHVuYmluZCBtZXRob2RcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisjZW5kaWYKKworCS8qIEhvb2sgdGhlIGRyaXZlciAqLworCXVkYy0+ZHJpdmVyID0gZHJpdmVyOworCXVkYy0+Z2FkZ2V0LmRldi5kcml2ZXIgPSAmZHJpdmVyLT5kcml2ZXI7CisKKwkvKiBCaW5kIHRoZSBkcml2ZXIgKi8KKwlpZiAoKHJldHZhbCA9IGRldmljZV9hZGQoJnVkYy0+Z2FkZ2V0LmRldikpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBpbiBkZXZpY2VfYWRkKCkgOiAlZFxuIixyZXR2YWwpOworCQlnb3RvIHJlZ2lzdGVyX2Vycm9yOworCX0KKworCWRwcmludGsoREVCVUdfTk9STUFMLCAiYmluZGluZyBnYWRnZXQgZHJpdmVyICclcydcbiIsCisJCWRyaXZlci0+ZHJpdmVyLm5hbWUpOworCisJaWYgKChyZXR2YWwgPSBkcml2ZXItPmJpbmQgKCZ1ZGMtPmdhZGdldCkpICE9IDApIHsKKwkJZGV2aWNlX2RlbCgmdWRjLT5nYWRnZXQuZGV2KTsKKwkJZ290byByZWdpc3Rlcl9lcnJvcjsKKwl9CisKKwkvKiBFbmFibGUgdWRjICovCisJczNjMjQxMF91ZGNfZW5hYmxlKHVkYyk7CisKKwlyZXR1cm4gMDsKKworcmVnaXN0ZXJfZXJyb3I6CisJdWRjLT5kcml2ZXIgPSBOVUxMOworCXVkYy0+Z2FkZ2V0LmRldi5kcml2ZXIgPSBOVUxMOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKgl1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyCisgKi8KK2ludCB1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQoreworCXN0cnVjdCBzM2MyNDEwX3VkYyAqdWRjID0gdGhlX2NvbnRyb2xsZXI7CisKKwlpZiAoIXVkYykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIWRyaXZlciB8fCBkcml2ZXIgIT0gdWRjLT5kcml2ZXIgfHwgIWRyaXZlci0+dW5iaW5kKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRwcmludGsoREVCVUdfTk9STUFMLCJ1c2JfZ2FkZ2V0X3JlZ2lzdGVyX2RyaXZlcigpICclcydcbiIsCisJCWRyaXZlci0+ZHJpdmVyLm5hbWUpOworCisJaWYgKGRyaXZlci0+ZGlzY29ubmVjdCkKKwkJZHJpdmVyLT5kaXNjb25uZWN0KCZ1ZGMtPmdhZGdldCk7CisKKwlkZXZpY2VfZGVsKCZ1ZGMtPmdhZGdldC5kZXYpOworCXVkYy0+ZHJpdmVyID0gTlVMTDsKKworCS8qIERpc2FibGUgdWRjICovCisJczNjMjQxMF91ZGNfZGlzYWJsZSh1ZGMpOworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBzdHJ1Y3QgczNjMjQxMF91ZGMgbWVtb3J5ID0geworCS5nYWRnZXQgPSB7CisJCS5vcHMJCT0gJnMzYzI0MTBfb3BzLAorCQkuZXAwCQk9ICZtZW1vcnkuZXBbMF0uZXAsCisJCS5uYW1lCQk9IGdhZGdldF9uYW1lLAorCQkuZGV2ID0geworCQkJLmJ1c19pZAkJPSAiZ2FkZ2V0IiwKKwkJfSwKKwl9LAorCisJLyogY29udHJvbCBlbmRwb2ludCAqLworCS5lcFswXSA9IHsKKwkJLm51bQkJPSAwLAorCQkuZXAgPSB7CisJCQkubmFtZQkJPSBlcDBuYW1lLAorCQkJLm9wcwkJPSAmczNjMjQxMF9lcF9vcHMsCisJCQkubWF4cGFja2V0CT0gRVAwX0ZJRk9fU0laRSwKKwkJfSwKKwkJLmRldgkJPSAmbWVtb3J5LAorCX0sCisKKwkvKiBmaXJzdCBncm91cCBvZiBlbmRwb2ludHMgKi8KKwkuZXBbMV0gPSB7CisJCS5udW0JCT0gMSwKKwkJLmVwID0geworCQkJLm5hbWUJCT0gImVwMS1idWxrIiwKKwkJCS5vcHMJCT0gJnMzYzI0MTBfZXBfb3BzLAorCQkJLm1heHBhY2tldAk9IEVQX0ZJRk9fU0laRSwKKwkJfSwKKwkJLmRldgkJPSAmbWVtb3J5LAorCQkuZmlmb19zaXplCT0gRVBfRklGT19TSVpFLAorCQkuYkVuZHBvaW50QWRkcmVzcyA9IDEsCisJCS5ibUF0dHJpYnV0ZXMJPSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAorCX0sCisJLmVwWzJdID0geworCQkubnVtCQk9IDIsCisJCS5lcCA9IHsKKwkJCS5uYW1lCQk9ICJlcDItYnVsayIsCisJCQkub3BzCQk9ICZzM2MyNDEwX2VwX29wcywKKwkJCS5tYXhwYWNrZXQJPSBFUF9GSUZPX1NJWkUsCisJCX0sCisJCS5kZXYJCT0gJm1lbW9yeSwKKwkJLmZpZm9fc2l6ZQk9IEVQX0ZJRk9fU0laRSwKKwkJLmJFbmRwb2ludEFkZHJlc3MgPSAyLAorCQkuYm1BdHRyaWJ1dGVzCT0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSywKKwl9LAorCS5lcFszXSA9IHsKKwkJLm51bQkJPSAzLAorCQkuZXAgPSB7CisJCQkubmFtZQkJPSAiZXAzLWJ1bGsiLAorCQkJLm9wcwkJPSAmczNjMjQxMF9lcF9vcHMsCisJCQkubWF4cGFja2V0CT0gRVBfRklGT19TSVpFLAorCQl9LAorCQkuZGV2CQk9ICZtZW1vcnksCisJCS5maWZvX3NpemUJPSBFUF9GSUZPX1NJWkUsCisJCS5iRW5kcG9pbnRBZGRyZXNzID0gMywKKwkJLmJtQXR0cmlidXRlcwk9IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCisJfSwKKwkuZXBbNF0gPSB7CisJCS5udW0JCT0gNCwKKwkJLmVwID0geworCQkJLm5hbWUJCT0gImVwNC1idWxrIiwKKwkJCS5vcHMJCT0gJnMzYzI0MTBfZXBfb3BzLAorCQkJLm1heHBhY2tldAk9IEVQX0ZJRk9fU0laRSwKKwkJfSwKKwkJLmRldgkJPSAmbWVtb3J5LAorCQkuZmlmb19zaXplCT0gRVBfRklGT19TSVpFLAorCQkuYkVuZHBvaW50QWRkcmVzcyA9IDQsCisJCS5ibUF0dHJpYnV0ZXMJPSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAorCX0KKworfTsKKworLyoKKyAqCXByb2JlIC0gYmluZHMgdG8gdGhlIHBsYXRmb3JtIGRldmljZQorICovCitzdGF0aWMgaW50IHMzYzI0MTBfdWRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHMzYzI0MTBfdWRjICp1ZGMgPSAmbWVtb3J5OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJaW50IHJldHZhbDsKKwl1bnNpZ25lZCBpbnQgaXJxOworCisJZGV2X2RiZyhkZXYsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwl1c2JfYnVzX2Nsb2NrID0gY2xrX2dldChOVUxMLCAidXNiLWJ1cy1nYWRnZXQiKTsKKwlpZiAoSVNfRVJSKHVzYl9idXNfY2xvY2spKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCB1c2IgYnVzIGNsb2NrIHNvdXJjZVxuIik7CisJCXJldHVybiBQVFJfRVJSKHVzYl9idXNfY2xvY2spOworCX0KKworCWNsa19lbmFibGUodXNiX2J1c19jbG9jayk7CisKKwl1ZGNfY2xvY2sgPSBjbGtfZ2V0KE5VTEwsICJ1c2ItZGV2aWNlIik7CisJaWYgKElTX0VSUih1ZGNfY2xvY2spKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCB1ZGMgY2xvY2sgc291cmNlXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIodWRjX2Nsb2NrKTsKKwl9CisKKwljbGtfZW5hYmxlKHVkY19jbG9jayk7CisKKwltZGVsYXkoMTApOworCisJZGV2X2RiZyhkZXYsICJnb3QgYW5kIGVuYWJsZWQgY2xvY2tzXG4iKTsKKworCWlmIChzdHJuY21wKHBkZXYtPm5hbWUsICJzM2MyNDQwIiwgNykgPT0gMCkgeworCQlkZXZfaW5mbyhkZXYsICJTM0MyNDQwOiBpbmNyZWFzaW5nIEZJRk8gdG8gMTI4IGJ5dGVzXG4iKTsKKwkJbWVtb3J5LmVwWzFdLmZpZm9fc2l6ZSA9IFMzQzI0NDBfRVBfRklGT19TSVpFOworCQltZW1vcnkuZXBbMl0uZmlmb19zaXplID0gUzNDMjQ0MF9FUF9GSUZPX1NJWkU7CisJCW1lbW9yeS5lcFszXS5maWZvX3NpemUgPSBTM0MyNDQwX0VQX0ZJRk9fU0laRTsKKwkJbWVtb3J5LmVwWzRdLmZpZm9fc2l6ZSA9IFMzQzI0NDBfRVBfRklGT19TSVpFOworCX0KKworCXNwaW5fbG9ja19pbml0ICgmdWRjLT5sb2NrKTsKKwl1ZGNfaW5mbyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJcnNyY19zdGFydCA9IFMzQzI0MTBfUEFfVVNCREVWOworCXJzcmNfbGVuICAgPSBTM0MyNFhYX1NaX1VTQkRFVjsKKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJzcmNfc3RhcnQsIHJzcmNfbGVuLCBnYWRnZXRfbmFtZSkpCisJCXJldHVybiAtRUJVU1k7CisKKwliYXNlX2FkZHIgPSBpb3JlbWFwKHJzcmNfc3RhcnQsIHJzcmNfbGVuKTsKKwlpZiAoIWJhc2VfYWRkcikgeworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIGVycl9tZW07CisJfQorCisJZGV2aWNlX2luaXRpYWxpemUoJnVkYy0+Z2FkZ2V0LmRldik7CisJdWRjLT5nYWRnZXQuZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CisJdWRjLT5nYWRnZXQuZGV2LmRtYV9tYXNrID0gcGRldi0+ZGV2LmRtYV9tYXNrOworCisJdGhlX2NvbnRyb2xsZXIgPSB1ZGM7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgdWRjKTsKKworCXMzYzI0MTBfdWRjX2Rpc2FibGUodWRjKTsKKwlzM2MyNDEwX3VkY19yZWluaXQodWRjKTsKKworCS8qIGlycSBzZXR1cCBhZnRlciBvbGQgaGFyZHdhcmUgc3RhdGUgaXMgY2xlYW5lZCB1cCAqLworCXJldHZhbCA9IHJlcXVlc3RfaXJxKElSUV9VU0JELCBzM2MyNDEwX3VkY19pcnEsCisJCQlJUlFGX0RJU0FCTEVELCBnYWRnZXRfbmFtZSwgdWRjKTsKKworCWlmIChyZXR2YWwgIT0gMCkgeworCQlkZXZfZXJyKGRldiwgImNhbm5vdCBnZXQgaXJxICVpLCBlcnIgJWRcbiIsIElSUV9VU0JELCByZXR2YWwpOworCQlyZXR2YWwgPSAtRUJVU1k7CisJCWdvdG8gZXJyX21hcDsKKwl9CisKKwlkZXZfZGJnKGRldiwgImdvdCBpcnEgJWlcbiIsIElSUV9VU0JEKTsKKworCWlmICh1ZGNfaW5mbyAmJiB1ZGNfaW5mby0+dmJ1c19waW4gPiAwKSB7CisJCWlycSA9IHMzYzI0MTBfZ3Bpb19nZXRpcnEodWRjX2luZm8tPnZidXNfcGluKTsKKwkJcmV0dmFsID0gcmVxdWVzdF9pcnEoaXJxLCBzM2MyNDEwX3VkY192YnVzX2lycSwKKwkJCQlJUlFGX0RJU0FCTEVEIHwgSVJRRl9UUklHR0VSX1JJU0lORworCQkJCXwgSVJRRl9UUklHR0VSX0ZBTExJTkcsCisJCQkJZ2FkZ2V0X25hbWUsIHVkYyk7CisKKwkJaWYgKHJldHZhbCAhPSAwKSB7CisJCQlkZXZfZXJyKGRldiwgImNhbid0IGdldCB2YnVzIGlycSAlaSwgZXJyICVkXG4iLAorCQkJCWlycSwgcmV0dmFsKTsKKwkJCXJldHZhbCA9IC1FQlVTWTsKKwkJCWdvdG8gZXJyX2ludDsKKwkJfQorCisJCWRldl9kYmcoZGV2LCAiZ290IGlycSAlaVxuIiwgaXJxKTsKKwl9IGVsc2UgeworCQl1ZGMtPnZidXMgPSAxOworCX0KKworCWlmIChzM2MyNDEwX3VkY19kZWJ1Z2ZzX3Jvb3QpIHsKKwkJdWRjLT5yZWdzX2luZm8gPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyZWdpc3RlcnMiLCBTX0lSVUdPLAorCQkJCXMzYzI0MTBfdWRjX2RlYnVnZnNfcm9vdCwKKwkJCQl1ZGMsICZzM2MyNDEwX3VkY19kZWJ1Z2ZzX2ZvcHMpOworCQlpZiAoSVNfRVJSKHVkYy0+cmVnc19pbmZvKSkgeworCQkJZGV2X3dhcm4oZGV2LCAiZGVidWdmcyBmaWxlIGNyZWF0aW9uIGZhaWxlZCAlbGRcbiIsCisJCQkJIFBUUl9FUlIodWRjLT5yZWdzX2luZm8pKTsKKwkJCXVkYy0+cmVnc19pbmZvID0gTlVMTDsKKwkJfQorCX0KKworCWRldl9kYmcoZGV2LCAicHJvYmUgb2tcbiIpOworCisJcmV0dXJuIDA7CisKK2Vycl9pbnQ6CisJZnJlZV9pcnEoSVJRX1VTQkQsIHVkYyk7CitlcnJfbWFwOgorCWlvdW5tYXAoYmFzZV9hZGRyKTsKK2Vycl9tZW06CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJzcmNfc3RhcnQsIHJzcmNfbGVuKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKglzM2MyNDEwX3VkY19yZW1vdmUKKyAqLworc3RhdGljIGludCBzM2MyNDEwX3VkY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgczNjMjQxMF91ZGMgKnVkYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGludCBpcnE7CisKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisJaWYgKHVkYy0+ZHJpdmVyKQorCQlyZXR1cm4gLUVCVVNZOworCisJZGVidWdmc19yZW1vdmUodWRjLT5yZWdzX2luZm8pOworCisJaWYgKHVkY19pbmZvICYmIHVkY19pbmZvLT52YnVzX3BpbiA+IDApIHsKKwkJaXJxID0gczNjMjQxMF9ncGlvX2dldGlycSh1ZGNfaW5mby0+dmJ1c19waW4pOworCQlmcmVlX2lycShpcnEsIHVkYyk7CisJfQorCisJZnJlZV9pcnEoSVJRX1VTQkQsIHVkYyk7CisKKwlpb3VubWFwKGJhc2VfYWRkcik7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJzcmNfc3RhcnQsIHJzcmNfbGVuKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJaWYgKCFJU19FUlIodWRjX2Nsb2NrKSAmJiB1ZGNfY2xvY2sgIT0gTlVMTCkgeworCQljbGtfZGlzYWJsZSh1ZGNfY2xvY2spOworCQljbGtfcHV0KHVkY19jbG9jayk7CisJCXVkY19jbG9jayA9IE5VTEw7CisJfQorCisJaWYgKCFJU19FUlIodXNiX2J1c19jbG9jaykgJiYgdXNiX2J1c19jbG9jayAhPSBOVUxMKSB7CisJCWNsa19kaXNhYmxlKHVzYl9idXNfY2xvY2spOworCQljbGtfcHV0KHVzYl9idXNfY2xvY2spOworCQl1c2JfYnVzX2Nsb2NrID0gTlVMTDsKKwl9CisKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogcmVtb3ZlIG9rXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgczNjMjQxMF91ZGNfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKK3sKKwlpZiAodWRjX2luZm8gJiYgdWRjX2luZm8tPnVkY19jb21tYW5kKQorCQl1ZGNfaW5mby0+dWRjX2NvbW1hbmQoUzNDMjQxMF9VRENfUF9ESVNBQkxFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHMzYzI0MTBfdWRjX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWlmICh1ZGNfaW5mbyAmJiB1ZGNfaW5mby0+dWRjX2NvbW1hbmQpCisJCXVkY19pbmZvLT51ZGNfY29tbWFuZChTM0MyNDEwX1VEQ19QX0VOQUJMRSk7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIHMzYzI0MTBfdWRjX3N1c3BlbmQJTlVMTAorI2RlZmluZSBzM2MyNDEwX3VkY19yZXN1bWUJTlVMTAorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHVkY19kcml2ZXJfMjQxMCA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiczNjMjQxMC11c2JnYWRnZXQiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBzM2MyNDEwX3VkY19wcm9iZSwKKwkucmVtb3ZlCQk9IHMzYzI0MTBfdWRjX3JlbW92ZSwKKwkuc3VzcGVuZAk9IHMzYzI0MTBfdWRjX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBzM2MyNDEwX3VkY19yZXN1bWUsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB1ZGNfZHJpdmVyXzI0NDAgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInMzYzI0NDAtdXNiZ2FkZ2V0IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gczNjMjQxMF91ZGNfcHJvYmUsCisJLnJlbW92ZQkJPSBzM2MyNDEwX3VkY19yZW1vdmUsCisJLnN1c3BlbmQJPSBzM2MyNDEwX3VkY19zdXNwZW5kLAorCS5yZXN1bWUJCT0gczNjMjQxMF91ZGNfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdWRjX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJZHByaW50ayhERUJVR19OT1JNQUwsICIlczogdmVyc2lvbiAlc1xuIiwgZ2FkZ2V0X25hbWUsIERSSVZFUl9WRVJTSU9OKTsKKworCXMzYzI0MTBfdWRjX2RlYnVnZnNfcm9vdCA9IGRlYnVnZnNfY3JlYXRlX2RpcihnYWRnZXRfbmFtZSwgTlVMTCk7CisJaWYgKElTX0VSUihzM2MyNDEwX3VkY19kZWJ1Z2ZzX3Jvb3QpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGRlYnVnZnMgZGlyIGNyZWF0aW9uIGZhaWxlZCAlbGRcbiIsCisJCQlnYWRnZXRfbmFtZSwgUFRSX0VSUihzM2MyNDEwX3VkY19kZWJ1Z2ZzX3Jvb3QpKTsKKwkJczNjMjQxMF91ZGNfZGVidWdmc19yb290ID0gTlVMTDsKKwl9CisKKwlyZXR2YWwgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnVkY19kcml2ZXJfMjQxMCk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnI7CisKKwlyZXR2YWwgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnVkY19kcml2ZXJfMjQ0MCk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnI7CisKKwlyZXR1cm4gMDsKKworZXJyOgorCWRlYnVnZnNfcmVtb3ZlKHMzYzI0MTBfdWRjX2RlYnVnZnNfcm9vdCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVkY19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnVkY19kcml2ZXJfMjQxMCk7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnVkY19kcml2ZXJfMjQ0MCk7CisJZGVidWdmc19yZW1vdmUoczNjMjQxMF91ZGNfZGVidWdmc19yb290KTsKK30KKworRVhQT1JUX1NZTUJPTCh1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKTsKK0VYUE9SVF9TWU1CT0wodXNiX2dhZGdldF9yZWdpc3Rlcl9kcml2ZXIpOworCittb2R1bGVfaW5pdCh1ZGNfaW5pdCk7Cittb2R1bGVfZXhpdCh1ZGNfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7CitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOworTU9EVUxFX1ZFUlNJT04oRFJJVkVSX1ZFUlNJT04pOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYzI0MTBfdWRjLmggYi9kcml2ZXJzL3VzYi9nYWRnZXQvczNjMjQxMF91ZGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTBiZWNlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYzI0MTBfdWRjLmgKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL3VzYi9nYWRnZXQvczNjMjQxMF91ZGMuaAorICogU2Ftc3VuZyBvbi1jaGlwIGZ1bGwgc3BlZWQgVVNCIGRldmljZSBjb250cm9sbGVycworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA3IEhlcmJlcnQgUPZ0emwgLSBBcm5hdWQgUGF0YXJkCisgKglBZGRpdGlvbmFsIGNsZWFudXBzIGJ5IEJlbiBEb29rcyA8YmVuLWxpbnV4QGZsdWZmLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisKKyNpZm5kZWYgX1MzQzI0MTBfVURDX0gKKyNkZWZpbmUgX1MzQzI0MTBfVURDX0gKKworc3RydWN0IHMzYzI0MTBfZXAgeworCXN0cnVjdCBsaXN0X2hlYWQJCXF1ZXVlOworCXVuc2lnbmVkIGxvbmcJCQlsYXN0X2lvOwkvKiBqaWZmaWVzIHRpbWVzdGFtcCAqLworCXN0cnVjdCB1c2JfZ2FkZ2V0CQkqZ2FkZ2V0OworCXN0cnVjdCBzM2MyNDEwX3VkYwkJKmRldjsKKwljb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmRlc2M7CisJc3RydWN0IHVzYl9lcAkJCWVwOworCXU4CQkJCW51bTsKKworCXVuc2lnbmVkIHNob3J0CQkJZmlmb19zaXplOworCXU4CQkJCWJFbmRwb2ludEFkZHJlc3M7CisJdTgJCQkJYm1BdHRyaWJ1dGVzOworCisJdW5zaWduZWQJCQloYWx0ZWQgOiAxOworCXVuc2lnbmVkCQkJYWxyZWFkeV9zZWVuIDogMTsKKwl1bnNpZ25lZAkJCXNldHVwX3N0YWdlIDogMTsKK307CisKKworLyogV2FybmluZyA6IGVwMCBoYXMgYSBmaWZvIG9mIDE2IGJ5dGVzICovCisvKiBEb24ndCB0cnkgdG8gc2V0IDMyIG9yIDY0ICAgICAgICAgICAgKi8KKy8qIGFsc28gdGVzdHVzYiAxNCBmYWlscyAgd2l0IDE2IGJ1dCBpcyAqLworLyogZmluZSB3aXRoIDggICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVQMF9GSUZPX1NJWkUJCSA4CisjZGVmaW5lIEVQX0ZJRk9fU0laRQkJNjQKKyNkZWZpbmUgREVGQVVMVF9QT1dFUl9TVEFURQkweDAwCisKKyNkZWZpbmUgUzNDMjQ0MF9FUF9GSUZPX1NJWkUJMTI4CisKK3N0YXRpYyBjb25zdCBjaGFyIGVwMG5hbWUgW10gPSAiZXAwIjsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGVwX25hbWVbXSA9IHsKKwllcDBuYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXZlcnlvbmUgaGFzIGVwMCAqLworCS8qIHMzYzI0MTAgZm91ciBiaWRpcmVjdGlvbmFsIGJ1bGsgZW5kcG9pbnRzICovCisJImVwMS1idWxrIiwgImVwMi1idWxrIiwgImVwMy1idWxrIiwgImVwNC1idWxrIiwKK307CisKKyNkZWZpbmUgUzNDMjQxMF9FTkRQT0lOVFMgICAgICAgQVJSQVlfU0laRShlcF9uYW1lKQorCitzdHJ1Y3QgczNjMjQxMF9yZXF1ZXN0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlxdWV1ZTsJCS8qIGVwJ3MgcmVxdWVzdHMgKi8KKwlzdHJ1Y3QgdXNiX3JlcXVlc3QJCXJlcTsKK307CisKK2VudW0gZXAwX3N0YXRlIHsKKyAgICAgICAgRVAwX0lETEUsCisgICAgICAgIEVQMF9JTl9EQVRBX1BIQVNFLAorICAgICAgICBFUDBfT1VUX0RBVEFfUEhBU0UsCisgICAgICAgIEVQMF9FTkRfWEZFUiwKKyAgICAgICAgRVAwX1NUQUxMLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmVwMHN0YXRlc1tdPSB7CisgICAgICAgICJFUDBfSURMRSIsCisgICAgICAgICJFUDBfSU5fREFUQV9QSEFTRSIsCisgICAgICAgICJFUDBfT1VUX0RBVEFfUEhBU0UiLAorICAgICAgICAiRVAwX0VORF9YRkVSIiwKKyAgICAgICAgIkVQMF9TVEFMTCIsCit9OworCitzdHJ1Y3QgczNjMjQxMF91ZGMgeworCXNwaW5sb2NrX3QJCQlsb2NrOworCisJc3RydWN0IHMzYzI0MTBfZXAJCWVwW1MzQzI0MTBfRU5EUE9JTlRTXTsKKwlpbnQJCQkJYWRkcmVzczsKKwlzdHJ1Y3QgdXNiX2dhZGdldAkJZ2FkZ2V0OworCXN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlcgkqZHJpdmVyOworCXN0cnVjdCBzM2MyNDEwX3JlcXVlc3QJCWZpZm9fcmVxOworCXU4CQkJCWZpZm9fYnVmW0VQX0ZJRk9fU0laRV07CisJdTE2CQkJCWRldnN0YXR1czsKKworCXUzMgkJCQlwb3J0X3N0YXR1czsKKwlpbnQJCQkJZXAwc3RhdGU7CisKKwl1bnNpZ25lZAkJCWdvdF9pcnEgOiAxOworCisJdW5zaWduZWQJCQlyZXFfc3RkIDogMTsKKwl1bnNpZ25lZAkJCXJlcV9jb25maWcgOiAxOworCXVuc2lnbmVkCQkJcmVxX3BlbmRpbmcgOiAxOworCXU4CQkJCXZidXM7CisJc3RydWN0IGRlbnRyeQkJCSpyZWdzX2luZm87Cit9OworCisjZW5kaWYK