LyoKICogbGludXgvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYzI0MTBfdWRjLmMKICoKICogU2Ftc3VuZyBTM0MyNHh4IHNlcmllcyBvbi1jaGlwIGZ1bGwgc3BlZWQgVVNCIGRldmljZSBjb250cm9sbGVycwogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBIZXJiZXJ0IFD2dHpsIC0gQXJuYXVkIFBhdGFyZAogKglBZGRpdGlvbmFsIGNsZWFudXBzIGJ5IEJlbiBEb29rcyA8YmVuLWxpbnV4QGZsdWZmLm9yZz4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKgogKi8KCiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgojaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvdGltZXIuaD4KI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgojaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiNpbmNsdWRlIDxsaW51eC9jbGsuaD4KCiNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgoKI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgojaW5jbHVkZSA8bGludXgvdXNiL2dhZGdldC5oPgoKI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL2lycS5oPgojaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgojaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgojaW5jbHVkZSA8YXNtL2FyY2gvaXJxcy5oPgoKI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CiNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLWdwaW8uaD4KCiNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L3JlZ3MtdWRjLmg+CiNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L3VkYy5oPgoKI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CgojaW5jbHVkZSAiczNjMjQxMF91ZGMuaCIKCiNkZWZpbmUgRFJJVkVSX0RFU0MJIlMzQzI0MTAgVVNCIERldmljZSBDb250cm9sbGVyIEdhZGdldCIKI2RlZmluZSBEUklWRVJfVkVSU0lPTgkiMjkgQXByIDIwMDciCiNkZWZpbmUgRFJJVkVSX0FVVEhPUgkiSGVyYmVydCBQ9nR6bCA8aGVyYmVydEAxM3RoZmxvb3IuYXQ+LCAiIFwKCQkJIkFybmF1ZCBQYXRhcmQgPGFybmF1ZC5wYXRhcmRAcnRwLW5ldC5vcmc+IgoKc3RhdGljIGNvbnN0IGNoYXIJCWdhZGdldF9uYW1lW10gPSAiczNjMjQxMF91ZGMiOwpzdGF0aWMgY29uc3QgY2hhcgkJZHJpdmVyX2Rlc2NbXSA9IERSSVZFUl9ERVNDOwoKc3RhdGljIHN0cnVjdCBzM2MyNDEwX3VkYwkqdGhlX2NvbnRyb2xsZXI7CnN0YXRpYyBzdHJ1Y3QgY2xrCQkqdWRjX2Nsb2NrOwpzdGF0aWMgc3RydWN0IGNsawkJKnVzYl9idXNfY2xvY2s7CnN0YXRpYyB2b2lkIF9faW9tZW0JCSpiYXNlX2FkZHI7CnN0YXRpYyB1NjQJCQlyc3JjX3N0YXJ0OwpzdGF0aWMgdTY0CQkJcnNyY19sZW47CnN0YXRpYyBzdHJ1Y3QgZGVudHJ5CQkqczNjMjQxMF91ZGNfZGVidWdmc19yb290OwoKc3RhdGljIGlubGluZSB1MzIgdWRjX3JlYWQodTMyIHJlZykKewoJcmV0dXJuIHJlYWRiKGJhc2VfYWRkciArIHJlZyk7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCB1ZGNfd3JpdGUodTMyIHZhbHVlLCB1MzIgcmVnKQp7Cgl3cml0ZWIodmFsdWUsIGJhc2VfYWRkciArIHJlZyk7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCB1ZGNfd3JpdGViKHZvaWQgX19pb21lbSAqYmFzZSwgdTMyIHZhbHVlLCB1MzIgcmVnKQp7Cgl3cml0ZWIodmFsdWUsIGJhc2UgKyByZWcpOwp9CgpzdGF0aWMgc3RydWN0IHMzYzI0MTBfdWRjX21hY2hfaW5mbyAqdWRjX2luZm87CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqIERFQlVHIEZVTkNUSU9OICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2RlZmluZSBERUJVR19OT1JNQUwJMQojZGVmaW5lIERFQlVHX1ZFUkJPU0UJMgoKI2lmZGVmIENPTkZJR19VU0JfUzNDMjQxMF9ERUJVRwojZGVmaW5lIFVTQl9TM0MyNDEwX0RFQlVHX0xFVkVMIDAKCnN0YXRpYyB1aW50MzJfdCBzM2MyNDEwX3RpY2tzID0gMDsKCnN0YXRpYyBpbnQgZHByaW50ayhpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQp7CglzdGF0aWMgY2hhciBwcmludGtfYnVmWzEwMjRdOwoJc3RhdGljIGxvbmcgcHJldnRpY2tzOwoJc3RhdGljIGludCBpbnZvY2F0aW9uOwoJdmFfbGlzdCBhcmdzOwoJaW50IGxlbjsKCglpZiAobGV2ZWwgPiBVU0JfUzNDMjQxMF9ERUJVR19MRVZFTCkKCQlyZXR1cm4gMDsKCglpZiAoczNjMjQxMF90aWNrcyAhPSBwcmV2dGlja3MpIHsKCQlwcmV2dGlja3MgPSBzM2MyNDEwX3RpY2tzOwoJCWludm9jYXRpb24gPSAwOwoJfQoKCWxlbiA9IHNjbnByaW50ZihwcmludGtfYnVmLAoJCQlzaXplb2YocHJpbnRrX2J1ZiksICIlMWx1LiUwMmQgVVNCOiAiLAoJCQlwcmV2dGlja3MsIGludm9jYXRpb24rKyk7CgoJdmFfc3RhcnQoYXJncywgZm10KTsKCWxlbiA9IHZzY25wcmludGYocHJpbnRrX2J1ZitsZW4sCgkJCXNpemVvZihwcmludGtfYnVmKS1sZW4sIGZtdCwgYXJncyk7Cgl2YV9lbmQoYXJncyk7CgoJcmV0dXJuIHByaW50ayhLRVJOX0RFQlVHICIlcyIsIHByaW50a19idWYpOwp9CiNlbHNlCnN0YXRpYyBpbnQgZHByaW50ayhpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQp7CglyZXR1cm4gMDsKfQojZW5kaWYKc3RhdGljIGludCBzM2MyNDEwX3VkY19kZWJ1Z2ZzX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcCkKewoJdTMyIGFkZHJfcmVnLHB3cl9yZWcsZXBfaW50X3JlZyx1c2JfaW50X3JlZzsKCXUzMiBlcF9pbnRfZW5fcmVnLCB1c2JfaW50X2VuX3JlZywgZXAwX2NzcjsKCXUzMiBlcDFfaV9jc3IxLGVwMV9pX2NzcjIsZXAxX29fY3NyMSxlcDFfb19jc3IyOwoJdTMyIGVwMl9pX2NzcjEsZXAyX2lfY3NyMixlcDJfb19jc3IxLGVwMl9vX2NzcjI7CgoJYWRkcl9yZWcgICAgICAgPSB1ZGNfcmVhZChTM0MyNDEwX1VEQ19GVU5DX0FERFJfUkVHKTsKCXB3cl9yZWcgICAgICAgID0gdWRjX3JlYWQoUzNDMjQxMF9VRENfUFdSX1JFRyk7CgllcF9pbnRfcmVnICAgICA9IHVkY19yZWFkKFMzQzI0MTBfVURDX0VQX0lOVF9SRUcpOwoJdXNiX2ludF9yZWcgICAgPSB1ZGNfcmVhZChTM0MyNDEwX1VEQ19VU0JfSU5UX1JFRyk7CgllcF9pbnRfZW5fcmVnICA9IHVkY19yZWFkKFMzQzI0MTBfVURDX0VQX0lOVF9FTl9SRUcpOwoJdXNiX2ludF9lbl9yZWcgPSB1ZGNfcmVhZChTM0MyNDEwX1VEQ19VU0JfSU5UX0VOX1JFRyk7Cgl1ZGNfd3JpdGUoMCwgUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKCWVwMF9jc3IgICAgICAgID0gdWRjX3JlYWQoUzNDMjQxMF9VRENfSU5fQ1NSMV9SRUcpOwoJdWRjX3dyaXRlKDEsIFMzQzI0MTBfVURDX0lOREVYX1JFRyk7CgllcDFfaV9jc3IxICAgICA9IHVkY19yZWFkKFMzQzI0MTBfVURDX0lOX0NTUjFfUkVHKTsKCWVwMV9pX2NzcjIgICAgID0gdWRjX3JlYWQoUzNDMjQxMF9VRENfSU5fQ1NSMl9SRUcpOwoJZXAxX29fY3NyMSAgICAgPSB1ZGNfcmVhZChTM0MyNDEwX1VEQ19JTl9DU1IxX1JFRyk7CgllcDFfb19jc3IyICAgICA9IHVkY19yZWFkKFMzQzI0MTBfVURDX0lOX0NTUjJfUkVHKTsKCXVkY193cml0ZSgyLCBTM0MyNDEwX1VEQ19JTkRFWF9SRUcpOwoJZXAyX2lfY3NyMSAgICAgPSB1ZGNfcmVhZChTM0MyNDEwX1VEQ19JTl9DU1IxX1JFRyk7CgllcDJfaV9jc3IyICAgICA9IHVkY19yZWFkKFMzQzI0MTBfVURDX0lOX0NTUjJfUkVHKTsKCWVwMl9vX2NzcjEgICAgID0gdWRjX3JlYWQoUzNDMjQxMF9VRENfSU5fQ1NSMV9SRUcpOwoJZXAyX29fY3NyMiAgICAgPSB1ZGNfcmVhZChTM0MyNDEwX1VEQ19JTl9DU1IyX1JFRyk7CgoJc2VxX3ByaW50ZihtLCAiRlVOQ19BRERSX1JFRyAgOiAweCUwNFhcbiIKCQkgIlBXUl9SRUcgICAgICAgIDogMHglMDRYXG4iCgkJICJFUF9JTlRfUkVHICAgICA6IDB4JTA0WFxuIgoJCSAiVVNCX0lOVF9SRUcgICAgOiAweCUwNFhcbiIKCQkgIkVQX0lOVF9FTl9SRUcgIDogMHglMDRYXG4iCgkJICJVU0JfSU5UX0VOX1JFRyA6IDB4JTA0WFxuIgoJCSAiRVAwX0NTUiAgICAgICAgOiAweCUwNFhcbiIKCQkgIkVQMV9JX0NTUjEgICAgIDogMHglMDRYXG4iCgkJICJFUDFfSV9DU1IyICAgICA6IDB4JTA0WFxuIgoJCSAiRVAxX09fQ1NSMSAgICAgOiAweCUwNFhcbiIKCQkgIkVQMV9PX0NTUjIgICAgIDogMHglMDRYXG4iCgkJICJFUDJfSV9DU1IxICAgICA6IDB4JTA0WFxuIgoJCSAiRVAyX0lfQ1NSMiAgICAgOiAweCUwNFhcbiIKCQkgIkVQMl9PX0NTUjEgICAgIDogMHglMDRYXG4iCgkJICJFUDJfT19DU1IyICAgICA6IDB4JTA0WFxuIiwKCQkJYWRkcl9yZWcscHdyX3JlZyxlcF9pbnRfcmVnLHVzYl9pbnRfcmVnLAoJCQllcF9pbnRfZW5fcmVnLCB1c2JfaW50X2VuX3JlZywgZXAwX2NzciwKCQkJZXAxX2lfY3NyMSxlcDFfaV9jc3IyLGVwMV9vX2NzcjEsZXAxX29fY3NyMiwKCQkJZXAyX2lfY3NyMSxlcDJfaV9jc3IyLGVwMl9vX2NzcjEsZXAyX29fY3NyMgoJCSk7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgczNjMjQxMF91ZGNfZGVidWdmc19mb3BzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwKCQkJCQkgc3RydWN0IGZpbGUgKmZpbGUpCnsKCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBzM2MyNDEwX3VkY19kZWJ1Z2ZzX3NlcV9zaG93LCBOVUxMKTsKfQoKc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgczNjMjQxMF91ZGNfZGVidWdmc19mb3BzID0gewoJLm9wZW4JCT0gczNjMjQxMF91ZGNfZGVidWdmc19mb3BzX29wZW4sCgkucmVhZAkJPSBzZXFfcmVhZCwKCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAoJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKCS5vd25lcgkJPSBUSElTX01PRFVMRSwKfTsKCi8qIGlvIG1hY3JvcyAqLwoKc3RhdGljIGlubGluZSB2b2lkIHMzYzI0MTBfdWRjX2NsZWFyX2VwMF9vcHIodm9pZCBfX2lvbWVtICpiYXNlKQp7Cgl1ZGNfd3JpdGViKGJhc2UsIFMzQzI0MTBfVURDX0lOREVYX0VQMCwgUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKCXVkY193cml0ZWIoYmFzZSwgUzNDMjQxMF9VRENfRVAwX0NTUl9TT1BLVFJEWSwKCQkJUzNDMjQxMF9VRENfRVAwX0NTUl9SRUcpOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgczNjMjQxMF91ZGNfY2xlYXJfZXAwX3NzdCh2b2lkIF9faW9tZW0gKmJhc2UpCnsKCXVkY193cml0ZWIoYmFzZSwgUzNDMjQxMF9VRENfSU5ERVhfRVAwLCBTM0MyNDEwX1VEQ19JTkRFWF9SRUcpOwoJd3JpdGViKDB4MDAsIGJhc2UgKyBTM0MyNDEwX1VEQ19FUDBfQ1NSX1JFRyk7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBzM2MyNDEwX3VkY19jbGVhcl9lcDBfc2Uodm9pZCBfX2lvbWVtICpiYXNlKQp7Cgl1ZGNfd3JpdGViKGJhc2UsIFMzQzI0MTBfVURDX0lOREVYX0VQMCwgUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKCXVkY193cml0ZWIoYmFzZSwgUzNDMjQxMF9VRENfRVAwX0NTUl9TU0UsIFMzQzI0MTBfVURDX0VQMF9DU1JfUkVHKTsKfQoKc3RhdGljIGlubGluZSB2b2lkIHMzYzI0MTBfdWRjX3NldF9lcDBfaXByKHZvaWQgX19pb21lbSAqYmFzZSkKewoJdWRjX3dyaXRlYihiYXNlLCBTM0MyNDEwX1VEQ19JTkRFWF9FUDAsIFMzQzI0MTBfVURDX0lOREVYX1JFRyk7Cgl1ZGNfd3JpdGViKGJhc2UsIFMzQzI0MTBfVURDX0VQMF9DU1JfSVBLUkRZLCBTM0MyNDEwX1VEQ19FUDBfQ1NSX1JFRyk7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBzM2MyNDEwX3VkY19zZXRfZXAwX2RlKHZvaWQgX19pb21lbSAqYmFzZSkKewoJdWRjX3dyaXRlYihiYXNlLCBTM0MyNDEwX1VEQ19JTkRFWF9FUDAsIFMzQzI0MTBfVURDX0lOREVYX1JFRyk7Cgl1ZGNfd3JpdGViKGJhc2UsIFMzQzI0MTBfVURDX0VQMF9DU1JfREUsIFMzQzI0MTBfVURDX0VQMF9DU1JfUkVHKTsKfQoKaW5saW5lIHZvaWQgczNjMjQxMF91ZGNfc2V0X2VwMF9zcyh2b2lkIF9faW9tZW0gKmIpCnsKCXVkY193cml0ZWIoYiwgUzNDMjQxMF9VRENfSU5ERVhfRVAwLCBTM0MyNDEwX1VEQ19JTkRFWF9SRUcpOwoJdWRjX3dyaXRlYihiLCBTM0MyNDEwX1VEQ19FUDBfQ1NSX1NFTkRTVEwsIFMzQzI0MTBfVURDX0VQMF9DU1JfUkVHKTsKfQoKc3RhdGljIGlubGluZSB2b2lkIHMzYzI0MTBfdWRjX3NldF9lcDBfZGVfb3V0KHZvaWQgX19pb21lbSAqYmFzZSkKewoJdWRjX3dyaXRlYihiYXNlLCBTM0MyNDEwX1VEQ19JTkRFWF9FUDAsIFMzQzI0MTBfVURDX0lOREVYX1JFRyk7CgoJdWRjX3dyaXRlYihiYXNlLChTM0MyNDEwX1VEQ19FUDBfQ1NSX1NPUEtUUkRZCgkJCQl8IFMzQzI0MTBfVURDX0VQMF9DU1JfREUpLAoJCQlTM0MyNDEwX1VEQ19FUDBfQ1NSX1JFRyk7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBzM2MyNDEwX3VkY19zZXRfZXAwX3NzZV9vdXQodm9pZCBfX2lvbWVtICpiYXNlKQp7Cgl1ZGNfd3JpdGViKGJhc2UsIFMzQzI0MTBfVURDX0lOREVYX0VQMCwgUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKCXVkY193cml0ZWIoYmFzZSwgKFMzQzI0MTBfVURDX0VQMF9DU1JfU09QS1RSRFkKCQkJCXwgUzNDMjQxMF9VRENfRVAwX0NTUl9TU0UpLAoJCQlTM0MyNDEwX1VEQ19FUDBfQ1NSX1JFRyk7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBzM2MyNDEwX3VkY19zZXRfZXAwX2RlX2luKHZvaWQgX19pb21lbSAqYmFzZSkKewoJdWRjX3dyaXRlYihiYXNlLCBTM0MyNDEwX1VEQ19JTkRFWF9FUDAsIFMzQzI0MTBfVURDX0lOREVYX1JFRyk7Cgl1ZGNfd3JpdGViKGJhc2UsIChTM0MyNDEwX1VEQ19FUDBfQ1NSX0lQS1JEWQoJCQl8IFMzQzI0MTBfVURDX0VQMF9DU1JfREUpLAoJCVMzQzI0MTBfVURDX0VQMF9DU1JfUkVHKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEkvTyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qCiAqCXMzYzI0MTBfdWRjX2RvbmUKICovCnN0YXRpYyB2b2lkIHMzYzI0MTBfdWRjX2RvbmUoc3RydWN0IHMzYzI0MTBfZXAgKmVwLAoJCXN0cnVjdCBzM2MyNDEwX3JlcXVlc3QgKnJlcSwgaW50IHN0YXR1cykKewoJdW5zaWduZWQgaGFsdGVkID0gZXAtPmhhbHRlZDsKCglsaXN0X2RlbF9pbml0KCZyZXEtPnF1ZXVlKTsKCglpZiAobGlrZWx5IChyZXEtPnJlcS5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKSkKCQlyZXEtPnJlcS5zdGF0dXMgPSBzdGF0dXM7CgllbHNlCgkJc3RhdHVzID0gcmVxLT5yZXEuc3RhdHVzOwoKCWVwLT5oYWx0ZWQgPSAxOwoJcmVxLT5yZXEuY29tcGxldGUoJmVwLT5lcCwgJnJlcS0+cmVxKTsKCWVwLT5oYWx0ZWQgPSBoYWx0ZWQ7Cn0KCnN0YXRpYyB2b2lkIHMzYzI0MTBfdWRjX251a2Uoc3RydWN0IHMzYzI0MTBfdWRjICp1ZGMsCgkJc3RydWN0IHMzYzI0MTBfZXAgKmVwLCBpbnQgc3RhdHVzKQp7CgkvKiBTYW5pdHkgY2hlY2sgKi8KCWlmICgmZXAtPnF1ZXVlID09IE5VTEwpCgkJcmV0dXJuOwoKCXdoaWxlICghbGlzdF9lbXB0eSAoJmVwLT5xdWV1ZSkpIHsKCQlzdHJ1Y3QgczNjMjQxMF9yZXF1ZXN0ICpyZXE7CgkJcmVxID0gbGlzdF9lbnRyeSAoZXAtPnF1ZXVlLm5leHQsIHN0cnVjdCBzM2MyNDEwX3JlcXVlc3QsCgkJCQlxdWV1ZSk7CgkJczNjMjQxMF91ZGNfZG9uZShlcCwgcmVxLCBzdGF0dXMpOwoJfQp9CgpzdGF0aWMgaW5saW5lIHZvaWQgczNjMjQxMF91ZGNfY2xlYXJfZXBfc3RhdGUoc3RydWN0IHMzYzI0MTBfdWRjICpkZXYpCnsKCXVuc2lnbmVkIGk7CgoJLyogaGFyZHdhcmUgU0VUX3tDT05GSUdVUkFUSU9OLElOVEVSRkFDRX0gYXV0b21hZ2ljIHJlc2V0cyBlbmRwb2ludAoJICogZmlmb3MsIGFuZCBwZW5kaW5nIHRyYW5zYWN0aW9ucyBtdXN0bid0IGJlIGNvbnRpbnVlZCBpbiBhbnkgY2FzZS4KCSAqLwoKCWZvciAoaSA9IDE7IGkgPCBTM0MyNDEwX0VORFBPSU5UUzsgaSsrKQoJCXMzYzI0MTBfdWRjX251a2UoZGV2LCAmZGV2LT5lcFtpXSwgLUVDT05OQUJPUlRFRCk7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IHMzYzI0MTBfdWRjX2ZpZm9fY291bnRfb3V0KHZvaWQpCnsKCWludCB0bXA7CgoJdG1wID0gdWRjX3JlYWQoUzNDMjQxMF9VRENfT1VUX0ZJRk9fQ05UMl9SRUcpIDw8IDg7Cgl0bXAgfD0gdWRjX3JlYWQoUzNDMjQxMF9VRENfT1VUX0ZJRk9fQ05UMV9SRUcpOwoJcmV0dXJuIHRtcDsKfQoKLyoKICoJczNjMjQxMF91ZGNfd3JpdGVfcGFja2V0CiAqLwpzdGF0aWMgaW5saW5lIGludCBzM2MyNDEwX3VkY193cml0ZV9wYWNrZXQoaW50IGZpZm8sCgkJc3RydWN0IHMzYzI0MTBfcmVxdWVzdCAqcmVxLAoJCXVuc2lnbmVkIG1heCkKewoJdW5zaWduZWQgbGVuID0gbWluKHJlcS0+cmVxLmxlbmd0aCAtIHJlcS0+cmVxLmFjdHVhbCwgbWF4KTsKCXU4ICpidWYgPSByZXEtPnJlcS5idWYgKyByZXEtPnJlcS5hY3R1YWw7CgoJcHJlZmV0Y2goYnVmKTsKCglkcHJpbnRrKERFQlVHX1ZFUkJPU0UsICIlcyAlZCAlZCAlZCAlZFxuIiwgX19mdW5jX18sCgkJcmVxLT5yZXEuYWN0dWFsLCByZXEtPnJlcS5sZW5ndGgsIGxlbiwgcmVxLT5yZXEuYWN0dWFsICsgbGVuKTsKCglyZXEtPnJlcS5hY3R1YWwgKz0gbGVuOwoKCXVkZWxheSg1KTsKCXdyaXRlc2IoYmFzZV9hZGRyICsgZmlmbywgYnVmLCBsZW4pOwoJcmV0dXJuIGxlbjsKfQoKLyoKICoJczNjMjQxMF91ZGNfd3JpdGVfZmlmbwogKgogKiByZXR1cm46ICAwID0gc3RpbGwgcnVubmluZywgMSA9IGNvbXBsZXRlZCwgbmVnYXRpdmUgPSBlcnJubwogKi8Kc3RhdGljIGludCBzM2MyNDEwX3VkY193cml0ZV9maWZvKHN0cnVjdCBzM2MyNDEwX2VwICplcCwKCQlzdHJ1Y3QgczNjMjQxMF9yZXF1ZXN0ICpyZXEpCnsKCXVuc2lnbmVkCWNvdW50OwoJaW50CQlpc19sYXN0OwoJdTMyCQlpZHg7CglpbnQJCWZpZm9fcmVnOwoJdTMyCQllcF9jc3I7CgoJaWR4ID0gZXAtPmJFbmRwb2ludEFkZHJlc3MgJiAweDdGOwoJc3dpdGNoIChpZHgpIHsKCWRlZmF1bHQ6CgkJaWR4ID0gMDsKCWNhc2UgMDoKCQlmaWZvX3JlZyA9IFMzQzI0MTBfVURDX0VQMF9GSUZPX1JFRzsKCQlicmVhazsKCWNhc2UgMToKCQlmaWZvX3JlZyA9IFMzQzI0MTBfVURDX0VQMV9GSUZPX1JFRzsKCQlicmVhazsKCWNhc2UgMjoKCQlmaWZvX3JlZyA9IFMzQzI0MTBfVURDX0VQMl9GSUZPX1JFRzsKCQlicmVhazsKCWNhc2UgMzoKCQlmaWZvX3JlZyA9IFMzQzI0MTBfVURDX0VQM19GSUZPX1JFRzsKCQlicmVhazsKCWNhc2UgNDoKCQlmaWZvX3JlZyA9IFMzQzI0MTBfVURDX0VQNF9GSUZPX1JFRzsKCQlicmVhazsKCX0KCgljb3VudCA9IHMzYzI0MTBfdWRjX3dyaXRlX3BhY2tldChmaWZvX3JlZywgcmVxLCBlcC0+ZXAubWF4cGFja2V0KTsKCgkvKiBsYXN0IHBhY2tldCBpcyBvZnRlbiBzaG9ydCAoc29tZXRpbWVzIGEgemxwKSAqLwoJaWYgKGNvdW50ICE9IGVwLT5lcC5tYXhwYWNrZXQpCgkJaXNfbGFzdCA9IDE7CgllbHNlIGlmIChyZXEtPnJlcS5sZW5ndGggIT0gcmVxLT5yZXEuYWN0dWFsIHx8IHJlcS0+cmVxLnplcm8pCgkJaXNfbGFzdCA9IDA7CgllbHNlCgkJaXNfbGFzdCA9IDI7CgoJLyogT25seSBlcDAgZGVidWcgbWVzc2FnZXMgYXJlIGludGVyZXN0aW5nICovCglpZiAoaWR4ID09IDApCgkJZHByaW50ayhERUJVR19OT1JNQUwsCgkJCSJXcml0dGVuIGVwJWQgJWQuJWQgb2YgJWQgYiBbbGFzdCAlZCx6ICVkXVxuIiwKCQkJaWR4LCBjb3VudCwgcmVxLT5yZXEuYWN0dWFsLCByZXEtPnJlcS5sZW5ndGgsCgkJCWlzX2xhc3QsIHJlcS0+cmVxLnplcm8pOwoKCWlmIChpc19sYXN0KSB7CgkJLyogVGhlIG9yZGVyIGlzIGltcG9ydGFudC4gSXQgcHJldmVudHMgc2VuZGluZyAyIHBhY2tldHMKCQkgKiBhdCB0aGUgc2FtZSB0aW1lICovCgoJCWlmIChpZHggPT0gMCkgewoJCQkvKiBSZXNldCBzaWduYWwgPT4gbm8gbmVlZCB0byBzYXkgJ2RhdGEgc2VudCcgKi8KCQkJaWYgKCEgKHVkY19yZWFkKFMzQzI0MTBfVURDX1VTQl9JTlRfUkVHKQoJCQkJCSYgUzNDMjQxMF9VRENfVVNCSU5UX1JFU0VUKSkKCQkJCXMzYzI0MTBfdWRjX3NldF9lcDBfZGVfaW4oYmFzZV9hZGRyKTsKCQkJZXAtPmRldi0+ZXAwc3RhdGU9RVAwX0lETEU7CgkJfSBlbHNlIHsKCQkJdWRjX3dyaXRlKGlkeCwgUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKCQkJZXBfY3NyID0gdWRjX3JlYWQoUzNDMjQxMF9VRENfSU5fQ1NSMV9SRUcpOwoJCQl1ZGNfd3JpdGUoaWR4LCBTM0MyNDEwX1VEQ19JTkRFWF9SRUcpOwoJCQl1ZGNfd3JpdGUoZXBfY3NyIHwgUzNDMjQxMF9VRENfSUNTUjFfUEtUUkRZLAoJCQkJCVMzQzI0MTBfVURDX0lOX0NTUjFfUkVHKTsKCQl9CgoJCXMzYzI0MTBfdWRjX2RvbmUoZXAsIHJlcSwgMCk7CgkJaXNfbGFzdCA9IDE7Cgl9IGVsc2UgewoJCWlmIChpZHggPT0gMCkgewoJCQkvKiBSZXNldCBzaWduYWwgPT4gbm8gbmVlZCB0byBzYXkgJ2RhdGEgc2VudCcgKi8KCQkJaWYgKCEgKHVkY19yZWFkKFMzQzI0MTBfVURDX1VTQl9JTlRfUkVHKQoJCQkJCSYgUzNDMjQxMF9VRENfVVNCSU5UX1JFU0VUKSkKCQkJCXMzYzI0MTBfdWRjX3NldF9lcDBfaXByKGJhc2VfYWRkcik7CgkJfSBlbHNlIHsKCQkJdWRjX3dyaXRlKGlkeCwgUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKCQkJZXBfY3NyID0gdWRjX3JlYWQoUzNDMjQxMF9VRENfSU5fQ1NSMV9SRUcpOwoJCQl1ZGNfd3JpdGUoaWR4LCBTM0MyNDEwX1VEQ19JTkRFWF9SRUcpOwoJCQl1ZGNfd3JpdGUoZXBfY3NyIHwgUzNDMjQxMF9VRENfSUNTUjFfUEtUUkRZLAoJCQkJCVMzQzI0MTBfVURDX0lOX0NTUjFfUkVHKTsKCQl9Cgl9CgoJcmV0dXJuIGlzX2xhc3Q7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IHMzYzI0MTBfdWRjX3JlYWRfcGFja2V0KGludCBmaWZvLCB1OCAqYnVmLAoJCXN0cnVjdCBzM2MyNDEwX3JlcXVlc3QgKnJlcSwgdW5zaWduZWQgYXZhaWwpCnsKCXVuc2lnbmVkIGxlbjsKCglsZW4gPSBtaW4ocmVxLT5yZXEubGVuZ3RoIC0gcmVxLT5yZXEuYWN0dWFsLCBhdmFpbCk7CglyZXEtPnJlcS5hY3R1YWwgKz0gbGVuOwoKCXJlYWRzYihmaWZvICsgYmFzZV9hZGRyLCBidWYsIGxlbik7CglyZXR1cm4gbGVuOwp9CgovKgogKiByZXR1cm46ICAwID0gc3RpbGwgcnVubmluZywgMSA9IHF1ZXVlIGVtcHR5LCBuZWdhdGl2ZSA9IGVycm5vCiAqLwpzdGF0aWMgaW50IHMzYzI0MTBfdWRjX3JlYWRfZmlmbyhzdHJ1Y3QgczNjMjQxMF9lcCAqZXAsCgkJCQkgc3RydWN0IHMzYzI0MTBfcmVxdWVzdCAqcmVxKQp7Cgl1OAkJKmJ1ZjsKCXUzMgkJZXBfY3NyOwoJdW5zaWduZWQJYnVmZmVyc3BhY2U7CglpbnQJCWlzX2xhc3Q9MTsKCXVuc2lnbmVkCWF2YWlsOwoJaW50CQlmaWZvX2NvdW50ID0gMDsKCXUzMgkJaWR4OwoJaW50CQlmaWZvX3JlZzsKCglpZHggPSBlcC0+YkVuZHBvaW50QWRkcmVzcyAmIDB4N0Y7CgoJc3dpdGNoIChpZHgpIHsKCWRlZmF1bHQ6CgkJaWR4ID0gMDsKCWNhc2UgMDoKCQlmaWZvX3JlZyA9IFMzQzI0MTBfVURDX0VQMF9GSUZPX1JFRzsKCQlicmVhazsKCWNhc2UgMToKCQlmaWZvX3JlZyA9IFMzQzI0MTBfVURDX0VQMV9GSUZPX1JFRzsKCQlicmVhazsKCWNhc2UgMjoKCQlmaWZvX3JlZyA9IFMzQzI0MTBfVURDX0VQMl9GSUZPX1JFRzsKCQlicmVhazsKCWNhc2UgMzoKCQlmaWZvX3JlZyA9IFMzQzI0MTBfVURDX0VQM19GSUZPX1JFRzsKCQlicmVhazsKCWNhc2UgNDoKCQlmaWZvX3JlZyA9IFMzQzI0MTBfVURDX0VQNF9GSUZPX1JFRzsKCQlicmVhazsKCX0KCglpZiAoIXJlcS0+cmVxLmxlbmd0aCkKCQlyZXR1cm4gMTsKCglidWYgPSByZXEtPnJlcS5idWYgKyByZXEtPnJlcS5hY3R1YWw7CglidWZmZXJzcGFjZSA9IHJlcS0+cmVxLmxlbmd0aCAtIHJlcS0+cmVxLmFjdHVhbDsKCWlmICghYnVmZmVyc3BhY2UpIHsKCQlkcHJpbnRrKERFQlVHX05PUk1BTCwgIiVzOiBidWZmZXIgZnVsbCFcbiIsIF9fZnVuY19fKTsKCQlyZXR1cm4gLTE7Cgl9CgoJdWRjX3dyaXRlKGlkeCwgUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKCglmaWZvX2NvdW50ID0gczNjMjQxMF91ZGNfZmlmb19jb3VudF9vdXQoKTsKCWRwcmludGsoREVCVUdfTk9STUFMLCAiJXMgZmlmbyBjb3VudCA6ICVkXG4iLCBfX2Z1bmNfXywgZmlmb19jb3VudCk7CgoJaWYgKGZpZm9fY291bnQgPiBlcC0+ZXAubWF4cGFja2V0KQoJCWF2YWlsID0gZXAtPmVwLm1heHBhY2tldDsKCWVsc2UKCQlhdmFpbCA9IGZpZm9fY291bnQ7CgoJZmlmb19jb3VudCA9IHMzYzI0MTBfdWRjX3JlYWRfcGFja2V0KGZpZm9fcmVnLCBidWYsIHJlcSwgYXZhaWwpOwoKCS8qIGNoZWNraW5nIHRoaXMgd2l0aCBlcDAgaXMgbm90IGFjY3VyYXRlIGFzIHdlIGFscmVhZHkKCSAqIHJlYWQgYSBjb250cm9sIHJlcXVlc3QKCSAqKi8KCWlmIChpZHggIT0gMCAmJiBmaWZvX2NvdW50IDwgZXAtPmVwLm1heHBhY2tldCkgewoJCWlzX2xhc3QgPSAxOwoJCS8qIG92ZXJmbG93ZWQgdGhpcyByZXF1ZXN0PyAgZmx1c2ggZXh0cmEgZGF0YSAqLwoJCWlmIChmaWZvX2NvdW50ICE9IGF2YWlsKQoJCQlyZXEtPnJlcS5zdGF0dXMgPSAtRU9WRVJGTE9XOwoJfSBlbHNlIHsKCQlpc19sYXN0ID0gKHJlcS0+cmVxLmxlbmd0aCA8PSByZXEtPnJlcS5hY3R1YWwpID8gMSA6IDA7Cgl9CgoJdWRjX3dyaXRlKGlkeCwgUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKCWZpZm9fY291bnQgPSBzM2MyNDEwX3VkY19maWZvX2NvdW50X291dCgpOwoKCS8qIE9ubHkgZXAwIGRlYnVnIG1lc3NhZ2VzIGFyZSBpbnRlcmVzdGluZyAqLwoJaWYgKGlkeCA9PSAwKQoJCWRwcmludGsoREVCVUdfVkVSQk9TRSwgIiVzIGZpZm8gY291bnQgOiAlZCBbbGFzdCAlZF1cbiIsCgkJCV9fZnVuY19fLCBmaWZvX2NvdW50LGlzX2xhc3QpOwoKCWlmIChpc19sYXN0KSB7CgkJaWYgKGlkeCA9PSAwKSB7CgkJCXMzYzI0MTBfdWRjX3NldF9lcDBfZGVfb3V0KGJhc2VfYWRkcik7CgkJCWVwLT5kZXYtPmVwMHN0YXRlID0gRVAwX0lETEU7CgkJfSBlbHNlIHsKCQkJdWRjX3dyaXRlKGlkeCwgUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKCQkJZXBfY3NyID0gdWRjX3JlYWQoUzNDMjQxMF9VRENfT1VUX0NTUjFfUkVHKTsKCQkJdWRjX3dyaXRlKGlkeCwgUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKCQkJdWRjX3dyaXRlKGVwX2NzciAmIH5TM0MyNDEwX1VEQ19PQ1NSMV9QS1RSRFksCgkJCQkJUzNDMjQxMF9VRENfT1VUX0NTUjFfUkVHKTsKCQl9CgoJCXMzYzI0MTBfdWRjX2RvbmUoZXAsIHJlcSwgMCk7Cgl9IGVsc2UgewoJCWlmIChpZHggPT0gMCkgewoJCQlzM2MyNDEwX3VkY19jbGVhcl9lcDBfb3ByKGJhc2VfYWRkcik7CgkJfSBlbHNlIHsKCQkJdWRjX3dyaXRlKGlkeCwgUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKCQkJZXBfY3NyID0gdWRjX3JlYWQoUzNDMjQxMF9VRENfT1VUX0NTUjFfUkVHKTsKCQkJdWRjX3dyaXRlKGlkeCwgUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKCQkJdWRjX3dyaXRlKGVwX2NzciAmIH5TM0MyNDEwX1VEQ19PQ1NSMV9QS1RSRFksCgkJCQkJUzNDMjQxMF9VRENfT1VUX0NTUjFfUkVHKTsKCQl9Cgl9CgoJcmV0dXJuIGlzX2xhc3Q7Cn0KCnN0YXRpYyBpbnQgczNjMjQxMF91ZGNfcmVhZF9maWZvX2NycShzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpjcnEpCnsKCXVuc2lnbmVkIGNoYXIgKm91dGJ1ZiA9ICh1bnNpZ25lZCBjaGFyKiljcnE7CglpbnQgYnl0ZXNfcmVhZCA9IDA7CgoJdWRjX3dyaXRlKDAsIFMzQzI0MTBfVURDX0lOREVYX1JFRyk7CgoJYnl0ZXNfcmVhZCA9IHMzYzI0MTBfdWRjX2ZpZm9fY291bnRfb3V0KCk7CgoJZHByaW50ayhERUJVR19OT1JNQUwsICIlczogZmlmb19jb3VudD0lZFxuIiwgX19mdW5jX18sIGJ5dGVzX3JlYWQpOwoKCWlmIChieXRlc19yZWFkID4gc2l6ZW9mKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QpKQoJCWJ5dGVzX3JlYWQgPSBzaXplb2Yoc3RydWN0IHVzYl9jdHJscmVxdWVzdCk7CgoJcmVhZHNiKFMzQzI0MTBfVURDX0VQMF9GSUZPX1JFRyArIGJhc2VfYWRkciwgb3V0YnVmLCBieXRlc19yZWFkKTsKCglkcHJpbnRrKERFQlVHX1ZFUkJPU0UsICIlczogbGVuPSVkICUwMng6JTAyeCB7JXgsJXgsJXh9XG4iLCBfX2Z1bmNfXywKCQlieXRlc19yZWFkLCBjcnEtPmJSZXF1ZXN0LCBjcnEtPmJSZXF1ZXN0VHlwZSwKCQljcnEtPndWYWx1ZSwgY3JxLT53SW5kZXgsIGNycS0+d0xlbmd0aCk7CgoJcmV0dXJuIGJ5dGVzX3JlYWQ7Cn0KCnN0YXRpYyBpbnQgczNjMjQxMF91ZGNfZ2V0X3N0YXR1cyhzdHJ1Y3QgczNjMjQxMF91ZGMgKmRldiwKCQlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpjcnEpCnsKCXUxNiBzdGF0dXMgPSAwOwoJdTggZXBfbnVtID0gY3JxLT53SW5kZXggJiAweDdGOwoJdTggaXNfaW4gPSBjcnEtPndJbmRleCAmIFVTQl9ESVJfSU47CgoJc3dpdGNoIChjcnEtPmJSZXF1ZXN0VHlwZSAmIFVTQl9SRUNJUF9NQVNLKSB7CgljYXNlIFVTQl9SRUNJUF9JTlRFUkZBQ0U6CgkJYnJlYWs7CgoJY2FzZSBVU0JfUkVDSVBfREVWSUNFOgoJCXN0YXR1cyA9IGRldi0+ZGV2c3RhdHVzOwoJCWJyZWFrOwoKCWNhc2UgVVNCX1JFQ0lQX0VORFBPSU5UOgoJCWlmIChlcF9udW0gPiA0IHx8IGNycS0+d0xlbmd0aCA+IDIpCgkJCXJldHVybiAxOwoKCQlpZiAoZXBfbnVtID09IDApIHsKCQkJdWRjX3dyaXRlKDAsIFMzQzI0MTBfVURDX0lOREVYX1JFRyk7CgkJCXN0YXR1cyA9IHVkY19yZWFkKFMzQzI0MTBfVURDX0lOX0NTUjFfUkVHKTsKCQkJc3RhdHVzID0gc3RhdHVzICYgUzNDMjQxMF9VRENfRVAwX0NTUl9TRU5EU1RMOwoJCX0gZWxzZSB7CgkJCXVkY193cml0ZShlcF9udW0sIFMzQzI0MTBfVURDX0lOREVYX1JFRyk7CgkJCWlmIChpc19pbikgewoJCQkJc3RhdHVzID0gdWRjX3JlYWQoUzNDMjQxMF9VRENfSU5fQ1NSMV9SRUcpOwoJCQkJc3RhdHVzID0gc3RhdHVzICYgUzNDMjQxMF9VRENfSUNTUjFfU0VORFNUTDsKCQkJfSBlbHNlIHsKCQkJCXN0YXR1cyA9IHVkY19yZWFkKFMzQzI0MTBfVURDX09VVF9DU1IxX1JFRyk7CgkJCQlzdGF0dXMgPSBzdGF0dXMgJiBTM0MyNDEwX1VEQ19PQ1NSMV9TRU5EU1RMOwoJCQl9CgkJfQoKCQlzdGF0dXMgPSBzdGF0dXMgPyAxIDogMDsKCQlicmVhazsKCglkZWZhdWx0OgoJCXJldHVybiAxOwoJfQoKCS8qIFNlZW1zIHRvIGJlIG5lZWRlZCB0byBnZXQgaXQgd29ya2luZy4gb3VjaCA6KCAqLwoJdWRlbGF5KDUpOwoJdWRjX3dyaXRlKHN0YXR1cyAmIDB4RkYsIFMzQzI0MTBfVURDX0VQMF9GSUZPX1JFRyk7Cgl1ZGNfd3JpdGUoc3RhdHVzID4+IDgsIFMzQzI0MTBfVURDX0VQMF9GSUZPX1JFRyk7CglzM2MyNDEwX3VkY19zZXRfZXAwX2RlX2luKGJhc2VfYWRkcik7CgoJcmV0dXJuIDA7Cn0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHVzYiBzdGF0ZSBtYWNoaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpzdGF0aWMgaW50IHMzYzI0MTBfdWRjX3NldF9oYWx0KHN0cnVjdCB1c2JfZXAgKl9lcCwgaW50IHZhbHVlKTsKCnN0YXRpYyB2b2lkIHMzYzI0MTBfdWRjX2hhbmRsZV9lcDBfaWRsZShzdHJ1Y3QgczNjMjQxMF91ZGMgKmRldiwKCQkJCQlzdHJ1Y3QgczNjMjQxMF9lcCAqZXAsCgkJCQkJc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqY3JxLAoJCQkJCXUzMiBlcDBjc3IpCnsKCWludCBsZW4sIHJldCwgdG1wOwoKCS8qIHN0YXJ0IGNvbnRyb2wgcmVxdWVzdD8gKi8KCWlmICghKGVwMGNzciAmIFMzQzI0MTBfVURDX0VQMF9DU1JfT1BLUkRZKSkKCQlyZXR1cm47CgoJczNjMjQxMF91ZGNfbnVrZShkZXYsIGVwLCAtRVBST1RPKTsKCglsZW4gPSBzM2MyNDEwX3VkY19yZWFkX2ZpZm9fY3JxKGNycSk7CglpZiAobGVuICE9IHNpemVvZigqY3JxKSkgewoJCWRwcmludGsoREVCVUdfTk9STUFMLCAic2V0dXAgYmVnaW46IGZpZm8gUkVBRCBFUlJPUiIKCQkJIiB3YW50ZWQgJWQgYnl0ZXMgZ290ICVkLiBTdGFsbGluZyBvdXQuLi5cbiIsCgkJCXNpemVvZigqY3JxKSwgbGVuKTsKCQlzM2MyNDEwX3VkY19zZXRfZXAwX3NzKGJhc2VfYWRkcik7CgkJcmV0dXJuOwoJfQoKCWRwcmludGsoREVCVUdfTk9STUFMLCAiYlJlcXVlc3QgPSAlZCBiUmVxdWVzdFR5cGUgJWQgd0xlbmd0aCA9ICVkXG4iLAoJCWNycS0+YlJlcXVlc3QsIGNycS0+YlJlcXVlc3RUeXBlLCBjcnEtPndMZW5ndGgpOwoKCS8qIGNvcGUgd2l0aCBhdXRvbWFnaWMgZm9yIHNvbWUgc3RhbmRhcmQgcmVxdWVzdHMuICovCglkZXYtPnJlcV9zdGQgPSAoY3JxLT5iUmVxdWVzdFR5cGUgJiBVU0JfVFlQRV9NQVNLKQoJCT09IFVTQl9UWVBFX1NUQU5EQVJEOwoJZGV2LT5yZXFfY29uZmlnID0gMDsKCWRldi0+cmVxX3BlbmRpbmcgPSAxOwoKCXN3aXRjaCAoY3JxLT5iUmVxdWVzdCkgewoJY2FzZSBVU0JfUkVRX1NFVF9DT05GSUdVUkFUSU9OOgoJCWRwcmludGsoREVCVUdfTk9STUFMLCAiVVNCX1JFUV9TRVRfQ09ORklHVVJBVElPTiAuLi4gXG4iKTsKCgkJaWYgKGNycS0+YlJlcXVlc3RUeXBlID09IFVTQl9SRUNJUF9ERVZJQ0UpIHsKCQkJZGV2LT5yZXFfY29uZmlnID0gMTsKCQkJczNjMjQxMF91ZGNfc2V0X2VwMF9kZV9vdXQoYmFzZV9hZGRyKTsKCQl9CgkJYnJlYWs7CgoJY2FzZSBVU0JfUkVRX1NFVF9JTlRFUkZBQ0U6CgkJZHByaW50ayhERUJVR19OT1JNQUwsICJVU0JfUkVRX1NFVF9JTlRFUkZBQ0UgLi4uIFxuIik7CgoJCWlmIChjcnEtPmJSZXF1ZXN0VHlwZSA9PSBVU0JfUkVDSVBfSU5URVJGQUNFKSB7CgkJCWRldi0+cmVxX2NvbmZpZyA9IDE7CgkJCXMzYzI0MTBfdWRjX3NldF9lcDBfZGVfb3V0KGJhc2VfYWRkcik7CgkJfQoJCWJyZWFrOwoKCWNhc2UgVVNCX1JFUV9TRVRfQUREUkVTUzoKCQlkcHJpbnRrKERFQlVHX05PUk1BTCwgIlVTQl9SRVFfU0VUX0FERFJFU1MgLi4uIFxuIik7CgoJCWlmIChjcnEtPmJSZXF1ZXN0VHlwZSA9PSBVU0JfUkVDSVBfREVWSUNFKSB7CgkJCXRtcCA9IGNycS0+d1ZhbHVlICYgMHg3RjsKCQkJZGV2LT5hZGRyZXNzID0gdG1wOwoJCQl1ZGNfd3JpdGUoKHRtcCB8IFMzQzI0MTBfVURDX0ZVTkNBRERSX1VQREFURSksCgkJCQkJUzNDMjQxMF9VRENfRlVOQ19BRERSX1JFRyk7CgkJCXMzYzI0MTBfdWRjX3NldF9lcDBfZGVfb3V0KGJhc2VfYWRkcik7CgkJCXJldHVybjsKCQl9CgkJYnJlYWs7CgoJY2FzZSBVU0JfUkVRX0dFVF9TVEFUVVM6CgkJZHByaW50ayhERUJVR19OT1JNQUwsICJVU0JfUkVRX0dFVF9TVEFUVVMgLi4uIFxuIik7CgkJczNjMjQxMF91ZGNfY2xlYXJfZXAwX29wcihiYXNlX2FkZHIpOwoKCQlpZiAoZGV2LT5yZXFfc3RkKSB7CgkJCWlmICghczNjMjQxMF91ZGNfZ2V0X3N0YXR1cyhkZXYsIGNycSkpIHsKCQkJCXJldHVybjsKCQkJfQoJCX0KCQlicmVhazsKCgljYXNlIFVTQl9SRVFfQ0xFQVJfRkVBVFVSRToKCQlzM2MyNDEwX3VkY19jbGVhcl9lcDBfb3ByKGJhc2VfYWRkcik7CgoJCWlmIChjcnEtPmJSZXF1ZXN0VHlwZSAhPSBVU0JfUkVDSVBfRU5EUE9JTlQpCgkJCWJyZWFrOwoKCQlpZiAoY3JxLT53VmFsdWUgIT0gVVNCX0VORFBPSU5UX0hBTFQgfHwgY3JxLT53TGVuZ3RoICE9IDApCgkJCWJyZWFrOwoKCQlzM2MyNDEwX3VkY19zZXRfaGFsdCgmZGV2LT5lcFtjcnEtPndJbmRleCAmIDB4N2ZdLmVwLCAwKTsKCQlzM2MyNDEwX3VkY19zZXRfZXAwX2RlX291dChiYXNlX2FkZHIpOwoJCXJldHVybjsKCgljYXNlIFVTQl9SRVFfU0VUX0ZFQVRVUkU6CgkJczNjMjQxMF91ZGNfY2xlYXJfZXAwX29wcihiYXNlX2FkZHIpOwoKCQlpZiAoY3JxLT5iUmVxdWVzdFR5cGUgIT0gVVNCX1JFQ0lQX0VORFBPSU5UKQoJCQlicmVhazsKCgkJaWYgKGNycS0+d1ZhbHVlICE9IFVTQl9FTkRQT0lOVF9IQUxUIHx8IGNycS0+d0xlbmd0aCAhPSAwKQoJCQlicmVhazsKCgkJczNjMjQxMF91ZGNfc2V0X2hhbHQoJmRldi0+ZXBbY3JxLT53SW5kZXggJiAweDdmXS5lcCwgMSk7CgkJczNjMjQxMF91ZGNfc2V0X2VwMF9kZV9vdXQoYmFzZV9hZGRyKTsKCQlyZXR1cm47CgoJZGVmYXVsdDoKCQlzM2MyNDEwX3VkY19jbGVhcl9lcDBfb3ByKGJhc2VfYWRkcik7CgkJYnJlYWs7Cgl9CgoJaWYgKGNycS0+YlJlcXVlc3RUeXBlICYgVVNCX0RJUl9JTikKCQlkZXYtPmVwMHN0YXRlID0gRVAwX0lOX0RBVEFfUEhBU0U7CgllbHNlCgkJZGV2LT5lcDBzdGF0ZSA9IEVQMF9PVVRfREFUQV9QSEFTRTsKCglyZXQgPSBkZXYtPmRyaXZlci0+c2V0dXAoJmRldi0+Z2FkZ2V0LCBjcnEpOwoJaWYgKHJldCA8IDApIHsKCQlpZiAoZGV2LT5yZXFfY29uZmlnKSB7CgkJCWRwcmludGsoREVCVUdfTk9STUFMLCAiY29uZmlnIGNoYW5nZSAlMDJ4IGZhaWwgJWQ/XG4iLAoJCQkJY3JxLT5iUmVxdWVzdCwgcmV0KTsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKHJldCA9PSAtRU9QTk9UU1VQUCkKCQkJZHByaW50ayhERUJVR19OT1JNQUwsICJPcGVyYXRpb24gbm90IHN1cHBvcnRlZFxuIik7CgkJZWxzZQoJCQlkcHJpbnRrKERFQlVHX05PUk1BTCwKCQkJCSJkZXYtPmRyaXZlci0+c2V0dXAgZmFpbGVkLiAoJWQpXG4iLCByZXQpOwoKCQl1ZGVsYXkoNSk7CgkJczNjMjQxMF91ZGNfc2V0X2VwMF9zcyhiYXNlX2FkZHIpOwoJCXMzYzI0MTBfdWRjX3NldF9lcDBfZGVfb3V0KGJhc2VfYWRkcik7CgkJZGV2LT5lcDBzdGF0ZSA9IEVQMF9JRExFOwoJCS8qIGRlZmVycmVkIGkvbyA9PSBubyByZXNwb25zZSB5ZXQgKi8KCX0gZWxzZSBpZiAoZGV2LT5yZXFfcGVuZGluZykgewoJCWRwcmludGsoREVCVUdfVkVSQk9TRSwgImRldi0+cmVxX3BlbmRpbmcuLi4gd2hhdCBub3c/XG4iKTsKCQlkZXYtPnJlcV9wZW5kaW5nPTA7Cgl9CgoJZHByaW50ayhERUJVR19WRVJCT1NFLCAiZXAwc3RhdGUgJXNcbiIsIGVwMHN0YXRlc1tkZXYtPmVwMHN0YXRlXSk7Cn0KCnN0YXRpYyB2b2lkIHMzYzI0MTBfdWRjX2hhbmRsZV9lcDAoc3RydWN0IHMzYzI0MTBfdWRjICpkZXYpCnsKCXUzMgkJCWVwMGNzcjsKCXN0cnVjdCBzM2MyNDEwX2VwCSplcCA9ICZkZXYtPmVwWzBdOwoJc3RydWN0IHMzYzI0MTBfcmVxdWVzdAkqcmVxOwoJc3RydWN0IHVzYl9jdHJscmVxdWVzdAljcnE7CgoJaWYgKGxpc3RfZW1wdHkoJmVwLT5xdWV1ZSkpCgkJcmVxID0gTlVMTDsKCWVsc2UKCQlyZXEgPSBsaXN0X2VudHJ5KGVwLT5xdWV1ZS5uZXh0LCBzdHJ1Y3QgczNjMjQxMF9yZXF1ZXN0LCBxdWV1ZSk7CgoJLyogV2UgbWFrZSB0aGUgYXNzdW1wdGlvbiB0aGF0IFMzQzI0MTBfVURDX0lOX0NTUjFfUkVHIGVxdWFsIHRvCgkgKiBTM0MyNDEwX1VEQ19FUDBfQ1NSX1JFRyB3aGVuIGluZGV4IGlzIHplcm8gKi8KCgl1ZGNfd3JpdGUoMCwgUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKCWVwMGNzciA9IHVkY19yZWFkKFMzQzI0MTBfVURDX0lOX0NTUjFfUkVHKTsKCglkcHJpbnRrKERFQlVHX05PUk1BTCwgImVwMGNzciAleCBlcDBzdGF0ZSAlc1xuIiwKCQllcDBjc3IsIGVwMHN0YXRlc1tkZXYtPmVwMHN0YXRlXSk7CgoJLyogY2xlYXIgc3RhbGwgc3RhdHVzICovCglpZiAoZXAwY3NyICYgUzNDMjQxMF9VRENfRVAwX0NTUl9TRU5UU1RMKSB7CgkJczNjMjQxMF91ZGNfbnVrZShkZXYsIGVwLCAtRVBJUEUpOwoJCWRwcmludGsoREVCVUdfTk9STUFMLCAiLi4uIGNsZWFyIFNFTlRfU1RBTEwgLi4uXG4iKTsKCQlzM2MyNDEwX3VkY19jbGVhcl9lcDBfc3N0KGJhc2VfYWRkcik7CgkJZGV2LT5lcDBzdGF0ZSA9IEVQMF9JRExFOwoJCXJldHVybjsKCX0KCgkvKiBjbGVhciBzZXR1cCBlbmQgKi8KCWlmIChlcDBjc3IgJiBTM0MyNDEwX1VEQ19FUDBfQ1NSX1NFKSB7CgkJZHByaW50ayhERUJVR19OT1JNQUwsICIuLi4gc2VydmljZWQgU0VUVVBfRU5EIC4uLlxuIik7CgkJczNjMjQxMF91ZGNfbnVrZShkZXYsIGVwLCAwKTsKCQlzM2MyNDEwX3VkY19jbGVhcl9lcDBfc2UoYmFzZV9hZGRyKTsKCQlkZXYtPmVwMHN0YXRlID0gRVAwX0lETEU7Cgl9CgoJc3dpdGNoIChkZXYtPmVwMHN0YXRlKSB7CgljYXNlIEVQMF9JRExFOgoJCXMzYzI0MTBfdWRjX2hhbmRsZV9lcDBfaWRsZShkZXYsIGVwLCAmY3JxLCBlcDBjc3IpOwoJCWJyZWFrOwoKCWNhc2UgRVAwX0lOX0RBVEFfUEhBU0U6CQkJLyogR0VUX0RFU0NSSVBUT1IgZXRjICovCgkJZHByaW50ayhERUJVR19OT1JNQUwsICJFUDBfSU5fREFUQV9QSEFTRSAuLi4gd2hhdCBub3c/XG4iKTsKCQlpZiAoIShlcDBjc3IgJiBTM0MyNDEwX1VEQ19FUDBfQ1NSX0lQS1JEWSkgJiYgcmVxKSB7CgkJCXMzYzI0MTBfdWRjX3dyaXRlX2ZpZm8oZXAsIHJlcSk7CgkJfQoJCWJyZWFrOwoKCWNhc2UgRVAwX09VVF9EQVRBX1BIQVNFOgkJLyogU0VUX0RFU0NSSVBUT1IgZXRjICovCgkJZHByaW50ayhERUJVR19OT1JNQUwsICJFUDBfT1VUX0RBVEFfUEhBU0UgLi4uIHdoYXQgbm93P1xuIik7CgkJaWYgKChlcDBjc3IgJiBTM0MyNDEwX1VEQ19FUDBfQ1NSX09QS1JEWSkgJiYgcmVxICkgewoJCQlzM2MyNDEwX3VkY19yZWFkX2ZpZm8oZXAscmVxKTsKCQl9CgkJYnJlYWs7CgoJY2FzZSBFUDBfRU5EX1hGRVI6CgkJZHByaW50ayhERUJVR19OT1JNQUwsICJFUDBfRU5EX1hGRVIgLi4uIHdoYXQgbm93P1xuIik7CgkJZGV2LT5lcDBzdGF0ZSA9IEVQMF9JRExFOwoJCWJyZWFrOwoKCWNhc2UgRVAwX1NUQUxMOgoJCWRwcmludGsoREVCVUdfTk9STUFMLCAiRVAwX1NUQUxMIC4uLiB3aGF0IG5vdz9cbiIpOwoJCWRldi0+ZXAwc3RhdGUgPSBFUDBfSURMRTsKCQlicmVhazsKCX0KfQoKLyoKICoJaGFuZGxlX2VwIC0gTWFuYWdlIEkvTyBlbmRwb2ludHMKICovCgpzdGF0aWMgdm9pZCBzM2MyNDEwX3VkY19oYW5kbGVfZXAoc3RydWN0IHMzYzI0MTBfZXAgKmVwKQp7CglzdHJ1Y3QgczNjMjQxMF9yZXF1ZXN0CSpyZXE7CglpbnQJCQlpc19pbiA9IGVwLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTjsKCXUzMgkJCWVwX2NzcjE7Cgl1MzIJCQlpZHg7CgoJaWYgKGxpa2VseSAoIWxpc3RfZW1wdHkoJmVwLT5xdWV1ZSkpKQoJCXJlcSA9IGxpc3RfZW50cnkoZXAtPnF1ZXVlLm5leHQsCgkJCQlzdHJ1Y3QgczNjMjQxMF9yZXF1ZXN0LCBxdWV1ZSk7CgllbHNlCgkJcmVxID0gTlVMTDsKCglpZHggPSBlcC0+YkVuZHBvaW50QWRkcmVzcyAmIDB4N0Y7CgoJaWYgKGlzX2luKSB7CgkJdWRjX3dyaXRlKGlkeCwgUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKCQllcF9jc3IxID0gdWRjX3JlYWQoUzNDMjQxMF9VRENfSU5fQ1NSMV9SRUcpOwoJCWRwcmludGsoREVCVUdfVkVSQk9TRSwgImVwJTAxZCB3cml0ZSBjc3I6JTAyeCAlZFxuIiwKCQkJaWR4LCBlcF9jc3IxLCByZXEgPyAxIDogMCk7CgoJCWlmIChlcF9jc3IxICYgUzNDMjQxMF9VRENfSUNTUjFfU0VOVFNUTCkgewoJCQlkcHJpbnRrKERFQlVHX1ZFUkJPU0UsICJzdFxuIik7CgkJCXVkY193cml0ZShpZHgsIFMzQzI0MTBfVURDX0lOREVYX1JFRyk7CgkJCXVkY193cml0ZShlcF9jc3IxICYgflMzQzI0MTBfVURDX0lDU1IxX1NFTlRTVEwsCgkJCQkJUzNDMjQxMF9VRENfSU5fQ1NSMV9SRUcpOwoJCQlyZXR1cm47CgkJfQoKCQlpZiAoIShlcF9jc3IxICYgUzNDMjQxMF9VRENfSUNTUjFfUEtUUkRZKSAmJiByZXEpIHsKCQkJczNjMjQxMF91ZGNfd3JpdGVfZmlmbyhlcCxyZXEpOwoJCX0KCX0gZWxzZSB7CgkJdWRjX3dyaXRlKGlkeCwgUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKCQllcF9jc3IxID0gdWRjX3JlYWQoUzNDMjQxMF9VRENfT1VUX0NTUjFfUkVHKTsKCQlkcHJpbnRrKERFQlVHX1ZFUkJPU0UsICJlcCUwMWQgcmQgY3NyOiUwMnhcbiIsIGlkeCwgZXBfY3NyMSk7CgoJCWlmIChlcF9jc3IxICYgUzNDMjQxMF9VRENfT0NTUjFfU0VOVFNUTCkgewoJCQl1ZGNfd3JpdGUoaWR4LCBTM0MyNDEwX1VEQ19JTkRFWF9SRUcpOwoJCQl1ZGNfd3JpdGUoZXBfY3NyMSAmIH5TM0MyNDEwX1VEQ19PQ1NSMV9TRU5UU1RMLAoJCQkJCVMzQzI0MTBfVURDX09VVF9DU1IxX1JFRyk7CgkJCXJldHVybjsKCQl9CgoJCWlmICgoZXBfY3NyMSAmIFMzQzI0MTBfVURDX09DU1IxX1BLVFJEWSkgJiYgcmVxKSB7CgkJCXMzYzI0MTBfdWRjX3JlYWRfZmlmbyhlcCxyZXEpOwoJCX0KCX0KfQoKI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtaXJxLmg+CgovKgogKglzM2MyNDEwX3VkY19pcnEgLSBpbnRlcnJ1cHQgaGFuZGxlcgogKi8Kc3RhdGljIGlycXJldHVybl90IHMzYzI0MTBfdWRjX2lycShpbnQgZHVtbXksIHZvaWQgKl9kZXYpCnsKCXN0cnVjdCBzM2MyNDEwX3VkYyAqZGV2ID0gX2RldjsKCWludCB1c2Jfc3RhdHVzOwoJaW50IHVzYmRfc3RhdHVzOwoJaW50IHB3cl9yZWc7CglpbnQgZXAwY3NyOwoJaW50IGk7Cgl1MzIgaWR4OwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5sb2NrLCBmbGFncyk7CgoJLyogRHJpdmVyIGNvbm5lY3RlZCA/ICovCglpZiAoIWRldi0+ZHJpdmVyKSB7CgkJLyogQ2xlYXIgaW50ZXJydXB0cyAqLwoJCXVkY193cml0ZSh1ZGNfcmVhZChTM0MyNDEwX1VEQ19VU0JfSU5UX1JFRyksCgkJCQlTM0MyNDEwX1VEQ19VU0JfSU5UX1JFRyk7CgkJdWRjX3dyaXRlKHVkY19yZWFkKFMzQzI0MTBfVURDX0VQX0lOVF9SRUcpLAoJCQkJUzNDMjQxMF9VRENfRVBfSU5UX1JFRyk7Cgl9CgoJLyogU2F2ZSBpbmRleCAqLwoJaWR4ID0gdWRjX3JlYWQoUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKCgkvKiBSZWFkIHN0YXR1cyByZWdpc3RlcnMgKi8KCXVzYl9zdGF0dXMgPSB1ZGNfcmVhZChTM0MyNDEwX1VEQ19VU0JfSU5UX1JFRyk7Cgl1c2JkX3N0YXR1cyA9IHVkY19yZWFkKFMzQzI0MTBfVURDX0VQX0lOVF9SRUcpOwoJcHdyX3JlZyA9IHVkY19yZWFkKFMzQzI0MTBfVURDX1BXUl9SRUcpOwoKCXVkY193cml0ZWIoYmFzZV9hZGRyLCBTM0MyNDEwX1VEQ19JTkRFWF9FUDAsIFMzQzI0MTBfVURDX0lOREVYX1JFRyk7CgllcDBjc3IgPSB1ZGNfcmVhZChTM0MyNDEwX1VEQ19JTl9DU1IxX1JFRyk7CgoJZHByaW50ayhERUJVR19OT1JNQUwsICJ1c2JzPSUwMngsIHVzYmRzPSUwMngsIHB3cj0lMDJ4IGVwMGNzcj0lMDJ4XG4iLAoJCXVzYl9zdGF0dXMsIHVzYmRfc3RhdHVzLCBwd3JfcmVnLCBlcDBjc3IpOwoKCS8qCgkgKiBOb3csIGhhbmRsZSBpbnRlcnJ1cHRzLiBUaGVyZSdzIHR3byB0eXBlcyA6CgkgKiAtIFJlc2V0LCBSZXN1bWUsIFN1c3BlbmQgY29taW5nIC0+IHVzYl9pbnRfcmVnCgkgKiAtIEVQIC0+IGVwX2ludF9yZWcKCSAqLwoKCS8qIFJFU0VUICovCglpZiAodXNiX3N0YXR1cyAmIFMzQzI0MTBfVURDX1VTQklOVF9SRVNFVCkgewoJCS8qIHR3byBraW5kIG9mIHJlc2V0IDoKCQkgKiAtIHJlc2V0IHN0YXJ0IC0+IHB3ciByZWcgPSA4CgkJICogLSByZXNldCBlbmQgICAtPiBwd3IgcmVnID0gMAoJCSAqKi8KCQlkcHJpbnRrKERFQlVHX05PUk1BTCwgIlVTQiByZXNldCBjc3IgJXggcHdyICV4XG4iLAoJCQllcDBjc3IsIHB3cl9yZWcpOwoKCQlkZXYtPmdhZGdldC5zcGVlZCA9IFVTQl9TUEVFRF9VTktOT1dOOwoJCXVkY193cml0ZSgweDAwLCBTM0MyNDEwX1VEQ19JTkRFWF9SRUcpOwoJCXVkY193cml0ZSgoZGV2LT5lcFswXS5lcC5tYXhwYWNrZXQgJiAweDdmZikgPj4gMywKCQkJCVMzQzI0MTBfVURDX01BWFBfUkVHKTsKCQlkZXYtPmFkZHJlc3MgPSAwOwoKCQlkZXYtPmVwMHN0YXRlID0gRVAwX0lETEU7CgkJZGV2LT5nYWRnZXQuc3BlZWQgPSBVU0JfU1BFRURfRlVMTDsKCgkJLyogY2xlYXIgaW50ZXJydXB0ICovCgkJdWRjX3dyaXRlKFMzQzI0MTBfVURDX1VTQklOVF9SRVNFVCwKCQkJCVMzQzI0MTBfVURDX1VTQl9JTlRfUkVHKTsKCgkJdWRjX3dyaXRlKGlkeCwgUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Cgl9CgoJLyogUkVTVU1FICovCglpZiAodXNiX3N0YXR1cyAmIFMzQzI0MTBfVURDX1VTQklOVF9SRVNVTUUpIHsKCQlkcHJpbnRrKERFQlVHX05PUk1BTCwgIlVTQiByZXN1bWVcbiIpOwoKCQkvKiBjbGVhciBpbnRlcnJ1cHQgKi8KCQl1ZGNfd3JpdGUoUzNDMjQxMF9VRENfVVNCSU5UX1JFU1VNRSwKCQkJCVMzQzI0MTBfVURDX1VTQl9JTlRfUkVHKTsKCgkJaWYgKGRldi0+Z2FkZ2V0LnNwZWVkICE9IFVTQl9TUEVFRF9VTktOT1dOCgkJCQkmJiBkZXYtPmRyaXZlcgoJCQkJJiYgZGV2LT5kcml2ZXItPnJlc3VtZSkKCQkJZGV2LT5kcml2ZXItPnJlc3VtZSgmZGV2LT5nYWRnZXQpOwoJfQoKCS8qIFNVU1BFTkQgKi8KCWlmICh1c2Jfc3RhdHVzICYgUzNDMjQxMF9VRENfVVNCSU5UX1NVU1BFTkQpIHsKCQlkcHJpbnRrKERFQlVHX05PUk1BTCwgIlVTQiBzdXNwZW5kXG4iKTsKCgkJLyogY2xlYXIgaW50ZXJydXB0ICovCgkJdWRjX3dyaXRlKFMzQzI0MTBfVURDX1VTQklOVF9TVVNQRU5ELAoJCQkJUzNDMjQxMF9VRENfVVNCX0lOVF9SRUcpOwoKCQlpZiAoZGV2LT5nYWRnZXQuc3BlZWQgIT0gVVNCX1NQRUVEX1VOS05PV04KCQkJCSYmIGRldi0+ZHJpdmVyCgkJCQkmJiBkZXYtPmRyaXZlci0+c3VzcGVuZCkKCQkJZGV2LT5kcml2ZXItPnN1c3BlbmQoJmRldi0+Z2FkZ2V0KTsKCgkJZGV2LT5lcDBzdGF0ZSA9IEVQMF9JRExFOwoJfQoKCS8qIEVQICovCgkvKiBjb250cm9sIHRyYWZmaWMgKi8KCS8qIGNoZWNrIG9uIGVwMGNzciAhPSAwIGlzIG5vdCBhIGdvb2QgaWRlYSBhcyBjbGVhcmluZyBpbl9wa3RfcmVhZHkKCSAqIGdlbmVyYXRlIGFuIGludGVycnVwdAoJICovCglpZiAodXNiZF9zdGF0dXMgJiBTM0MyNDEwX1VEQ19JTlRfRVAwKSB7CgkJZHByaW50ayhERUJVR19WRVJCT1NFLCAiVVNCIGVwMCBpcnFcbiIpOwoJCS8qIENsZWFyIHRoZSBpbnRlcnJ1cHQgYml0IGJ5IHNldHRpbmcgaXQgdG8gMSAqLwoJCXVkY193cml0ZShTM0MyNDEwX1VEQ19JTlRfRVAwLCBTM0MyNDEwX1VEQ19FUF9JTlRfUkVHKTsKCQlzM2MyNDEwX3VkY19oYW5kbGVfZXAwKGRldik7Cgl9CgoJLyogZW5kcG9pbnQgZGF0YSB0cmFuc2ZlcnMgKi8KCWZvciAoaSA9IDE7IGkgPCBTM0MyNDEwX0VORFBPSU5UUzsgaSsrKSB7CgkJdTMyIHRtcCA9IDEgPDwgaTsKCQlpZiAodXNiZF9zdGF0dXMgJiB0bXApIHsKCQkJZHByaW50ayhERUJVR19WRVJCT1NFLCAiVVNCIGVwJWQgaXJxXG4iLCBpKTsKCgkJCS8qIENsZWFyIHRoZSBpbnRlcnJ1cHQgYml0IGJ5IHNldHRpbmcgaXQgdG8gMSAqLwoJCQl1ZGNfd3JpdGUodG1wLCBTM0MyNDEwX1VEQ19FUF9JTlRfUkVHKTsKCQkJczNjMjQxMF91ZGNfaGFuZGxlX2VwKCZkZXYtPmVwW2ldKTsKCQl9Cgl9CgoJZHByaW50ayhERUJVR19WRVJCT1NFLCAiaXJxOiAlZCBzM2MyNDEwX3VkY19kb25lLlxuIiwgSVJRX1VTQkQpOwoKCS8qIFJlc3RvcmUgb2xkIGluZGV4ICovCgl1ZGNfd3JpdGUoaWR4LCBTM0MyNDEwX1VEQ19JTkRFWF9SRUcpOwoKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bG9jaywgZmxhZ3MpOwoKCXJldHVybiBJUlFfSEFORExFRDsKfQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gczNjMjQxMF9lcF9vcHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgpzdGF0aWMgaW5saW5lIHN0cnVjdCBzM2MyNDEwX2VwICp0b19zM2MyNDEwX2VwKHN0cnVjdCB1c2JfZXAgKmVwKQp7CglyZXR1cm4gY29udGFpbmVyX29mKGVwLCBzdHJ1Y3QgczNjMjQxMF9lcCwgZXApOwp9CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBzM2MyNDEwX3VkYyAqdG9fczNjMjQxMF91ZGMoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCkKewoJcmV0dXJuIGNvbnRhaW5lcl9vZihnYWRnZXQsIHN0cnVjdCBzM2MyNDEwX3VkYywgZ2FkZ2V0KTsKfQoKc3RhdGljIGlubGluZSBzdHJ1Y3QgczNjMjQxMF9yZXF1ZXN0ICp0b19zM2MyNDEwX3JlcShzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSkKewoJcmV0dXJuIGNvbnRhaW5lcl9vZihyZXEsIHN0cnVjdCBzM2MyNDEwX3JlcXVlc3QsIHJlcSk7Cn0KCi8qCiAqCXMzYzI0MTBfdWRjX2VwX2VuYWJsZQogKi8Kc3RhdGljIGludCBzM2MyNDEwX3VkY19lcF9lbmFibGUoc3RydWN0IHVzYl9lcCAqX2VwLAoJCQkJIGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZGVzYykKewoJc3RydWN0IHMzYzI0MTBfdWRjCSpkZXY7CglzdHJ1Y3QgczNjMjQxMF9lcAkqZXA7Cgl1MzIJCQltYXgsIHRtcDsKCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwoJdTMyCQkJY3NyMSxjc3IyOwoJdTMyCQkJaW50X2VuX3JlZzsKCgllcCA9IHRvX3MzYzI0MTBfZXAoX2VwKTsKCglpZiAoIV9lcCB8fCAhZGVzYyB8fCBlcC0+ZGVzYwoJCQl8fCBfZXAtPm5hbWUgPT0gZXAwbmFtZQoJCQl8fCBkZXNjLT5iRGVzY3JpcHRvclR5cGUgIT0gVVNCX0RUX0VORFBPSU5UKQoJCXJldHVybiAtRUlOVkFMOwoKCWRldiA9IGVwLT5kZXY7CglpZiAoIWRldi0+ZHJpdmVyIHx8IGRldi0+Z2FkZ2V0LnNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOKQoJCXJldHVybiAtRVNIVVRET1dOOwoKCW1heCA9IGxlMTZfdG9fY3B1KGRlc2MtPndNYXhQYWNrZXRTaXplKSAmIDB4MWZmZjsKCglsb2NhbF9pcnFfc2F2ZSAoZmxhZ3MpOwoJX2VwLT5tYXhwYWNrZXQgPSBtYXggJiAweDdmZjsKCWVwLT5kZXNjID0gZGVzYzsKCWVwLT5oYWx0ZWQgPSAwOwoJZXAtPmJFbmRwb2ludEFkZHJlc3MgPSBkZXNjLT5iRW5kcG9pbnRBZGRyZXNzOwoKCS8qIHNldCBtYXggcGFja2V0ICovCgl1ZGNfd3JpdGUoZXAtPm51bSwgUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKCXVkY193cml0ZShtYXggPj4gMywgUzNDMjQxMF9VRENfTUFYUF9SRUcpOwoKCS8qIHNldCB0eXBlLCBkaXJlY3Rpb24sIGFkZHJlc3M7IHJlc2V0IGZpZm8gY291bnRlcnMgKi8KCWlmIChkZXNjLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikgewoJCWNzcjEgPSBTM0MyNDEwX1VEQ19JQ1NSMV9GRkxVU0h8UzNDMjQxMF9VRENfSUNTUjFfQ0xSRFQ7CgkJY3NyMiA9IFMzQzI0MTBfVURDX0lDU1IyX01PREVJTnxTM0MyNDEwX1VEQ19JQ1NSMl9ETUFJRU47CgoJCXVkY193cml0ZShlcC0+bnVtLCBTM0MyNDEwX1VEQ19JTkRFWF9SRUcpOwoJCXVkY193cml0ZShjc3IxLCBTM0MyNDEwX1VEQ19JTl9DU1IxX1JFRyk7CgkJdWRjX3dyaXRlKGVwLT5udW0sIFMzQzI0MTBfVURDX0lOREVYX1JFRyk7CgkJdWRjX3dyaXRlKGNzcjIsIFMzQzI0MTBfVURDX0lOX0NTUjJfUkVHKTsKCX0gZWxzZSB7CgkJLyogZG9uJ3QgZmx1c2ggaW4gZmlmbyBvciBpdCB3aWxsIGNhdXNlIGVuZHBvaW50IGludGVycnVwdCAqLwoJCWNzcjEgPSBTM0MyNDEwX1VEQ19JQ1NSMV9DTFJEVDsKCQljc3IyID0gUzNDMjQxMF9VRENfSUNTUjJfRE1BSUVOOwoKCQl1ZGNfd3JpdGUoZXAtPm51bSwgUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKCQl1ZGNfd3JpdGUoY3NyMSwgUzNDMjQxMF9VRENfSU5fQ1NSMV9SRUcpOwoJCXVkY193cml0ZShlcC0+bnVtLCBTM0MyNDEwX1VEQ19JTkRFWF9SRUcpOwoJCXVkY193cml0ZShjc3IyLCBTM0MyNDEwX1VEQ19JTl9DU1IyX1JFRyk7CgoJCWNzcjEgPSBTM0MyNDEwX1VEQ19PQ1NSMV9GRkxVU0ggfCBTM0MyNDEwX1VEQ19PQ1NSMV9DTFJEVDsKCQljc3IyID0gUzNDMjQxMF9VRENfT0NTUjJfRE1BSUVOOwoKCQl1ZGNfd3JpdGUoZXAtPm51bSwgUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKCQl1ZGNfd3JpdGUoY3NyMSwgUzNDMjQxMF9VRENfT1VUX0NTUjFfUkVHKTsKCQl1ZGNfd3JpdGUoZXAtPm51bSwgUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKCQl1ZGNfd3JpdGUoY3NyMiwgUzNDMjQxMF9VRENfT1VUX0NTUjJfUkVHKTsKCX0KCgkvKiBlbmFibGUgaXJxcyAqLwoJaW50X2VuX3JlZyA9IHVkY19yZWFkKFMzQzI0MTBfVURDX0VQX0lOVF9FTl9SRUcpOwoJdWRjX3dyaXRlKGludF9lbl9yZWcgfCAoMSA8PCBlcC0+bnVtKSwgUzNDMjQxMF9VRENfRVBfSU5UX0VOX1JFRyk7CgoJLyogcHJpbnQgc29tZSBkZWJ1ZyBtZXNzYWdlICovCgl0bXAgPSBkZXNjLT5iRW5kcG9pbnRBZGRyZXNzOwoJZHByaW50ayAoREVCVUdfTk9STUFMLCAiZW5hYmxlICVzKCVkKSBlcCV4JXMtYmxrIG1heCAlMDJ4XG4iLAoJCSBfZXAtPm5hbWUsZXAtPm51bSwgdG1wLAoJCSBkZXNjLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTiA/ICJpbiIgOiAib3V0IiwgbWF4KTsKCglsb2NhbF9pcnFfcmVzdG9yZSAoZmxhZ3MpOwoJczNjMjQxMF91ZGNfc2V0X2hhbHQoX2VwLCAwKTsKCglyZXR1cm4gMDsKfQoKLyoKICogczNjMjQxMF91ZGNfZXBfZGlzYWJsZQogKi8Kc3RhdGljIGludCBzM2MyNDEwX3VkY19lcF9kaXNhYmxlKHN0cnVjdCB1c2JfZXAgKl9lcCkKewoJc3RydWN0IHMzYzI0MTBfZXAgKmVwID0gdG9fczNjMjQxMF9lcChfZXApOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCXUzMiBpbnRfZW5fcmVnOwoKCWlmICghX2VwIHx8ICFlcC0+ZGVzYykgewoJCWRwcmludGsoREVCVUdfTk9STUFMLCAiJXMgbm90IGVuYWJsZWRcbiIsCgkJCV9lcCA/IGVwLT5lcC5uYW1lIDogTlVMTCk7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwoKCWRwcmludGsoREVCVUdfTk9STUFMLCAiZXBfZGlzYWJsZTogJXNcbiIsIF9lcC0+bmFtZSk7CgoJZXAtPmRlc2MgPSBOVUxMOwoJZXAtPmhhbHRlZCA9IDE7CgoJczNjMjQxMF91ZGNfbnVrZSAoZXAtPmRldiwgZXAsIC1FU0hVVERPV04pOwoKCS8qIGRpc2FibGUgaXJxcyAqLwoJaW50X2VuX3JlZyA9IHVkY19yZWFkKFMzQzI0MTBfVURDX0VQX0lOVF9FTl9SRUcpOwoJdWRjX3dyaXRlKGludF9lbl9yZWcgJiB+KDE8PGVwLT5udW0pLCBTM0MyNDEwX1VEQ19FUF9JTlRfRU5fUkVHKTsKCglsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CgoJZHByaW50ayhERUJVR19OT1JNQUwsICIlcyBkaXNhYmxlZFxuIiwgX2VwLT5uYW1lKTsKCglyZXR1cm4gMDsKfQoKLyoKICogczNjMjQxMF91ZGNfYWxsb2NfcmVxdWVzdAogKi8Kc3RhdGljIHN0cnVjdCB1c2JfcmVxdWVzdCAqCnMzYzI0MTBfdWRjX2FsbG9jX3JlcXVlc3Qoc3RydWN0IHVzYl9lcCAqX2VwLCBnZnBfdCBtZW1fZmxhZ3MpCnsKCXN0cnVjdCBzM2MyNDEwX3JlcXVlc3QgKnJlcTsKCglkcHJpbnRrKERFQlVHX1ZFUkJPU0UsIiVzKCVwLCVkKVxuIiwgX19mdW5jX18sIF9lcCwgbWVtX2ZsYWdzKTsKCglpZiAoIV9lcCkKCQlyZXR1cm4gTlVMTDsKCglyZXEgPSBremFsbG9jIChzaXplb2Yoc3RydWN0IHMzYzI0MTBfcmVxdWVzdCksIG1lbV9mbGFncyk7CglpZiAoIXJlcSkKCQlyZXR1cm4gTlVMTDsKCglJTklUX0xJU1RfSEVBRCAoJnJlcS0+cXVldWUpOwoJcmV0dXJuICZyZXEtPnJlcTsKfQoKLyoKICogczNjMjQxMF91ZGNfZnJlZV9yZXF1ZXN0CiAqLwpzdGF0aWMgdm9pZApzM2MyNDEwX3VkY19mcmVlX3JlcXVlc3Qoc3RydWN0IHVzYl9lcCAqX2VwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKl9yZXEpCnsKCXN0cnVjdCBzM2MyNDEwX2VwCSplcCA9IHRvX3MzYzI0MTBfZXAoX2VwKTsKCXN0cnVjdCBzM2MyNDEwX3JlcXVlc3QJKnJlcSA9IHRvX3MzYzI0MTBfcmVxKF9yZXEpOwoKCWRwcmludGsoREVCVUdfVkVSQk9TRSwgIiVzKCVwLCVwKVxuIiwgX19mdW5jX18sIF9lcCwgX3JlcSk7CgoJaWYgKCFlcCB8fCAhX3JlcSB8fCAoIWVwLT5kZXNjICYmIF9lcC0+bmFtZSAhPSBlcDBuYW1lKSkKCQlyZXR1cm47CgoJV0FSTl9PTiAoIWxpc3RfZW1wdHkgKCZyZXEtPnF1ZXVlKSk7CglrZnJlZShyZXEpOwp9CgovKgogKglzM2MyNDEwX3VkY19xdWV1ZQogKi8Kc3RhdGljIGludCBzM2MyNDEwX3VkY19xdWV1ZShzdHJ1Y3QgdXNiX2VwICpfZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqX3JlcSwKCQlnZnBfdCBnZnBfZmxhZ3MpCnsKCXN0cnVjdCBzM2MyNDEwX3JlcXVlc3QJKnJlcSA9IHRvX3MzYzI0MTBfcmVxKF9yZXEpOwoJc3RydWN0IHMzYzI0MTBfZXAJKmVwID0gdG9fczNjMjQxMF9lcChfZXApOwoJc3RydWN0IHMzYzI0MTBfdWRjCSpkZXY7Cgl1MzIJCQllcF9jc3IgPSAwOwoJaW50CQkJZmlmb19jb3VudCA9IDA7Cgl1bnNpZ25lZCBsb25nCQlmbGFnczsKCglpZiAodW5saWtlbHkgKCFfZXAgfHwgKCFlcC0+ZGVzYyAmJiBlcC0+ZXAubmFtZSAhPSBlcDBuYW1lKSkpIHsKCQlkcHJpbnRrKERFQlVHX05PUk1BTCwgIiVzOiBpbnZhbGlkIGFyZ3NcbiIsIF9fZnVuY19fKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCglkZXYgPSBlcC0+ZGV2OwoJaWYgKHVubGlrZWx5ICghZGV2LT5kcml2ZXIKCQkJfHwgZGV2LT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1VOS05PV04pKSB7CgkJcmV0dXJuIC1FU0hVVERPV047Cgl9CgoJbG9jYWxfaXJxX3NhdmUgKGZsYWdzKTsKCglpZiAodW5saWtlbHkoIV9yZXEgfHwgIV9yZXEtPmNvbXBsZXRlCgkJCXx8ICFfcmVxLT5idWYgfHwgIWxpc3RfZW1wdHkoJnJlcS0+cXVldWUpKSkgewoJCWlmICghX3JlcSkKCQkJZHByaW50ayhERUJVR19OT1JNQUwsICIlczogMSBYIFggWFxuIiwgX19mdW5jX18pOwoJCWVsc2UgewoJCQlkcHJpbnRrKERFQlVHX05PUk1BTCwgIiVzOiAwICUwMWQgJTAxZCAlMDFkXG4iLAoJCQkJX19mdW5jX18sICFfcmVxLT5jb21wbGV0ZSwhX3JlcS0+YnVmLAoJCQkJIWxpc3RfZW1wdHkoJnJlcS0+cXVldWUpKTsKCQl9CgoJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCglfcmVxLT5zdGF0dXMgPSAtRUlOUFJPR1JFU1M7CglfcmVxLT5hY3R1YWwgPSAwOwoKCWRwcmludGsoREVCVUdfVkVSQk9TRSwgIiVzOiBlcCV4IGxlbiAlZFxuIiwKCQkgX19mdW5jX18sIGVwLT5iRW5kcG9pbnRBZGRyZXNzLCBfcmVxLT5sZW5ndGgpOwoKCWlmIChlcC0+YkVuZHBvaW50QWRkcmVzcykgewoJCXVkY193cml0ZShlcC0+YkVuZHBvaW50QWRkcmVzcyAmIDB4N0YsIFMzQzI0MTBfVURDX0lOREVYX1JFRyk7CgoJCWVwX2NzciA9IHVkY19yZWFkKChlcC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9ESVJfSU4pCgkJCQk/IFMzQzI0MTBfVURDX0lOX0NTUjFfUkVHCgkJCQk6IFMzQzI0MTBfVURDX09VVF9DU1IxX1JFRyk7CgkJZmlmb19jb3VudCA9IHMzYzI0MTBfdWRjX2ZpZm9fY291bnRfb3V0KCk7Cgl9IGVsc2UgewoJCXVkY193cml0ZSgwLCBTM0MyNDEwX1VEQ19JTkRFWF9SRUcpOwoJCWVwX2NzciA9IHVkY19yZWFkKFMzQzI0MTBfVURDX0lOX0NTUjFfUkVHKTsKCQlmaWZvX2NvdW50ID0gczNjMjQxMF91ZGNfZmlmb19jb3VudF9vdXQoKTsKCX0KCgkvKiBraWNrc3RhcnQgdGhpcyBpL28gcXVldWU/ICovCglpZiAobGlzdF9lbXB0eSgmZXAtPnF1ZXVlKSAmJiAhZXAtPmhhbHRlZCkgewoJCWlmIChlcC0+YkVuZHBvaW50QWRkcmVzcyA9PSAwIC8qIGVwMCAqLykgewoJCQlzd2l0Y2ggKGRldi0+ZXAwc3RhdGUpIHsKCQkJY2FzZSBFUDBfSU5fREFUQV9QSEFTRToKCQkJCWlmICghKGVwX2NzciZTM0MyNDEwX1VEQ19FUDBfQ1NSX0lQS1JEWSkKCQkJCQkJJiYgczNjMjQxMF91ZGNfd3JpdGVfZmlmbyhlcCwKCQkJCQkJCXJlcSkpIHsKCQkJCQlkZXYtPmVwMHN0YXRlID0gRVAwX0lETEU7CgkJCQkJcmVxID0gTlVMTDsKCQkJCX0KCQkJCWJyZWFrOwoKCQkJY2FzZSBFUDBfT1VUX0RBVEFfUEhBU0U6CgkJCQlpZiAoKCFfcmVxLT5sZW5ndGgpCgkJCQkJfHwgKChlcF9jc3IgJiBTM0MyNDEwX1VEQ19PQ1NSMV9QS1RSRFkpCgkJCQkJCSYmIHMzYzI0MTBfdWRjX3JlYWRfZmlmbyhlcCwKCQkJCQkJCXJlcSkpKSB7CgkJCQkJZGV2LT5lcDBzdGF0ZSA9IEVQMF9JRExFOwoJCQkJCXJlcSA9IE5VTEw7CgkJCQl9CgkJCQlicmVhazsKCgkJCWRlZmF1bHQ6CgkJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CgkJCQlyZXR1cm4gLUVMMkhMVDsKCQkJfQoJCX0gZWxzZSBpZiAoKGVwLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikgIT0gMAoJCQkJJiYgKCEoZXBfY3NyJlMzQzI0MTBfVURDX09DU1IxX1BLVFJEWSkpCgkJCQkmJiBzM2MyNDEwX3VkY193cml0ZV9maWZvKGVwLCByZXEpKSB7CgkJCXJlcSA9IE5VTEw7CgkJfSBlbHNlIGlmICgoZXBfY3NyICYgUzNDMjQxMF9VRENfT0NTUjFfUEtUUkRZKQoJCQkJJiYgZmlmb19jb3VudAoJCQkJJiYgczNjMjQxMF91ZGNfcmVhZF9maWZvKGVwLCByZXEpKSB7CgkJCXJlcSA9IE5VTEw7CgkJfQoJfQoKCS8qIHBpbyBvciBkbWEgaXJxIGhhbmRsZXIgYWR2YW5jZXMgdGhlIHF1ZXVlLiAqLwoJaWYgKGxpa2VseSAocmVxICE9IDApKQoJCWxpc3RfYWRkX3RhaWwoJnJlcS0+cXVldWUsICZlcC0+cXVldWUpOwoKCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKCglkcHJpbnRrKERFQlVHX1ZFUkJPU0UsICIlcyBva1xuIiwgX19mdW5jX18pOwoJcmV0dXJuIDA7Cn0KCi8qCiAqCXMzYzI0MTBfdWRjX2RlcXVldWUKICovCnN0YXRpYyBpbnQgczNjMjQxMF91ZGNfZGVxdWV1ZShzdHJ1Y3QgdXNiX2VwICpfZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqX3JlcSkKewoJc3RydWN0IHMzYzI0MTBfZXAJKmVwID0gdG9fczNjMjQxMF9lcChfZXApOwoJc3RydWN0IHMzYzI0MTBfdWRjCSp1ZGM7CglpbnQJCQlyZXR2YWwgPSAtRUlOVkFMOwoJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CglzdHJ1Y3QgczNjMjQxMF9yZXF1ZXN0CSpyZXEgPSBOVUxMOwoKCWRwcmludGsoREVCVUdfVkVSQk9TRSwgIiVzKCVwLCVwKVxuIiwgX19mdW5jX18sIF9lcCwgX3JlcSk7CgoJaWYgKCF0aGVfY29udHJvbGxlci0+ZHJpdmVyKQoJCXJldHVybiAtRVNIVVRET1dOOwoKCWlmICghX2VwIHx8ICFfcmVxKQoJCXJldHVybiByZXR2YWw7CgoJdWRjID0gdG9fczNjMjQxMF91ZGMoZXAtPmdhZGdldCk7CgoJbG9jYWxfaXJxX3NhdmUgKGZsYWdzKTsKCglsaXN0X2Zvcl9lYWNoX2VudHJ5IChyZXEsICZlcC0+cXVldWUsIHF1ZXVlKSB7CgkJaWYgKCZyZXEtPnJlcSA9PSBfcmVxKSB7CgkJCWxpc3RfZGVsX2luaXQgKCZyZXEtPnF1ZXVlKTsKCQkJX3JlcS0+c3RhdHVzID0gLUVDT05OUkVTRVQ7CgkJCXJldHZhbCA9IDA7CgkJCWJyZWFrOwoJCX0KCX0KCglpZiAocmV0dmFsID09IDApIHsKCQlkcHJpbnRrKERFQlVHX1ZFUkJPU0UsCgkJCSJkZXF1ZXVlZCByZXEgJXAgZnJvbSAlcywgbGVuICVkIGJ1ZiAlcFxuIiwKCQkJcmVxLCBfZXAtPm5hbWUsIF9yZXEtPmxlbmd0aCwgX3JlcS0+YnVmKTsKCgkJczNjMjQxMF91ZGNfZG9uZShlcCwgcmVxLCAtRUNPTk5SRVNFVCk7Cgl9CgoJbG9jYWxfaXJxX3Jlc3RvcmUgKGZsYWdzKTsKCXJldHVybiByZXR2YWw7Cn0KCi8qCiAqIHMzYzI0MTBfdWRjX3NldF9oYWx0CiAqLwpzdGF0aWMgaW50IHMzYzI0MTBfdWRjX3NldF9oYWx0KHN0cnVjdCB1c2JfZXAgKl9lcCwgaW50IHZhbHVlKQp7CglzdHJ1Y3QgczNjMjQxMF9lcAkqZXAgPSB0b19zM2MyNDEwX2VwKF9lcCk7Cgl1MzIJCQllcF9jc3IgPSAwOwoJdW5zaWduZWQgbG9uZwkJZmxhZ3M7Cgl1MzIJCQlpZHg7CgoJaWYgKHVubGlrZWx5ICghX2VwIHx8ICghZXAtPmRlc2MgJiYgZXAtPmVwLm5hbWUgIT0gZXAwbmFtZSkpKSB7CgkJZHByaW50ayhERUJVR19OT1JNQUwsICIlczogaW52YWwgMlxuIiwgX19mdW5jX18pOwoJCXJldHVybiAtRUlOVkFMOwoJfQoKCWxvY2FsX2lycV9zYXZlIChmbGFncyk7CgoJaWR4ID0gZXAtPmJFbmRwb2ludEFkZHJlc3MgJiAweDdGOwoKCWlmIChpZHggPT0gMCkgewoJCXMzYzI0MTBfdWRjX3NldF9lcDBfc3MoYmFzZV9hZGRyKTsKCQlzM2MyNDEwX3VkY19zZXRfZXAwX2RlX291dChiYXNlX2FkZHIpOwoJfSBlbHNlIHsKCQl1ZGNfd3JpdGUoaWR4LCBTM0MyNDEwX1VEQ19JTkRFWF9SRUcpOwoJCWVwX2NzciA9IHVkY19yZWFkKChlcC0+YkVuZHBvaW50QWRkcmVzcyAmVVNCX0RJUl9JTikKCQkJCT8gUzNDMjQxMF9VRENfSU5fQ1NSMV9SRUcKCQkJCTogUzNDMjQxMF9VRENfT1VUX0NTUjFfUkVHKTsKCgkJaWYgKChlcC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9ESVJfSU4pICE9IDApIHsKCQkJaWYgKHZhbHVlKQoJCQkJdWRjX3dyaXRlKGVwX2NzciB8IFMzQzI0MTBfVURDX0lDU1IxX1NFTkRTVEwsCgkJCQkJUzNDMjQxMF9VRENfSU5fQ1NSMV9SRUcpOwoJCQllbHNlIHsKCQkJCWVwX2NzciAmPSB+UzNDMjQxMF9VRENfSUNTUjFfU0VORFNUTDsKCQkJCXVkY193cml0ZShlcF9jc3IsIFMzQzI0MTBfVURDX0lOX0NTUjFfUkVHKTsKCQkJCWVwX2NzciB8PSBTM0MyNDEwX1VEQ19JQ1NSMV9DTFJEVDsKCQkJCXVkY193cml0ZShlcF9jc3IsIFMzQzI0MTBfVURDX0lOX0NTUjFfUkVHKTsKCQkJfQoJCX0gZWxzZSB7CgkJCWlmICh2YWx1ZSkKCQkJCXVkY193cml0ZShlcF9jc3IgfCBTM0MyNDEwX1VEQ19PQ1NSMV9TRU5EU1RMLAoJCQkJCVMzQzI0MTBfVURDX09VVF9DU1IxX1JFRyk7CgkJCWVsc2UgewoJCQkJZXBfY3NyICY9IH5TM0MyNDEwX1VEQ19PQ1NSMV9TRU5EU1RMOwoJCQkJdWRjX3dyaXRlKGVwX2NzciwgUzNDMjQxMF9VRENfT1VUX0NTUjFfUkVHKTsKCQkJCWVwX2NzciB8PSBTM0MyNDEwX1VEQ19PQ1NSMV9DTFJEVDsKCQkJCXVkY193cml0ZShlcF9jc3IsIFMzQzI0MTBfVURDX09VVF9DU1IxX1JFRyk7CgkJCX0KCQl9Cgl9CgoJZXAtPmhhbHRlZCA9IHZhbHVlID8gMSA6IDA7Cglsb2NhbF9pcnFfcmVzdG9yZSAoZmxhZ3MpOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9lcF9vcHMgczNjMjQxMF9lcF9vcHMgPSB7CgkuZW5hYmxlCQk9IHMzYzI0MTBfdWRjX2VwX2VuYWJsZSwKCS5kaXNhYmxlCT0gczNjMjQxMF91ZGNfZXBfZGlzYWJsZSwKCgkuYWxsb2NfcmVxdWVzdAk9IHMzYzI0MTBfdWRjX2FsbG9jX3JlcXVlc3QsCgkuZnJlZV9yZXF1ZXN0CT0gczNjMjQxMF91ZGNfZnJlZV9yZXF1ZXN0LAoKCS5xdWV1ZQkJPSBzM2MyNDEwX3VkY19xdWV1ZSwKCS5kZXF1ZXVlCT0gczNjMjQxMF91ZGNfZGVxdWV1ZSwKCgkuc2V0X2hhbHQJPSBzM2MyNDEwX3VkY19zZXRfaGFsdCwKfTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB1c2JfZ2FkZ2V0X29wcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qCiAqCXMzYzI0MTBfdWRjX2dldF9mcmFtZQogKi8Kc3RhdGljIGludCBzM2MyNDEwX3VkY19nZXRfZnJhbWUoc3RydWN0IHVzYl9nYWRnZXQgKl9nYWRnZXQpCnsKCWludCB0bXA7CgoJZHByaW50ayhERUJVR19WRVJCT1NFLCAiJXMoKVxuIiwgX19mdW5jX18pOwoKCXRtcCA9IHVkY19yZWFkKFMzQzI0MTBfVURDX0ZSQU1FX05VTTJfUkVHKSA8PCA4OwoJdG1wIHw9IHVkY19yZWFkKFMzQzI0MTBfVURDX0ZSQU1FX05VTTFfUkVHKTsKCXJldHVybiB0bXA7Cn0KCi8qCiAqCXMzYzI0MTBfdWRjX3dha2V1cAogKi8Kc3RhdGljIGludCBzM2MyNDEwX3VkY193YWtldXAoc3RydWN0IHVzYl9nYWRnZXQgKl9nYWRnZXQpCnsKCWRwcmludGsoREVCVUdfTk9STUFMLCAiJXMoKVxuIiwgX19mdW5jX18pOwoJcmV0dXJuIDA7Cn0KCi8qCiAqCXMzYzI0MTBfdWRjX3NldF9zZWxmcG93ZXJlZAogKi8Kc3RhdGljIGludCBzM2MyNDEwX3VkY19zZXRfc2VsZnBvd2VyZWQoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCwgaW50IHZhbHVlKQp7CglzdHJ1Y3QgczNjMjQxMF91ZGMgKnVkYyA9IHRvX3MzYzI0MTBfdWRjKGdhZGdldCk7CgoJZHByaW50ayhERUJVR19OT1JNQUwsICIlcygpXG4iLCBfX2Z1bmNfXyk7CgoJaWYgKHZhbHVlKQoJCXVkYy0+ZGV2c3RhdHVzIHw9ICgxIDw8IFVTQl9ERVZJQ0VfU0VMRl9QT1dFUkVEKTsKCWVsc2UKCQl1ZGMtPmRldnN0YXR1cyAmPSB+KDEgPDwgVVNCX0RFVklDRV9TRUxGX1BPV0VSRUQpOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCBzM2MyNDEwX3VkY19kaXNhYmxlKHN0cnVjdCBzM2MyNDEwX3VkYyAqZGV2KTsKc3RhdGljIHZvaWQgczNjMjQxMF91ZGNfZW5hYmxlKHN0cnVjdCBzM2MyNDEwX3VkYyAqZGV2KTsKCnN0YXRpYyBpbnQgczNjMjQxMF91ZGNfc2V0X3B1bGx1cChzdHJ1Y3QgczNjMjQxMF91ZGMgKnVkYywgaW50IGlzX29uKQp7CglkcHJpbnRrKERFQlVHX05PUk1BTCwgIiVzKClcbiIsIF9fZnVuY19fKTsKCglpZiAodWRjX2luZm8gJiYgdWRjX2luZm8tPnVkY19jb21tYW5kKSB7CgkJaWYgKGlzX29uKQoJCQlzM2MyNDEwX3VkY19lbmFibGUodWRjKTsKCQllbHNlIHsKCQkJaWYgKHVkYy0+Z2FkZ2V0LnNwZWVkICE9IFVTQl9TUEVFRF9VTktOT1dOKSB7CgkJCQlpZiAodWRjLT5kcml2ZXIgJiYgdWRjLT5kcml2ZXItPmRpc2Nvbm5lY3QpCgkJCQkJdWRjLT5kcml2ZXItPmRpc2Nvbm5lY3QoJnVkYy0+Z2FkZ2V0KTsKCgkJCX0KCQkJczNjMjQxMF91ZGNfZGlzYWJsZSh1ZGMpOwoJCX0KCX0KCWVsc2UKCQlyZXR1cm4gLUVPUE5PVFNVUFA7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgczNjMjQxMF91ZGNfdmJ1c19zZXNzaW9uKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQsIGludCBpc19hY3RpdmUpCnsKCXN0cnVjdCBzM2MyNDEwX3VkYyAqdWRjID0gdG9fczNjMjQxMF91ZGMoZ2FkZ2V0KTsKCglkcHJpbnRrKERFQlVHX05PUk1BTCwgIiVzKClcbiIsIF9fZnVuY19fKTsKCgl1ZGMtPnZidXMgPSAoaXNfYWN0aXZlICE9IDApOwoJczNjMjQxMF91ZGNfc2V0X3B1bGx1cCh1ZGMsIGlzX2FjdGl2ZSk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzM2MyNDEwX3VkY19wdWxsdXAoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCwgaW50IGlzX29uKQp7CglzdHJ1Y3QgczNjMjQxMF91ZGMgKnVkYyA9IHRvX3MzYzI0MTBfdWRjKGdhZGdldCk7CgoJZHByaW50ayhERUJVR19OT1JNQUwsICIlcygpXG4iLCBfX2Z1bmNfXyk7CgoJczNjMjQxMF91ZGNfc2V0X3B1bGx1cCh1ZGMsIGlzX29uID8gMCA6IDEpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpcnFyZXR1cm5fdCBzM2MyNDEwX3VkY192YnVzX2lycShpbnQgaXJxLCB2b2lkICpfZGV2KQp7CglzdHJ1Y3QgczNjMjQxMF91ZGMJKmRldiA9IF9kZXY7Cgl1bnNpZ25lZCBpbnQJCXZhbHVlOwoKCWRwcmludGsoREVCVUdfTk9STUFMLCAiJXMoKVxuIiwgX19mdW5jX18pOwoKCS8qIHNvbWUgY3B1cyBjYW5ub3QgcmVhZCBmcm9tIGFuIGxpbmUgY29uZmlndXJlZCB0byBJUlEhICovCglzM2MyNDEwX2dwaW9fY2ZncGluKHVkY19pbmZvLT52YnVzX3BpbiwgUzNDMjQxMF9HUElPX0lOUFVUKTsKCXZhbHVlID0gczNjMjQxMF9ncGlvX2dldHBpbih1ZGNfaW5mby0+dmJ1c19waW4pOwoJczNjMjQxMF9ncGlvX2NmZ3Bpbih1ZGNfaW5mby0+dmJ1c19waW4sIFMzQzI0MTBfR1BJT19TRk4yKTsKCglpZiAodWRjX2luZm8tPnZidXNfcGluX2ludmVydGVkKQoJCXZhbHVlID0gIXZhbHVlOwoKCWlmICh2YWx1ZSAhPSBkZXYtPnZidXMpCgkJczNjMjQxMF91ZGNfdmJ1c19zZXNzaW9uKCZkZXYtPmdhZGdldCwgdmFsdWUpOwoKCXJldHVybiBJUlFfSEFORExFRDsKfQoKc3RhdGljIGludCBzM2MyNDEwX3ZidXNfZHJhdyhzdHJ1Y3QgdXNiX2dhZGdldCAqX2dhZGdldCwgdW5zaWduZWQgbWEpCnsKCWRwcmludGsoREVCVUdfTk9STUFMLCAiJXMoKVxuIiwgX19mdW5jX18pOwoKCWlmICh1ZGNfaW5mbyAmJiB1ZGNfaW5mby0+dmJ1c19kcmF3KSB7CgkJdWRjX2luZm8tPnZidXNfZHJhdyhtYSk7CgkJcmV0dXJuIDA7Cgl9CgoJcmV0dXJuIC1FTk9UU1VQUDsKfQoKc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZ2FkZ2V0X29wcyBzM2MyNDEwX29wcyA9IHsKCS5nZXRfZnJhbWUJCT0gczNjMjQxMF91ZGNfZ2V0X2ZyYW1lLAoJLndha2V1cAkJCT0gczNjMjQxMF91ZGNfd2FrZXVwLAoJLnNldF9zZWxmcG93ZXJlZAk9IHMzYzI0MTBfdWRjX3NldF9zZWxmcG93ZXJlZCwKCS5wdWxsdXAJCQk9IHMzYzI0MTBfdWRjX3B1bGx1cCwKCS52YnVzX3Nlc3Npb24JCT0gczNjMjQxMF91ZGNfdmJ1c19zZXNzaW9uLAoJLnZidXNfZHJhdwkJPSBzM2MyNDEwX3ZidXNfZHJhdywKfTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnYWRnZXQgZHJpdmVyIGhhbmRsaW5nLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyoKICogczNjMjQxMF91ZGNfZGlzYWJsZQogKi8Kc3RhdGljIHZvaWQgczNjMjQxMF91ZGNfZGlzYWJsZShzdHJ1Y3QgczNjMjQxMF91ZGMgKmRldikKewoJZHByaW50ayhERUJVR19OT1JNQUwsICIlcygpXG4iLCBfX2Z1bmNfXyk7CgoJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLwoJdWRjX3dyaXRlKDB4MDAsIFMzQzI0MTBfVURDX1VTQl9JTlRfRU5fUkVHKTsKCXVkY193cml0ZSgweDAwLCBTM0MyNDEwX1VEQ19FUF9JTlRfRU5fUkVHKTsKCgkvKiBDbGVhciB0aGUgaW50ZXJydXB0IHJlZ2lzdGVycyAqLwoJdWRjX3dyaXRlKFMzQzI0MTBfVURDX1VTQklOVF9SRVNFVAoJCQkJfCBTM0MyNDEwX1VEQ19VU0JJTlRfUkVTVU1FCgkJCQl8IFMzQzI0MTBfVURDX1VTQklOVF9TVVNQRU5ELAoJCQlTM0MyNDEwX1VEQ19VU0JfSU5UX1JFRyk7CgoJdWRjX3dyaXRlKDB4MUYsIFMzQzI0MTBfVURDX0VQX0lOVF9SRUcpOwoKCS8qIEdvb2QgYnllLCBjcnVlbCB3b3JsZCAqLwoJaWYgKHVkY19pbmZvICYmIHVkY19pbmZvLT51ZGNfY29tbWFuZCkKCQl1ZGNfaW5mby0+dWRjX2NvbW1hbmQoUzNDMjQxMF9VRENfUF9ESVNBQkxFKTsKCgkvKiBTZXQgc3BlZWQgdG8gdW5rbm93biAqLwoJZGV2LT5nYWRnZXQuc3BlZWQgPSBVU0JfU1BFRURfVU5LTk9XTjsKfQoKLyoKICogczNjMjQxMF91ZGNfcmVpbml0CiAqLwpzdGF0aWMgdm9pZCBzM2MyNDEwX3VkY19yZWluaXQoc3RydWN0IHMzYzI0MTBfdWRjICpkZXYpCnsKCXUzMiBpOwoKCS8qIGRldmljZS9lcDAgcmVjb3JkcyBpbml0ICovCglJTklUX0xJU1RfSEVBRCAoJmRldi0+Z2FkZ2V0LmVwX2xpc3QpOwoJSU5JVF9MSVNUX0hFQUQgKCZkZXYtPmdhZGdldC5lcDAtPmVwX2xpc3QpOwoJZGV2LT5lcDBzdGF0ZSA9IEVQMF9JRExFOwoKCWZvciAoaSA9IDA7IGkgPCBTM0MyNDEwX0VORFBPSU5UUzsgaSsrKSB7CgkJc3RydWN0IHMzYzI0MTBfZXAgKmVwID0gJmRldi0+ZXBbaV07CgoJCWlmIChpICE9IDApCgkJCWxpc3RfYWRkX3RhaWwgKCZlcC0+ZXAuZXBfbGlzdCwgJmRldi0+Z2FkZ2V0LmVwX2xpc3QpOwoKCQllcC0+ZGV2ID0gZGV2OwoJCWVwLT5kZXNjID0gTlVMTDsKCQllcC0+aGFsdGVkID0gMDsKCQlJTklUX0xJU1RfSEVBRCAoJmVwLT5xdWV1ZSk7Cgl9Cn0KCi8qCiAqIHMzYzI0MTBfdWRjX2VuYWJsZQogKi8Kc3RhdGljIHZvaWQgczNjMjQxMF91ZGNfZW5hYmxlKHN0cnVjdCBzM2MyNDEwX3VkYyAqZGV2KQp7CglpbnQgaTsKCglkcHJpbnRrKERFQlVHX05PUk1BTCwgInMzYzI0MTBfdWRjX2VuYWJsZSBjYWxsZWRcbiIpOwoKCS8qIGRldi0+Z2FkZ2V0LnNwZWVkID0gVVNCX1NQRUVEX1VOS05PV047ICovCglkZXYtPmdhZGdldC5zcGVlZCA9IFVTQl9TUEVFRF9GVUxMOwoKCS8qIFNldCBNQVhQIGZvciBhbGwgZW5kcG9pbnRzICovCglmb3IgKGkgPSAwOyBpIDwgUzNDMjQxMF9FTkRQT0lOVFM7IGkrKykgewoJCXVkY193cml0ZShpLCBTM0MyNDEwX1VEQ19JTkRFWF9SRUcpOwoJCXVkY193cml0ZSgoZGV2LT5lcFtpXS5lcC5tYXhwYWNrZXQgJiAweDdmZikgPj4gMywKCQkJCVMzQzI0MTBfVURDX01BWFBfUkVHKTsKCX0KCgkvKiBTZXQgZGVmYXVsdCBwb3dlciBzdGF0ZSAqLwoJdWRjX3dyaXRlKERFRkFVTFRfUE9XRVJfU1RBVEUsIFMzQzI0MTBfVURDX1BXUl9SRUcpOwoKCS8qIEVuYWJsZSByZXNldCBhbmQgc3VzcGVuZCBpbnRlcnJ1cHQgaW50ZXJydXB0cyAqLwoJdWRjX3dyaXRlKFMzQzI0MTBfVURDX1VTQklOVF9SRVNFVCB8IFMzQzI0MTBfVURDX1VTQklOVF9TVVNQRU5ELAoJCQlTM0MyNDEwX1VEQ19VU0JfSU5UX0VOX1JFRyk7CgoJLyogRW5hYmxlIGVwMCBpbnRlcnJ1cHQgKi8KCXVkY193cml0ZShTM0MyNDEwX1VEQ19JTlRfRVAwLCBTM0MyNDEwX1VEQ19FUF9JTlRfRU5fUkVHKTsKCgkvKiB0aW1lIHRvIHNheSAiaGVsbG8sIHdvcmxkIiAqLwoJaWYgKHVkY19pbmZvICYmIHVkY19pbmZvLT51ZGNfY29tbWFuZCkKCQl1ZGNfaW5mby0+dWRjX2NvbW1hbmQoUzNDMjQxMF9VRENfUF9FTkFCTEUpOwp9CgovKgogKgl1c2JfZ2FkZ2V0X3JlZ2lzdGVyX2RyaXZlcgogKi8KaW50IHVzYl9nYWRnZXRfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQp7CglzdHJ1Y3QgczNjMjQxMF91ZGMgKnVkYyA9IHRoZV9jb250cm9sbGVyOwoJaW50CQlyZXR2YWw7CgoJZHByaW50ayhERUJVR19OT1JNQUwsICJ1c2JfZ2FkZ2V0X3JlZ2lzdGVyX2RyaXZlcigpICclcydcbiIsCgkJZHJpdmVyLT5kcml2ZXIubmFtZSk7CgoJLyogU2FuaXR5IGNoZWNrcyAqLwoJaWYgKCF1ZGMpCgkJcmV0dXJuIC1FTk9ERVY7CgoJaWYgKHVkYy0+ZHJpdmVyKQoJCXJldHVybiAtRUJVU1k7CgoJaWYgKCFkcml2ZXItPmJpbmQgfHwgIWRyaXZlci0+c2V0dXAKCQkJfHwgZHJpdmVyLT5zcGVlZCAhPSBVU0JfU1BFRURfRlVMTCkgewoJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBkcml2ZXI6IGJpbmQgJXAgc2V0dXAgJXAgc3BlZWQgJWRcbiIsCgkJCWRyaXZlci0+YmluZCwgZHJpdmVyLT5zZXR1cCwgZHJpdmVyLT5zcGVlZCk7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CiNpZiBkZWZpbmVkKE1PRFVMRSkKCWlmICghZHJpdmVyLT51bmJpbmQpIHsKCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgZHJpdmVyOiBubyB1bmJpbmQgbWV0aG9kXG4iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KI2VuZGlmCgoJLyogSG9vayB0aGUgZHJpdmVyICovCgl1ZGMtPmRyaXZlciA9IGRyaXZlcjsKCXVkYy0+Z2FkZ2V0LmRldi5kcml2ZXIgPSAmZHJpdmVyLT5kcml2ZXI7CgoJLyogQmluZCB0aGUgZHJpdmVyICovCglpZiAoKHJldHZhbCA9IGRldmljZV9hZGQoJnVkYy0+Z2FkZ2V0LmRldikpICE9IDApIHsKCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIGluIGRldmljZV9hZGQoKSA6ICVkXG4iLHJldHZhbCk7CgkJZ290byByZWdpc3Rlcl9lcnJvcjsKCX0KCglkcHJpbnRrKERFQlVHX05PUk1BTCwgImJpbmRpbmcgZ2FkZ2V0IGRyaXZlciAnJXMnXG4iLAoJCWRyaXZlci0+ZHJpdmVyLm5hbWUpOwoKCWlmICgocmV0dmFsID0gZHJpdmVyLT5iaW5kICgmdWRjLT5nYWRnZXQpKSAhPSAwKSB7CgkJZGV2aWNlX2RlbCgmdWRjLT5nYWRnZXQuZGV2KTsKCQlnb3RvIHJlZ2lzdGVyX2Vycm9yOwoJfQoKCS8qIEVuYWJsZSB1ZGMgKi8KCXMzYzI0MTBfdWRjX2VuYWJsZSh1ZGMpOwoKCXJldHVybiAwOwoKcmVnaXN0ZXJfZXJyb3I6Cgl1ZGMtPmRyaXZlciA9IE5VTEw7Cgl1ZGMtPmdhZGdldC5kZXYuZHJpdmVyID0gTlVMTDsKCXJldHVybiByZXR2YWw7Cn0KCi8qCiAqCXVzYl9nYWRnZXRfdW5yZWdpc3Rlcl9kcml2ZXIKICovCmludCB1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQp7CglzdHJ1Y3QgczNjMjQxMF91ZGMgKnVkYyA9IHRoZV9jb250cm9sbGVyOwoKCWlmICghdWRjKQoJCXJldHVybiAtRU5PREVWOwoKCWlmICghZHJpdmVyIHx8IGRyaXZlciAhPSB1ZGMtPmRyaXZlciB8fCAhZHJpdmVyLT51bmJpbmQpCgkJcmV0dXJuIC1FSU5WQUw7CgoJZHByaW50ayhERUJVR19OT1JNQUwsInVzYl9nYWRnZXRfcmVnaXN0ZXJfZHJpdmVyKCkgJyVzJ1xuIiwKCQlkcml2ZXItPmRyaXZlci5uYW1lKTsKCglpZiAoZHJpdmVyLT5kaXNjb25uZWN0KQoJCWRyaXZlci0+ZGlzY29ubmVjdCgmdWRjLT5nYWRnZXQpOwoKCWRldmljZV9kZWwoJnVkYy0+Z2FkZ2V0LmRldik7Cgl1ZGMtPmRyaXZlciA9IE5VTEw7CgoJLyogRGlzYWJsZSB1ZGMgKi8KCXMzYzI0MTBfdWRjX2Rpc2FibGUodWRjKTsKCglyZXR1cm4gMDsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpzdGF0aWMgc3RydWN0IHMzYzI0MTBfdWRjIG1lbW9yeSA9IHsKCS5nYWRnZXQgPSB7CgkJLm9wcwkJPSAmczNjMjQxMF9vcHMsCgkJLmVwMAkJPSAmbWVtb3J5LmVwWzBdLmVwLAoJCS5uYW1lCQk9IGdhZGdldF9uYW1lLAoJCS5kZXYgPSB7CgkJCS5idXNfaWQJCT0gImdhZGdldCIsCgkJfSwKCX0sCgoJLyogY29udHJvbCBlbmRwb2ludCAqLwoJLmVwWzBdID0gewoJCS5udW0JCT0gMCwKCQkuZXAgPSB7CgkJCS5uYW1lCQk9IGVwMG5hbWUsCgkJCS5vcHMJCT0gJnMzYzI0MTBfZXBfb3BzLAoJCQkubWF4cGFja2V0CT0gRVAwX0ZJRk9fU0laRSwKCQl9LAoJCS5kZXYJCT0gJm1lbW9yeSwKCX0sCgoJLyogZmlyc3QgZ3JvdXAgb2YgZW5kcG9pbnRzICovCgkuZXBbMV0gPSB7CgkJLm51bQkJPSAxLAoJCS5lcCA9IHsKCQkJLm5hbWUJCT0gImVwMS1idWxrIiwKCQkJLm9wcwkJPSAmczNjMjQxMF9lcF9vcHMsCgkJCS5tYXhwYWNrZXQJPSBFUF9GSUZPX1NJWkUsCgkJfSwKCQkuZGV2CQk9ICZtZW1vcnksCgkJLmZpZm9fc2l6ZQk9IEVQX0ZJRk9fU0laRSwKCQkuYkVuZHBvaW50QWRkcmVzcyA9IDEsCgkJLmJtQXR0cmlidXRlcwk9IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCgl9LAoJLmVwWzJdID0gewoJCS5udW0JCT0gMiwKCQkuZXAgPSB7CgkJCS5uYW1lCQk9ICJlcDItYnVsayIsCgkJCS5vcHMJCT0gJnMzYzI0MTBfZXBfb3BzLAoJCQkubWF4cGFja2V0CT0gRVBfRklGT19TSVpFLAoJCX0sCgkJLmRldgkJPSAmbWVtb3J5LAoJCS5maWZvX3NpemUJPSBFUF9GSUZPX1NJWkUsCgkJLmJFbmRwb2ludEFkZHJlc3MgPSAyLAoJCS5ibUF0dHJpYnV0ZXMJPSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAoJfSwKCS5lcFszXSA9IHsKCQkubnVtCQk9IDMsCgkJLmVwID0gewoJCQkubmFtZQkJPSAiZXAzLWJ1bGsiLAoJCQkub3BzCQk9ICZzM2MyNDEwX2VwX29wcywKCQkJLm1heHBhY2tldAk9IEVQX0ZJRk9fU0laRSwKCQl9LAoJCS5kZXYJCT0gJm1lbW9yeSwKCQkuZmlmb19zaXplCT0gRVBfRklGT19TSVpFLAoJCS5iRW5kcG9pbnRBZGRyZXNzID0gMywKCQkuYm1BdHRyaWJ1dGVzCT0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSywKCX0sCgkuZXBbNF0gPSB7CgkJLm51bQkJPSA0LAoJCS5lcCA9IHsKCQkJLm5hbWUJCT0gImVwNC1idWxrIiwKCQkJLm9wcwkJPSAmczNjMjQxMF9lcF9vcHMsCgkJCS5tYXhwYWNrZXQJPSBFUF9GSUZPX1NJWkUsCgkJfSwKCQkuZGV2CQk9ICZtZW1vcnksCgkJLmZpZm9fc2l6ZQk9IEVQX0ZJRk9fU0laRSwKCQkuYkVuZHBvaW50QWRkcmVzcyA9IDQsCgkJLmJtQXR0cmlidXRlcwk9IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCgl9Cgp9OwoKLyoKICoJcHJvYmUgLSBiaW5kcyB0byB0aGUgcGxhdGZvcm0gZGV2aWNlCiAqLwpzdGF0aWMgaW50IHMzYzI0MTBfdWRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCnsKCXN0cnVjdCBzM2MyNDEwX3VkYyAqdWRjID0gJm1lbW9yeTsKCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CglpbnQgcmV0dmFsOwoJdW5zaWduZWQgaW50IGlycTsKCglkZXZfZGJnKGRldiwgIiVzKClcbiIsIF9fZnVuY19fKTsKCgl1c2JfYnVzX2Nsb2NrID0gY2xrX2dldChOVUxMLCAidXNiLWJ1cy1nYWRnZXQiKTsKCWlmIChJU19FUlIodXNiX2J1c19jbG9jaykpIHsKCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgdXNiIGJ1cyBjbG9jayBzb3VyY2VcbiIpOwoJCXJldHVybiBQVFJfRVJSKHVzYl9idXNfY2xvY2spOwoJfQoKCWNsa19lbmFibGUodXNiX2J1c19jbG9jayk7CgoJdWRjX2Nsb2NrID0gY2xrX2dldChOVUxMLCAidXNiLWRldmljZSIpOwoJaWYgKElTX0VSUih1ZGNfY2xvY2spKSB7CgkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IHVkYyBjbG9jayBzb3VyY2VcbiIpOwoJCXJldHVybiBQVFJfRVJSKHVkY19jbG9jayk7Cgl9CgoJY2xrX2VuYWJsZSh1ZGNfY2xvY2spOwoKCW1kZWxheSgxMCk7CgoJZGV2X2RiZyhkZXYsICJnb3QgYW5kIGVuYWJsZWQgY2xvY2tzXG4iKTsKCglpZiAoc3RybmNtcChwZGV2LT5uYW1lLCAiczNjMjQ0MCIsIDcpID09IDApIHsKCQlkZXZfaW5mbyhkZXYsICJTM0MyNDQwOiBpbmNyZWFzaW5nIEZJRk8gdG8gMTI4IGJ5dGVzXG4iKTsKCQltZW1vcnkuZXBbMV0uZmlmb19zaXplID0gUzNDMjQ0MF9FUF9GSUZPX1NJWkU7CgkJbWVtb3J5LmVwWzJdLmZpZm9fc2l6ZSA9IFMzQzI0NDBfRVBfRklGT19TSVpFOwoJCW1lbW9yeS5lcFszXS5maWZvX3NpemUgPSBTM0MyNDQwX0VQX0ZJRk9fU0laRTsKCQltZW1vcnkuZXBbNF0uZmlmb19zaXplID0gUzNDMjQ0MF9FUF9GSUZPX1NJWkU7Cgl9CgoJc3Bpbl9sb2NrX2luaXQgKCZ1ZGMtPmxvY2spOwoJdWRjX2luZm8gPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKCglyc3JjX3N0YXJ0ID0gUzNDMjQxMF9QQV9VU0JERVY7Cglyc3JjX2xlbiAgID0gUzNDMjRYWF9TWl9VU0JERVY7CgoJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocnNyY19zdGFydCwgcnNyY19sZW4sIGdhZGdldF9uYW1lKSkKCQlyZXR1cm4gLUVCVVNZOwoKCWJhc2VfYWRkciA9IGlvcmVtYXAocnNyY19zdGFydCwgcnNyY19sZW4pOwoJaWYgKCFiYXNlX2FkZHIpIHsKCQlyZXR2YWwgPSAtRU5PTUVNOwoJCWdvdG8gZXJyX21lbTsKCX0KCglkZXZpY2VfaW5pdGlhbGl6ZSgmdWRjLT5nYWRnZXQuZGV2KTsKCXVkYy0+Z2FkZ2V0LmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OwoJdWRjLT5nYWRnZXQuZGV2LmRtYV9tYXNrID0gcGRldi0+ZGV2LmRtYV9tYXNrOwoKCXRoZV9jb250cm9sbGVyID0gdWRjOwoJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgdWRjKTsKCglzM2MyNDEwX3VkY19kaXNhYmxlKHVkYyk7CglzM2MyNDEwX3VkY19yZWluaXQodWRjKTsKCgkvKiBpcnEgc2V0dXAgYWZ0ZXIgb2xkIGhhcmR3YXJlIHN0YXRlIGlzIGNsZWFuZWQgdXAgKi8KCXJldHZhbCA9IHJlcXVlc3RfaXJxKElSUV9VU0JELCBzM2MyNDEwX3VkY19pcnEsCgkJCUlSUUZfRElTQUJMRUQsIGdhZGdldF9uYW1lLCB1ZGMpOwoKCWlmIChyZXR2YWwgIT0gMCkgewoJCWRldl9lcnIoZGV2LCAiY2Fubm90IGdldCBpcnEgJWksIGVyciAlZFxuIiwgSVJRX1VTQkQsIHJldHZhbCk7CgkJcmV0dmFsID0gLUVCVVNZOwoJCWdvdG8gZXJyX21hcDsKCX0KCglkZXZfZGJnKGRldiwgImdvdCBpcnEgJWlcbiIsIElSUV9VU0JEKTsKCglpZiAodWRjX2luZm8gJiYgdWRjX2luZm8tPnZidXNfcGluID4gMCkgewoJCWlycSA9IHMzYzI0MTBfZ3Bpb19nZXRpcnEodWRjX2luZm8tPnZidXNfcGluKTsKCQlyZXR2YWwgPSByZXF1ZXN0X2lycShpcnEsIHMzYzI0MTBfdWRjX3ZidXNfaXJxLAoJCQkJICAgICBJUlFGX0RJU0FCTEVEIHwgSVJRRl9UUklHR0VSX1JJU0lORwoJCQkJICAgICB8IElSUUZfVFJJR0dFUl9GQUxMSU5HIHwgSVJRRl9TSEFSRUQsCgkJCQkgICAgIGdhZGdldF9uYW1lLCB1ZGMpOwoKCQlpZiAocmV0dmFsICE9IDApIHsKCQkJZGV2X2VycihkZXYsICJjYW4ndCBnZXQgdmJ1cyBpcnEgJWksIGVyciAlZFxuIiwKCQkJCWlycSwgcmV0dmFsKTsKCQkJcmV0dmFsID0gLUVCVVNZOwoJCQlnb3RvIGVycl9pbnQ7CgkJfQoKCQlkZXZfZGJnKGRldiwgImdvdCBpcnEgJWlcbiIsIGlycSk7Cgl9IGVsc2UgewoJCXVkYy0+dmJ1cyA9IDE7Cgl9CgoJaWYgKHMzYzI0MTBfdWRjX2RlYnVnZnNfcm9vdCkgewoJCXVkYy0+cmVnc19pbmZvID0gZGVidWdmc19jcmVhdGVfZmlsZSgicmVnaXN0ZXJzIiwgU19JUlVHTywKCQkJCXMzYzI0MTBfdWRjX2RlYnVnZnNfcm9vdCwKCQkJCXVkYywgJnMzYzI0MTBfdWRjX2RlYnVnZnNfZm9wcyk7CgkJaWYgKElTX0VSUih1ZGMtPnJlZ3NfaW5mbykpIHsKCQkJZGV2X3dhcm4oZGV2LCAiZGVidWdmcyBmaWxlIGNyZWF0aW9uIGZhaWxlZCAlbGRcbiIsCgkJCQkgUFRSX0VSUih1ZGMtPnJlZ3NfaW5mbykpOwoJCQl1ZGMtPnJlZ3NfaW5mbyA9IE5VTEw7CgkJfQoJfQoKCWRldl9kYmcoZGV2LCAicHJvYmUgb2tcbiIpOwoKCXJldHVybiAwOwoKZXJyX2ludDoKCWZyZWVfaXJxKElSUV9VU0JELCB1ZGMpOwplcnJfbWFwOgoJaW91bm1hcChiYXNlX2FkZHIpOwplcnJfbWVtOgoJcmVsZWFzZV9tZW1fcmVnaW9uKHJzcmNfc3RhcnQsIHJzcmNfbGVuKTsKCglyZXR1cm4gcmV0dmFsOwp9CgovKgogKglzM2MyNDEwX3VkY19yZW1vdmUKICovCnN0YXRpYyBpbnQgczNjMjQxMF91ZGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCnsKCXN0cnVjdCBzM2MyNDEwX3VkYyAqdWRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Cgl1bnNpZ25lZCBpbnQgaXJxOwoKCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzKClcbiIsIF9fZnVuY19fKTsKCWlmICh1ZGMtPmRyaXZlcikKCQlyZXR1cm4gLUVCVVNZOwoKCWRlYnVnZnNfcmVtb3ZlKHVkYy0+cmVnc19pbmZvKTsKCglpZiAodWRjX2luZm8gJiYgdWRjX2luZm8tPnZidXNfcGluID4gMCkgewoJCWlycSA9IHMzYzI0MTBfZ3Bpb19nZXRpcnEodWRjX2luZm8tPnZidXNfcGluKTsKCQlmcmVlX2lycShpcnEsIHVkYyk7Cgl9CgoJZnJlZV9pcnEoSVJRX1VTQkQsIHVkYyk7CgoJaW91bm1hcChiYXNlX2FkZHIpOwoJcmVsZWFzZV9tZW1fcmVnaW9uKHJzcmNfc3RhcnQsIHJzcmNfbGVuKTsKCglwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKCglpZiAoIUlTX0VSUih1ZGNfY2xvY2spICYmIHVkY19jbG9jayAhPSBOVUxMKSB7CgkJY2xrX2Rpc2FibGUodWRjX2Nsb2NrKTsKCQljbGtfcHV0KHVkY19jbG9jayk7CgkJdWRjX2Nsb2NrID0gTlVMTDsKCX0KCglpZiAoIUlTX0VSUih1c2JfYnVzX2Nsb2NrKSAmJiB1c2JfYnVzX2Nsb2NrICE9IE5VTEwpIHsKCQljbGtfZGlzYWJsZSh1c2JfYnVzX2Nsb2NrKTsKCQljbGtfcHV0KHVzYl9idXNfY2xvY2spOwoJCXVzYl9idXNfY2xvY2sgPSBOVUxMOwoJfQoKCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzOiByZW1vdmUgb2tcbiIsIF9fZnVuY19fKTsKCXJldHVybiAwOwp9CgojaWZkZWYgQ09ORklHX1BNCnN0YXRpYyBpbnQgczNjMjQxMF91ZGNfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKewoJaWYgKHVkY19pbmZvICYmIHVkY19pbmZvLT51ZGNfY29tbWFuZCkKCQl1ZGNfaW5mby0+dWRjX2NvbW1hbmQoUzNDMjQxMF9VRENfUF9ESVNBQkxFKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzM2MyNDEwX3VkY19yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKewoJaWYgKHVkY19pbmZvICYmIHVkY19pbmZvLT51ZGNfY29tbWFuZCkKCQl1ZGNfaW5mby0+dWRjX2NvbW1hbmQoUzNDMjQxMF9VRENfUF9FTkFCTEUpOwoKCXJldHVybiAwOwp9CiNlbHNlCiNkZWZpbmUgczNjMjQxMF91ZGNfc3VzcGVuZAlOVUxMCiNkZWZpbmUgczNjMjQxMF91ZGNfcmVzdW1lCU5VTEwKI2VuZGlmCgpzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB1ZGNfZHJpdmVyXzI0MTAgPSB7CgkuZHJpdmVyCQk9IHsKCQkubmFtZQk9ICJzM2MyNDEwLXVzYmdhZGdldCIsCgkJLm93bmVyCT0gVEhJU19NT0RVTEUsCgl9LAoJLnByb2JlCQk9IHMzYzI0MTBfdWRjX3Byb2JlLAoJLnJlbW92ZQkJPSBzM2MyNDEwX3VkY19yZW1vdmUsCgkuc3VzcGVuZAk9IHMzYzI0MTBfdWRjX3N1c3BlbmQsCgkucmVzdW1lCQk9IHMzYzI0MTBfdWRjX3Jlc3VtZSwKfTsKCnN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHVkY19kcml2ZXJfMjQ0MCA9IHsKCS5kcml2ZXIJCT0gewoJCS5uYW1lCT0gInMzYzI0NDAtdXNiZ2FkZ2V0IiwKCQkub3duZXIJPSBUSElTX01PRFVMRSwKCX0sCgkucHJvYmUJCT0gczNjMjQxMF91ZGNfcHJvYmUsCgkucmVtb3ZlCQk9IHMzYzI0MTBfdWRjX3JlbW92ZSwKCS5zdXNwZW5kCT0gczNjMjQxMF91ZGNfc3VzcGVuZCwKCS5yZXN1bWUJCT0gczNjMjQxMF91ZGNfcmVzdW1lLAp9OwoKc3RhdGljIGludCBfX2luaXQgdWRjX2luaXQodm9pZCkKewoJaW50IHJldHZhbDsKCglkcHJpbnRrKERFQlVHX05PUk1BTCwgIiVzOiB2ZXJzaW9uICVzXG4iLCBnYWRnZXRfbmFtZSwgRFJJVkVSX1ZFUlNJT04pOwoKCXMzYzI0MTBfdWRjX2RlYnVnZnNfcm9vdCA9IGRlYnVnZnNfY3JlYXRlX2RpcihnYWRnZXRfbmFtZSwgTlVMTCk7CglpZiAoSVNfRVJSKHMzYzI0MTBfdWRjX2RlYnVnZnNfcm9vdCkpIHsKCQlwcmludGsoS0VSTl9FUlIgIiVzOiBkZWJ1Z2ZzIGRpciBjcmVhdGlvbiBmYWlsZWQgJWxkXG4iLAoJCQlnYWRnZXRfbmFtZSwgUFRSX0VSUihzM2MyNDEwX3VkY19kZWJ1Z2ZzX3Jvb3QpKTsKCQlzM2MyNDEwX3VkY19kZWJ1Z2ZzX3Jvb3QgPSBOVUxMOwoJfQoKCXJldHZhbCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdWRjX2RyaXZlcl8yNDEwKTsKCWlmIChyZXR2YWwpCgkJZ290byBlcnI7CgoJcmV0dmFsID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ1ZGNfZHJpdmVyXzI0NDApOwoJaWYgKHJldHZhbCkKCQlnb3RvIGVycjsKCglyZXR1cm4gMDsKCmVycjoKCWRlYnVnZnNfcmVtb3ZlKHMzYzI0MTBfdWRjX2RlYnVnZnNfcm9vdCk7CglyZXR1cm4gcmV0dmFsOwp9CgpzdGF0aWMgdm9pZCBfX2V4aXQgdWRjX2V4aXQodm9pZCkKewoJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnVkY19kcml2ZXJfMjQxMCk7CglwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdWRjX2RyaXZlcl8yNDQwKTsKCWRlYnVnZnNfcmVtb3ZlKHMzYzI0MTBfdWRjX2RlYnVnZnNfcm9vdCk7Cn0KCkVYUE9SVF9TWU1CT0wodXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcik7CkVYUE9SVF9TWU1CT0wodXNiX2dhZGdldF9yZWdpc3Rlcl9kcml2ZXIpOwoKbW9kdWxlX2luaXQodWRjX2luaXQpOwptb2R1bGVfZXhpdCh1ZGNfZXhpdCk7CgpNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOwpNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOwpNT0RVTEVfVkVSU0lPTihEUklWRVJfVkVSU0lPTik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsK