LyoKICogTW9kaWZpZWQgaW4gb3JkZXIgdG8ga2VlcCBpdCBjb21wYXRpYmxlIGJvdGggd2l0aCBuZXcgYW5kIG9sZCB2aWRlb3RleHQgSU9DVExzIGJ5CiAqIE1pY2hhZWwgR2VuZyA8bGludXhATWljaGFlbEdlbmcuZGU+CiAqCiAqCUNsZWFuZWQgdXAgdG8gdXNlIGV4aXN0aW5nIHZpZGVvZGV2IGludGVyZmFjZSBhbmQgYWxsb3cgdGhlIGlkZWEKICoJb2YgbXVsdGlwbGUgdGVsZXRleHQgZGVjb2RlcnMgb24gdGhlIHZpZGVvNGxpbnV4IGlmYWNlLiBDaGFuZ2VkIGkyYwogKgl0byBjb3ZlciBhZGRyZXNzaW5nIGNsYXNoZXMgb24gZGV2aWNlIGJ1c3Nlcy4gSXQncyBhbHNvIHJlYnVpbHQgc28KICoJeW91IGNhbiBhZGQgYXJiaXRhcnkgbXVsdGlwbGUgdGVsZXRleHQgZGV2aWNlcyB0byBMaW51eCB2aWRlbzRsaW51eAogKglub3cgKHdlbGwgMzIgYW55d2F5KS4KICoKICoJQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KICoKICoJVGhlIG9yaWdpbmFsIGRyaXZlciB3YXMgaGVhdmlseSBtb2RpZmllZCB0byBtYXRjaCB0aGUgaTJjIGludGVyZmFjZQogKglJdCB3YXMgdHJ1bmNhdGVkIHRvIHVzZSB0aGUgV2luVFYgYm9hcmRzLCB0b28uCiAqCiAqCUNvcHlyaWdodCAoYykgMTk5OCBSaWNoYXJkIEd1ZW50aGVyIDxyaWNoYXJkLmd1ZW50aGVyQHN0dWRlbnQudW5pLXR1ZWJpbmdlbi5kZT4KICoKICoJRGVyaXZlZCBGcm9tCiAqCiAqIHZ0eC5jOgogKiBUaGlzIGlzIGEgbG9hZGFibGUgY2hhcmFjdGVyLWRldmljZS1kcml2ZXIgZm9yIHZpZGVvdGV4dC1pbnRlcmZhY2VzCiAqIChha2EgdGVsZXRleHQpLiBQbGVhc2UgY2hlY2sgdGhlIE1ha2VmaWxlL1JFQURNRSBmb3IgYSBsaXN0IG9mIHN1cHBvcnRlZAogKiBpbnRlcmZhY2VzLgogKgogKiBDb3B5cmlnaHQgKGMpIDE5OTQtOTcgTWFydGluIEJ1Y2sgIDxtYXJ0aW4tMi5idWNrQHN0dWRlbnQudW5pLXVsbS5kZT4KICoKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCiAqIFVTQS4KICovCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L21tLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9pMmMuaD4KI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgojaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KI2luY2x1ZGUgPGxpbnV4L3ZpZGVvdGV4dC5oPgojaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CiNpbmNsdWRlIDxtZWRpYS92NGwyLWkyYy1kcnYtbGVnYWN5Lmg+CgpNT0RVTEVfQVVUSE9SKCJNaWNoYWVsIEdlbmcgPGxpbnV4QE1pY2hhZWxHZW5nLmRlPiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIlBoaWxpcHMgU0FBNTI0OSBUZWxldGV4dCBkZWNvZGVyIGRyaXZlciIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7CgojZGVmaW5lIFZUWF9WRVJfTUFKIDEKI2RlZmluZSBWVFhfVkVSX01JTiA4CgoKI2RlZmluZSBOVU1fREFVUyA0CiNkZWZpbmUgTlVNX0JVRlMgOAoKc3RhdGljIGNvbnN0IGludCBkaXNwX21vZGVzWzhdWzNdID0KewoJeyAweDQ2LCAweDAzLCAweDAzIH0sCS8qIERJU1BPRkYgKi8KCXsgMHg0NiwgMHhjYywgMHhjYyB9LAkvKiBESVNQTk9STSAqLwoJeyAweDQ0LCAweDBmLCAweDBmIH0sCS8qIERJU1BUUkFOUyAqLwoJeyAweDQ2LCAweGNjLCAweDQ2IH0sCS8qIERJU1BJTlMgKi8KCXsgMHg0NCwgMHgwMywgMHgwMyB9LAkvKiBESVNQT0ZGLCBpbnRlcmxhY2VkICovCgl7IDB4NDQsIDB4Y2MsIDB4Y2MgfSwJLyogRElTUE5PUk0sIGludGVybGFjZWQgKi8KCXsgMHg0NCwgMHgwZiwgMHgwZiB9LAkvKiBESVNQVFJBTlMsIGludGVybGFjZWQgKi8KCXsgMHg0NCwgMHhjYywgMHg0NiB9CS8qIERJU1BJTlMsIGludGVybGFjZWQgKi8KfTsKCgoKI2RlZmluZSBQQUdFX1dBSVQgICAgbXNlY3NfdG9famlmZmllcygzMDApCS8qIFRpbWUgYmV0d2VlbiByZXF1ZXN0aW5nIHBhZ2UgYW5kICovCgkJCQkJCS8qIGNoZWNraW5nIHN0YXR1cyBiaXRzICovCiNkZWZpbmUgUEdCVUZfRVhQSVJFIG1zZWNzX3RvX2ppZmZpZXMoMTUwMDApCS8qIFRpbWUgdG8gd2FpdCBiZWZvcmUgcmV0cmFuc21pdHRpbmcgKi8KCQkJCQkJLyogcGFnZSByZWdhcmRsZXNzIG9mIGluZm9iaXRzICovCnR5cGVkZWYgc3RydWN0IHsKCXU4IHBnYnVmW1ZUWF9WSVJUVUFMU0laRV07CQkvKiBQYWdlLWJ1ZmZlciAqLwoJdTggbGFzdHN0YXRbMTBdOwkJCS8qIExhc3QgdmFsdWUgb2YgaW5mb2JpdHMgZm9yIERBVSAqLwoJdTggc3JlZ3NbN107CQkJCS8qIFBhZ2UtcmVxdWVzdCByZWdpc3RlcnMgKi8KCXVuc2lnbmVkIGxvbmcgZXhwaXJlOwkJCS8qIFRpbWUgd2hlbiBwYWdlIHdpbGwgYmUgZXhwaXJlZCAqLwoJdW5zaWduZWQgY2xyZm91bmQgOiAxOwkJCS8qIFZUWElPQ0NMUkZPVU5EIGhhcyBiZWVuIGNhbGxlZCAqLwoJdW5zaWduZWQgc3RvcHBlZCA6IDE7CQkJLyogVlRYSU9DU1RPUERBVSBoYXMgYmVlbiBjYWxsZWQgKi8KfSB2ZGF1X3Q7CgpzdHJ1Y3Qgc2FhNTI0OV9kZXZpY2UKewoJdmRhdV90IHZkYXVbTlVNX0RBVVNdOwkJCS8qIERhdGEgZm9yIHZpcnR1YWwgREFVcyAodGhlIDUyNDkgb25seSBoYXMgb25lICovCgkJCQkJCS8qIHJlYWwgREFVLCBzbyB3ZSBoYXZlIHRvIHNpbXVsYXRlIHNvbWUgbW9yZSkgKi8KCWludCB2dHhfdXNlX2NvdW50OwoJaW50IGlzX3NlYXJjaGluZ1tOVU1fREFVU107CglpbnQgZGlzcF9tb2RlOwoJaW50IHZpcnR1YWxfbW9kZTsKCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7Cgl1bnNpZ25lZCBsb25nIGluX3VzZTsKCXN0cnVjdCBtdXRleCBsb2NrOwp9OwoKCiNkZWZpbmUgQ0NUV1IgMzQJCS8qIEmyQyB3cml0ZS9yZWFkLWFkZHJlc3Mgb2YgdnR4LWNoaXAgKi8KI2RlZmluZSBDQ1RSRCAzNQojZGVmaW5lIE5PQUNLX1JFUEVBVCAxMAkJLyogUmV0cnkgYWNjZXNzIHRoaXMgbWFueSB0aW1lcyBvbiBmYWlsdXJlICovCiNkZWZpbmUgQ0xFQVJfREVMQVkgICBtc2Vjc190b19qaWZmaWVzKDUwKQkvKiBUaW1lIHJlcXVpcmVkIHRvIGNsZWFyIGEgcGFnZSAqLwojZGVmaW5lIFJFQURZX1RJTUVPVVQgbXNlY3NfdG9famlmZmllcygzMCkJLyogVGltZSB0byB3YWl0IGZvciByZWFkeSBzaWduYWwgb2YgSTJDLWJ1cyBpbnRlcmZhY2UgKi8KI2RlZmluZSBJTklUX0RFTEFZIDUwMAkJLyogVGltZSBpbiB1c2VjIHRvIHdhaXQgYXQgaW5pdGlhbGl6YXRpb24gb2YgQ0VBIGludGVyZmFjZSAqLwojZGVmaW5lIFNUQVJUX0RFTEFZIDEwCQkvKiBUaW1lIGluIHVzZWMgdG8gd2FpdCBiZWZvcmUgc3RhcnRpbmcgd3JpdGUtY3ljbGUgKENFQSkgKi8KCiNkZWZpbmUgVlRYX0RFVl9NSU5PUiAwCgpzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSBzYWFfdGVtcGxhdGU7CS8qIERlY2xhcmVkIG5lYXIgYm90dG9tICovCgovKgogKglXYWl0IHRoZSBnaXZlbiBudW1iZXIgb2YgamlmZmllcyAoMTBtcykuIFRoaXMgY2FsbHMgdGhlIHNjaGVkdWxlciwgc28gdGhlIGFjdHVhbAogKglkZWxheSBtYXkgYmUgbG9uZ2VyLgogKi8KCnN0YXRpYyB2b2lkIGpkZWxheSh1bnNpZ25lZCBsb25nIGRlbGF5KQp7CglzaWdzZXRfdCBvbGRibG9ja2VkID0gY3VycmVudC0+YmxvY2tlZDsKCglzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKCXNpZ2ZpbGxzZXQoJmN1cnJlbnQtPmJsb2NrZWQpOwoJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Cgltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKGRlbGF5KSk7CgoJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CgljdXJyZW50LT5ibG9ja2VkID0gb2xkYmxvY2tlZDsKCXJlY2FsY19zaWdwZW5kaW5nKCk7CglzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwp9CgoKLyoKICoJSTJDIGludGVyZmFjZXMKICovCgpzdGF0aWMgaW50IGkyY19zZW5kYnVmKHN0cnVjdCBzYWE1MjQ5X2RldmljZSAqdCwgaW50IHJlZywgaW50IGNvdW50LCB1OCAqZGF0YSkKewoJY2hhciBidWZbNjRdOwoKCWJ1ZlswXSA9IHJlZzsKCW1lbWNweShidWYrMSwgZGF0YSwgY291bnQpOwoKCWlmIChpMmNfbWFzdGVyX3NlbmQodC0+Y2xpZW50LCBidWYsIGNvdW50ICsgMSkgPT0gY291bnQgKyAxKQoJCXJldHVybiAwOwoJcmV0dXJuIC0xOwp9CgpzdGF0aWMgaW50IGkyY19zZW5kZGF0YShzdHJ1Y3Qgc2FhNTI0OV9kZXZpY2UgKnQsIC4uLikKewoJdW5zaWduZWQgY2hhciBidWZbNjRdOwoJaW50IHY7CglpbnQgY3QgPSAwOwoJdmFfbGlzdCBhcmdwOwoJdmFfc3RhcnQoYXJncCx0KTsKCgl3aGlsZSAoKHYgPSB2YV9hcmcoYXJncCwgaW50KSkgIT0gLTEpCgkJYnVmW2N0KytdID0gdjsKCgl2YV9lbmQoYXJncCk7CglyZXR1cm4gaTJjX3NlbmRidWYodCwgYnVmWzBdLCBjdC0xLCBidWYrMSk7Cn0KCi8qIEdldCBjb3VudCBudW1iZXIgb2YgYnl0ZXMgZnJvbSBJwrJDLWRldmljZSBhdCBhZGRyZXNzIGFkciwgc3RvcmUgdGhlbSBpbiBidWYuIFN0YXJ0ICYgc3RvcAogKiBoYW5kc2hha2luZyBpcyBkb25lIGJ5IHRoaXMgcm91dGluZSwgYWNrIHdpbGwgYmUgc2VudCBhZnRlciB0aGUgbGFzdCBieXRlIHRvIGluaGliaXQgZnVydGhlcgogKiBzZW5kaW5nIG9mIGRhdGEuIElmIHVhY2Nlc3MgaXMgJ3RydWUnLCBkYXRhIGlzIHdyaXR0ZW4gdG8gdXNlci1zcGFjZSB3aXRoIHB1dF91c2VyLgogKiBSZXR1cm5zIC0xIGlmIEnCskMtZGV2aWNlIGRpZG4ndCBzZW5kIGFja25vd2xlZGdlLCAwIG90aGVyd2lzZQogKi8KCnN0YXRpYyBpbnQgaTJjX2dldGRhdGEoc3RydWN0IHNhYTUyNDlfZGV2aWNlICp0LCBpbnQgY291bnQsIHU4ICpidWYpCnsKCWlmKGkyY19tYXN0ZXJfcmVjdih0LT5jbGllbnQsIGJ1ZiwgY291bnQpIT1jb3VudCkKCQlyZXR1cm4gLTE7CglyZXR1cm4gMDsKfQoKCi8qCiAqCVN0YW5kYXJkIGNoYXJhY3Rlci1kZXZpY2UtZHJpdmVyIGZ1bmN0aW9ucwogKi8KCnN0YXRpYyBpbnQgZG9fc2FhNTI0OV9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQp7CglzdGF0aWMgaW50IHZpcnR1YWxfbW9kZSA9IGZhbHNlOwoJc3RydWN0IHNhYTUyNDlfZGV2aWNlICp0ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKCglzd2l0Y2ggKGNtZCkgewoJY2FzZSBWVFhJT0NHRVRJTkZPOgoJewoJCXZ0eF9pbmZvX3QgKmluZm8gPSBhcmc7CgkJaW5mby0+dmVyc2lvbl9tYWpvciA9IFZUWF9WRVJfTUFKOwoJCWluZm8tPnZlcnNpb25fbWlub3IgPSBWVFhfVkVSX01JTjsKCQlpbmZvLT5udW1wYWdlcyA9IE5VTV9EQVVTOwoJCS8qaW5mby0+Y2N0X3R5cGUgPSBDQ1RfVFlQRTsqLwoJCXJldHVybiAwOwoJfQoKCWNhc2UgVlRYSU9DQ0xSUEFHRToKCXsKCQl2dHhfcGFnZXJlcV90ICpyZXEgPSBhcmc7CgoJCWlmIChyZXEtPnBnYnVmIDwgMCB8fCByZXEtPnBnYnVmID49IE5VTV9EQVVTKQoJCQlyZXR1cm4gLUVJTlZBTDsKCQltZW1zZXQodC0+dmRhdVtyZXEtPnBnYnVmXS5wZ2J1ZiwgJyAnLCBzaXplb2YodC0+dmRhdVswXS5wZ2J1ZikpOwoJCXQtPnZkYXVbcmVxLT5wZ2J1Zl0uY2xyZm91bmQgPSB0cnVlOwoJCXJldHVybiAwOwoJfQoKCWNhc2UgVlRYSU9DQ0xSRk9VTkQ6Cgl7CgkJdnR4X3BhZ2VyZXFfdCAqcmVxID0gYXJnOwoKCQlpZiAocmVxLT5wZ2J1ZiA8IDAgfHwgcmVxLT5wZ2J1ZiA+PSBOVU1fREFVUykKCQkJcmV0dXJuIC1FSU5WQUw7CgkJdC0+dmRhdVtyZXEtPnBnYnVmXS5jbHJmb3VuZCA9IHRydWU7CgkJcmV0dXJuIDA7Cgl9CgoJY2FzZSBWVFhJT0NQQUdFUkVROgoJewoJCXZ0eF9wYWdlcmVxX3QgKnJlcSA9IGFyZzsKCQlpZiAoIShyZXEtPnBhZ2VtYXNrICYgUEdNQVNLX1BBR0UpKQoJCQlyZXEtPnBhZ2UgPSAwOwoJCWlmICghKHJlcS0+cGFnZW1hc2sgJiBQR01BU0tfSE9VUikpCgkJCXJlcS0+aG91ciA9IDA7CgkJaWYgKCEocmVxLT5wYWdlbWFzayAmIFBHTUFTS19NSU5VVEUpKQoJCQlyZXEtPm1pbnV0ZSA9IDA7CgkJaWYgKHJlcS0+cGFnZSA8IDAgfHwgcmVxLT5wYWdlID4gMHg4ZmYpIC8qIDdGRiA/PyAqLwoJCQlyZXR1cm4gLUVJTlZBTDsKCQlyZXEtPnBhZ2UgJj0gMHg3ZmY7CgkJaWYgKHJlcS0+aG91ciA8IDAgfHwgcmVxLT5ob3VyID4gMHgzZiB8fCByZXEtPm1pbnV0ZSA8IDAgfHwgcmVxLT5taW51dGUgPiAweDdmIHx8CgkJCXJlcS0+cGFnZW1hc2sgPCAwIHx8IHJlcS0+cGFnZW1hc2sgPj0gUEdNQVNLX01BWCB8fCByZXEtPnBnYnVmIDwgMCB8fCByZXEtPnBnYnVmID49IE5VTV9EQVVTKQoJCQlyZXR1cm4gLUVJTlZBTDsKCQl0LT52ZGF1W3JlcS0+cGdidWZdLnNyZWdzWzBdID0gKHJlcS0+cGFnZW1hc2sgJiBQR19IVU5EID8gMHgxMCA6IDApIHwgKHJlcS0+cGFnZSAvIDB4MTAwKTsKCQl0LT52ZGF1W3JlcS0+cGdidWZdLnNyZWdzWzFdID0gKHJlcS0+cGFnZW1hc2sgJiBQR19URU4gPyAweDEwIDogMCkgfCAoKHJlcS0+cGFnZSAvIDB4MTApICYgMHhmKTsKCQl0LT52ZGF1W3JlcS0+cGdidWZdLnNyZWdzWzJdID0gKHJlcS0+cGFnZW1hc2sgJiBQR19VTklUID8gMHgxMCA6IDApIHwgKHJlcS0+cGFnZSAmIDB4Zik7CgkJdC0+dmRhdVtyZXEtPnBnYnVmXS5zcmVnc1szXSA9IChyZXEtPnBhZ2VtYXNrICYgSFJfVEVOID8gMHgxMCA6IDApIHwgKHJlcS0+aG91ciAvIDB4MTApOwoJCXQtPnZkYXVbcmVxLT5wZ2J1Zl0uc3JlZ3NbNF0gPSAocmVxLT5wYWdlbWFzayAmIEhSX1VOSVQgPyAweDEwIDogMCkgfCAocmVxLT5ob3VyICYgMHhmKTsKCQl0LT52ZGF1W3JlcS0+cGdidWZdLnNyZWdzWzVdID0gKHJlcS0+cGFnZW1hc2sgJiBNSU5fVEVOID8gMHgxMCA6IDApIHwgKHJlcS0+bWludXRlIC8gMHgxMCk7CgkJdC0+dmRhdVtyZXEtPnBnYnVmXS5zcmVnc1s2XSA9IChyZXEtPnBhZ2VtYXNrICYgTUlOX1VOSVQgPyAweDEwIDogMCkgfCAocmVxLT5taW51dGUgJiAweGYpOwoJCXQtPnZkYXVbcmVxLT5wZ2J1Zl0uc3RvcHBlZCA9IGZhbHNlOwoJCXQtPnZkYXVbcmVxLT5wZ2J1Zl0uY2xyZm91bmQgPSB0cnVlOwoJCXQtPmlzX3NlYXJjaGluZ1tyZXEtPnBnYnVmXSA9IHRydWU7CgkJcmV0dXJuIDA7Cgl9CgoJY2FzZSBWVFhJT0NHRVRTVEFUOgoJewoJCXZ0eF9wYWdlcmVxX3QgKnJlcSA9IGFyZzsKCQl1OCBpbmZvYml0c1sxMF07CgkJdnR4X3BhZ2VpbmZvX3QgaW5mbzsKCQlpbnQgYTsKCgkJaWYgKHJlcS0+cGdidWYgPCAwIHx8IHJlcS0+cGdidWYgPj0gTlVNX0RBVVMpCgkJCXJldHVybiAtRUlOVkFMOwoJCWlmICghdC0+dmRhdVtyZXEtPnBnYnVmXS5zdG9wcGVkKSB7CgkJCWlmIChpMmNfc2VuZGRhdGEodCwgMiwgMCwgLTEpIHx8CgkJCQlpMmNfc2VuZGJ1Zih0LCAzLCBzaXplb2YodC0+dmRhdVswXS5zcmVncyksIHQtPnZkYXVbcmVxLT5wZ2J1Zl0uc3JlZ3MpIHx8CgkJCQlpMmNfc2VuZGRhdGEodCwgOCwgMCwgMjUsIDAsICcgJywgJyAnLCAnICcsICcgJywgJyAnLCAnICcsICcgJywgJyAnLCAnICcsIC0xKSB8fAoJCQkJaTJjX3NlbmRkYXRhKHQsIDIsIDAsIHQtPnZkYXVbcmVxLT5wZ2J1Zl0uc3JlZ3NbMF0gfCA4LCAtMSkgfHwKCQkJCWkyY19zZW5kZGF0YSh0LCA4LCAwLCAyNSwgMCwgLTEpKQoJCQkJcmV0dXJuIC1FSU87CgkJCWpkZWxheShQQUdFX1dBSVQpOwoJCQlpZiAoaTJjX2dldGRhdGEodCwgMTAsIGluZm9iaXRzKSkKCQkJCXJldHVybiAtRUlPOwoKCQkJaWYgKCEoaW5mb2JpdHNbOF0gJiAweDEwKSAmJiAhKGluZm9iaXRzWzddICYgMHhmMCkgJiYJLyogY2hlY2sgRk9VTkQtYml0ICovCgkJCQkobWVtY21wKGluZm9iaXRzLCB0LT52ZGF1W3JlcS0+cGdidWZdLmxhc3RzdGF0LCBzaXplb2YoaW5mb2JpdHMpKSB8fAoJCQkJdGltZV9hZnRlcl9lcShqaWZmaWVzLCB0LT52ZGF1W3JlcS0+cGdidWZdLmV4cGlyZSkpKQoJCQl7CQkvKiBjaGVjayBpZiBuZXcgcGFnZSBhcnJpdmVkICovCgkJCQlpZiAoaTJjX3NlbmRkYXRhKHQsIDgsIDAsIDAsIDAsIC0xKSB8fAoJCQkJCWkyY19nZXRkYXRhKHQsIFZUWF9QQUdFU0laRSwgdC0+dmRhdVtyZXEtPnBnYnVmXS5wZ2J1ZikpCgkJCQkJcmV0dXJuIC1FSU87CgkJCQl0LT52ZGF1W3JlcS0+cGdidWZdLmV4cGlyZSA9IGppZmZpZXMgKyBQR0JVRl9FWFBJUkU7CgkJCQltZW1zZXQodC0+dmRhdVtyZXEtPnBnYnVmXS5wZ2J1ZiArIFZUWF9QQUdFU0laRSwgJyAnLCBWVFhfVklSVFVBTFNJWkUgLSBWVFhfUEFHRVNJWkUpOwoJCQkJaWYgKHQtPnZpcnR1YWxfbW9kZSkgewoJCQkJCS8qIFBhY2tldCBYLzI0ICovCgkJCQkJaWYgKGkyY19zZW5kZGF0YSh0LCA4LCAwLCAweDIwLCAwLCAtMSkgfHwKCQkJCQkJaTJjX2dldGRhdGEodCwgNDAsIHQtPnZkYXVbcmVxLT5wZ2J1Zl0ucGdidWYgKyBWVFhfUEFHRVNJWkUgKyAyMCAqIDQwKSkKCQkJCQkJcmV0dXJuIC1FSU87CgkJCQkJLyogUGFja2V0IFgvMjcvMCAqLwoJCQkJCWlmIChpMmNfc2VuZGRhdGEodCwgOCwgMCwgMHgyMSwgMCwgLTEpIHx8CgkJCQkJCWkyY19nZXRkYXRhKHQsIDQwLCB0LT52ZGF1W3JlcS0+cGdidWZdLnBnYnVmICsgVlRYX1BBR0VTSVpFICsgMTYgKiA0MCkpCgkJCQkJCXJldHVybiAtRUlPOwoJCQkJCS8qIFBhY2tldCA4LzMwLzAuLi44LzMwLzE1CgkJCQkJICogRklYTUU6IEFGQUlLLCB0aGUgNTI0OSBkb2VzIGhhbW1pbmctZGVjb2RpbmcgZm9yIHNvbWUgYnl0ZXMgaW4gcGFja2V0IDgvMzAsCgkJCQkJICogICAgICAgIHNvIHdlIHNob3VsZCB1bmRvIHRoaXMgaGVyZS4KCQkJCQkgKi8KCQkJCQlpZiAoaTJjX3NlbmRkYXRhKHQsIDgsIDAsIDB4MjIsIDAsIC0xKSB8fAoJCQkJCQlpMmNfZ2V0ZGF0YSh0LCA0MCwgdC0+dmRhdVtyZXEtPnBnYnVmXS5wZ2J1ZiArIFZUWF9QQUdFU0laRSArIDIzICogNDApKQoJCQkJCQlyZXR1cm4gLUVJTzsKCQkJCX0KCQkJCXQtPnZkYXVbcmVxLT5wZ2J1Zl0uY2xyZm91bmQgPSBmYWxzZTsKCQkJCW1lbWNweSh0LT52ZGF1W3JlcS0+cGdidWZdLmxhc3RzdGF0LCBpbmZvYml0cywgc2l6ZW9mKGluZm9iaXRzKSk7CgkJCX0gZWxzZSB7CgkJCQltZW1jcHkoaW5mb2JpdHMsIHQtPnZkYXVbcmVxLT5wZ2J1Zl0ubGFzdHN0YXQsIHNpemVvZihpbmZvYml0cykpOwoJCQl9CgkJfSBlbHNlIHsKCQkJbWVtY3B5KGluZm9iaXRzLCB0LT52ZGF1W3JlcS0+cGdidWZdLmxhc3RzdGF0LCBzaXplb2YoaW5mb2JpdHMpKTsKCQl9CgoJCWluZm8ucGFnZW51bSA9ICgoaW5mb2JpdHNbOF0gPDwgOCkgJiAweDcwMCkgfCAoKGluZm9iaXRzWzFdIDw8IDQpICYgMHhmMCkgfCAoaW5mb2JpdHNbMF0gJiAweDBmKTsKCQlpZiAoaW5mby5wYWdlbnVtIDwgMHgxMDApCgkJCWluZm8ucGFnZW51bSArPSAweDgwMDsKCQlpbmZvLmhvdXIgPSAoKGluZm9iaXRzWzVdIDw8IDQpICYgMHgzMCkgfCAoaW5mb2JpdHNbNF0gJiAweDBmKTsKCQlpbmZvLm1pbnV0ZSA9ICgoaW5mb2JpdHNbM10gPDwgNCkgJiAweDcwKSB8IChpbmZvYml0c1syXSAmIDB4MGYpOwoJCWluZm8uY2hhcnNldCA9ICgoaW5mb2JpdHNbN10gPj4gMSkgJiA3KTsKCQlpbmZvLmRlbGV0ZSA9ICEhKGluZm9iaXRzWzNdICYgOCk7CgkJaW5mby5oZWFkbGluZSA9ICEhKGluZm9iaXRzWzVdICYgNCk7CgkJaW5mby5zdWJ0aXRsZSA9ICEhKGluZm9iaXRzWzVdICYgOCk7CgkJaW5mby5zdXBwX2hlYWRlciA9ICEhKGluZm9iaXRzWzZdICYgMSk7CgkJaW5mby51cGRhdGUgPSAhIShpbmZvYml0c1s2XSAmIDIpOwoJCWluZm8uaW50ZXJfc2VxID0gISEoaW5mb2JpdHNbNl0gJiA0KTsKCQlpbmZvLmRpc19kaXNwID0gISEoaW5mb2JpdHNbNl0gJiA4KTsKCQlpbmZvLnNlcmlhbCA9ICEhKGluZm9iaXRzWzddICYgMSk7CgkJaW5mby5ub3Rmb3VuZCA9ICEhKGluZm9iaXRzWzhdICYgMHgxMCk7CgkJaW5mby5wYmxmID0gISEoaW5mb2JpdHNbOV0gJiAweDIwKTsKCQlpbmZvLmhhbW1pbmcgPSAwOwoJCWZvciAoYSA9IDA7IGEgPD0gNzsgYSsrKSB7CgkJCWlmIChpbmZvYml0c1thXSAmIDB4ZjApIHsKCQkJCWluZm8uaGFtbWluZyA9IDE7CgkJCQlicmVhazsKCQkJfQoJCX0KCQlpZiAodC0+dmRhdVtyZXEtPnBnYnVmXS5jbHJmb3VuZCkKCQkJaW5mby5ub3Rmb3VuZCA9IDE7CgkJaWYgKGNvcHlfdG9fdXNlcihyZXEtPmJ1ZmZlciwgJmluZm8sIHNpemVvZih2dHhfcGFnZWluZm9fdCkpKQoJCQlyZXR1cm4gLUVGQVVMVDsKCQlpZiAoIWluZm8uaGFtbWluZyAmJiAhaW5mby5ub3Rmb3VuZCkKCQkJdC0+aXNfc2VhcmNoaW5nW3JlcS0+cGdidWZdID0gZmFsc2U7CgkJcmV0dXJuIDA7Cgl9CgoJY2FzZSBWVFhJT0NHRVRQQUdFOgoJewoJCXZ0eF9wYWdlcmVxX3QgKnJlcSA9IGFyZzsKCQlpbnQgc3RhcnQsIGVuZDsKCgkJaWYgKHJlcS0+cGdidWYgPCAwIHx8IHJlcS0+cGdidWYgPj0gTlVNX0RBVVMgfHwgcmVxLT5zdGFydCA8IDAgfHwKCQkJcmVxLT5zdGFydCA+IHJlcS0+ZW5kIHx8IHJlcS0+ZW5kID49ICh2aXJ0dWFsX21vZGUgPyBWVFhfVklSVFVBTFNJWkUgOiBWVFhfUEFHRVNJWkUpKQoJCQlyZXR1cm4gLUVJTlZBTDsKCQlpZiAoY29weV90b191c2VyKHJlcS0+YnVmZmVyLCAmdC0+dmRhdVtyZXEtPnBnYnVmXS5wZ2J1ZltyZXEtPnN0YXJ0XSwgcmVxLT5lbmQgLSByZXEtPnN0YXJ0ICsgMSkpCgkJCXJldHVybiAtRUZBVUxUOwoKCQkgLyoKCQkgICoJQWx3YXlzIHJlYWQgdGhlIHRpbWUgZGlyZWN0bHkgZnJvbSBTQUE1MjQ5CgkJICAqLwoKCQlpZiAocmVxLT5zdGFydCA8PSAzOSAmJiByZXEtPmVuZCA+PSAzMikgewoJCQlpbnQgbGVuOwoJCQljaGFyIGJ1ZlsxNl07CgkJCXN0YXJ0ID0gbWF4KHJlcS0+c3RhcnQsIDMyKTsKCQkJZW5kID0gbWluKHJlcS0+ZW5kLCAzOSk7CgkJCWxlbiA9IGVuZCAtIHN0YXJ0ICsgMTsKCQkJaWYgKGkyY19zZW5kZGF0YSh0LCA4LCAwLCAwLCBzdGFydCwgLTEpIHx8CgkJCQlpMmNfZ2V0ZGF0YSh0LCBsZW4sIGJ1ZikpCgkJCQlyZXR1cm4gLUVJTzsKCQkJaWYgKGNvcHlfdG9fdXNlcihyZXEtPmJ1ZmZlciArIHN0YXJ0IC0gcmVxLT5zdGFydCwgYnVmLCBsZW4pKQoJCQkJcmV0dXJuIC1FRkFVTFQ7CgkJfQoJCS8qIEluc2VydCB0aGUgY3VycmVudCBoZWFkZXIgaWYgREFVIGlzIHN0aWxsIHNlYXJjaGluZyBmb3IgYSBwYWdlICovCgkJaWYgKHJlcS0+c3RhcnQgPD0gMzEgJiYgcmVxLT5lbmQgPj0gNyAmJiB0LT5pc19zZWFyY2hpbmdbcmVxLT5wZ2J1Zl0pIHsKCQkJY2hhciBidWZbMzJdOwoJCQlpbnQgbGVuOwoKCQkJc3RhcnQgPSBtYXgocmVxLT5zdGFydCwgNyk7CgkJCWVuZCA9IG1pbihyZXEtPmVuZCwgMzEpOwoJCQlsZW4gPSBlbmQgLSBzdGFydCArIDE7CgkJCWlmIChpMmNfc2VuZGRhdGEodCwgOCwgMCwgMCwgc3RhcnQsIC0xKSB8fAoJCQkJaTJjX2dldGRhdGEodCwgbGVuLCBidWYpKQoJCQkJcmV0dXJuIC1FSU87CgkJCWlmIChjb3B5X3RvX3VzZXIocmVxLT5idWZmZXIgKyBzdGFydCAtIHJlcS0+c3RhcnQsIGJ1ZiwgbGVuKSkKCQkJCXJldHVybiAtRUZBVUxUOwoJCX0KCQlyZXR1cm4gMDsKCX0KCgljYXNlIFZUWElPQ1NUT1BEQVU6Cgl7CgkJdnR4X3BhZ2VyZXFfdCAqcmVxID0gYXJnOwoKCQlpZiAocmVxLT5wZ2J1ZiA8IDAgfHwgcmVxLT5wZ2J1ZiA+PSBOVU1fREFVUykKCQkJcmV0dXJuIC1FSU5WQUw7CgkJdC0+dmRhdVtyZXEtPnBnYnVmXS5zdG9wcGVkID0gdHJ1ZTsKCQl0LT5pc19zZWFyY2hpbmdbcmVxLT5wZ2J1Zl0gPSBmYWxzZTsKCQlyZXR1cm4gMDsKCX0KCgljYXNlIFZUWElPQ1BVVFBBR0U6CgljYXNlIFZUWElPQ1NFVERJU1A6CgljYXNlIFZUWElPQ1BVVFNUQVQ6CgkJcmV0dXJuIDA7CgoJY2FzZSBWVFhJT0NDTFJDQUNIRToKCXsKCQlpZiAoaTJjX3NlbmRkYXRhKHQsIDAsIE5VTV9EQVVTLCAwLCA4LCAtMSkgfHwgaTJjX3NlbmRkYXRhKHQsIDExLAoJCQknICcsICcgJywgJyAnLCAnICcsICcgJywgJyAnLAoJCQknICcsICcgJywgJyAnLCAnICcsICcgJywgJyAnLAoJCQknICcsICcgJywgJyAnLCAnICcsICcgJywgJyAnLAoJCQknICcsICcgJywgJyAnLCAnICcsICcgJywgJyAnLAoJCQktMSkpCgkJCXJldHVybiAtRUlPOwoJCWlmIChpMmNfc2VuZGRhdGEodCwgMywgMHgyMCwgLTEpKQoJCQlyZXR1cm4gLUVJTzsKCQlqZGVsYXkoMTAgKiBDTEVBUl9ERUxBWSk7CQkJLyogSSBoYXZlIG5vIGlkZWEgaG93IGxvbmcgd2UgaGF2ZSB0byB3YWl0IGhlcmUgKi8KCQlyZXR1cm4gMDsKCX0KCgljYXNlIFZUWElPQ1NFVFZJUlQ6Cgl7CgkJLyogVGhlIFNBQTUyNDkgaGFzIHZpcnR1YWwtcm93IHJlY2VwdGlvbiB0dXJuZWQgb24gYWx3YXlzICovCgkJdC0+dmlydHVhbF9tb2RlID0gKGludCkobG9uZylhcmc7CgkJcmV0dXJuIDA7Cgl9Cgl9CglyZXR1cm4gLUVJTlZBTDsKfQoKLyoKICogVHJhbnNsYXRlcyBvbGQgdnR4IElPQ1RMcyB0byBuZXcgb25lcwogKgogKiBUaGlzIGtlZXBzIG5ldyBrZXJuZWwgdmVyc2lvbnMgY29tcGF0aWJsZSB3aXRoIG9sZCB1c2Vyc3BhY2UgcHJvZ3JhbXMuCiAqLwpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB2dHhfZml4X2NvbW1hbmQodW5zaWduZWQgaW50IGNtZCkKewoJc3dpdGNoIChjbWQpIHsKCWNhc2UgVlRYSU9DR0VUSU5GT19PTEQ6CgkJY21kID0gVlRYSU9DR0VUSU5GTzsKCQlicmVhazsKCWNhc2UgVlRYSU9DQ0xSUEFHRV9PTEQ6CgkJY21kID0gVlRYSU9DQ0xSUEFHRTsKCQlicmVhazsKCWNhc2UgVlRYSU9DQ0xSRk9VTkRfT0xEOgoJCWNtZCA9IFZUWElPQ0NMUkZPVU5EOwoJCWJyZWFrOwoJY2FzZSBWVFhJT0NQQUdFUkVRX09MRDoKCQljbWQgPSBWVFhJT0NQQUdFUkVROwoJCWJyZWFrOwoJY2FzZSBWVFhJT0NHRVRTVEFUX09MRDoKCQljbWQgPSBWVFhJT0NHRVRTVEFUOwoJCWJyZWFrOwoJY2FzZSBWVFhJT0NHRVRQQUdFX09MRDoKCQljbWQgPSBWVFhJT0NHRVRQQUdFOwoJCWJyZWFrOwoJY2FzZSBWVFhJT0NTVE9QREFVX09MRDoKCQljbWQgPSBWVFhJT0NTVE9QREFVOwoJCWJyZWFrOwoJY2FzZSBWVFhJT0NQVVRQQUdFX09MRDoKCQljbWQgPSBWVFhJT0NQVVRQQUdFOwoJCWJyZWFrOwoJY2FzZSBWVFhJT0NTRVRESVNQX09MRDoKCQljbWQgPSBWVFhJT0NTRVRESVNQOwoJCWJyZWFrOwoJY2FzZSBWVFhJT0NQVVRTVEFUX09MRDoKCQljbWQgPSBWVFhJT0NQVVRTVEFUOwoJCWJyZWFrOwoJY2FzZSBWVFhJT0NDTFJDQUNIRV9PTEQ6CgkJY21kID0gVlRYSU9DQ0xSQ0FDSEU7CgkJYnJlYWs7CgljYXNlIFZUWElPQ1NFVFZJUlRfT0xEOgoJCWNtZCA9IFZUWElPQ1NFVFZJUlQ7CgkJYnJlYWs7Cgl9CglyZXR1cm4gY21kOwp9CgovKgogKglIYW5kbGUgdGhlIGxvY2tpbmcKICovCgpzdGF0aWMgaW50IHNhYTUyNDlfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCgkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKewoJc3RydWN0IHNhYTUyNDlfZGV2aWNlICp0ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKCWludCBlcnI7CgoJY21kID0gdnR4X2ZpeF9jb21tYW5kKGNtZCk7CgltdXRleF9sb2NrKCZ0LT5sb2NrKTsKCWVyciA9IHZpZGVvX3VzZXJjb3B5KGZpbGUsIGNtZCwgYXJnLCBkb19zYWE1MjQ5X2lvY3RsKTsKCW11dGV4X3VubG9jaygmdC0+bG9jayk7CglyZXR1cm4gZXJyOwp9CgpzdGF0aWMgaW50IHNhYTUyNDlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJc3RydWN0IHNhYTUyNDlfZGV2aWNlICp0ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKCWludCBwZ2J1ZjsKCglpZiAodC0+Y2xpZW50ID09IE5VTEwpCgkJcmV0dXJuIC1FTk9ERVY7CgoJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJnQtPmluX3VzZSkpCgkJcmV0dXJuIC1FQlVTWTsKCglpZiAoaTJjX3NlbmRkYXRhKHQsIDAsIDAsIC0xKSB8fCAvKiBTZWxlY3QgUjExICovCgkJLyogVHVybiBvZmYgcGFyaXR5IGNoZWNrcyAod2UgZG8gdGhpcyBvdXJzZWx2ZXMpICovCgkJaTJjX3NlbmRkYXRhKHQsIDEsIGRpc3BfbW9kZXNbdC0+ZGlzcF9tb2RlXVswXSwgMCwgLTEpIHx8CgkJLyogRGlzcGxheSBUVi1waWN0dXJlLCBubyB2aXJ0dWFsIHJvd3MgKi8KCQlpMmNfc2VuZGRhdGEodCwgNCwgTlVNX0RBVVMsIGRpc3BfbW9kZXNbdC0+ZGlzcF9tb2RlXVsxXSwgZGlzcF9tb2Rlc1t0LT5kaXNwX21vZGVdWzJdLCA3LCAtMSkpCgkJLyogU2V0IGRpc3BsYXkgdG8gcGFnZSA0ICovCgl7CgkJY2xlYXJfYml0KDAsICZ0LT5pbl91c2UpOwoJCXJldHVybiAtRUlPOwoJfQoKCWZvciAocGdidWYgPSAwOyBwZ2J1ZiA8IE5VTV9EQVVTOyBwZ2J1ZisrKSB7CgkJbWVtc2V0KHQtPnZkYXVbcGdidWZdLnBnYnVmLCAnICcsIHNpemVvZih0LT52ZGF1WzBdLnBnYnVmKSk7CgkJbWVtc2V0KHQtPnZkYXVbcGdidWZdLnNyZWdzLCAwLCBzaXplb2YodC0+dmRhdVswXS5zcmVncykpOwoJCW1lbXNldCh0LT52ZGF1W3BnYnVmXS5sYXN0c3RhdCwgMCwgc2l6ZW9mKHQtPnZkYXVbMF0ubGFzdHN0YXQpKTsKCQl0LT52ZGF1W3BnYnVmXS5leHBpcmUgPSAwOwoJCXQtPnZkYXVbcGdidWZdLmNscmZvdW5kID0gdHJ1ZTsKCQl0LT52ZGF1W3BnYnVmXS5zdG9wcGVkID0gdHJ1ZTsKCQl0LT5pc19zZWFyY2hpbmdbcGdidWZdID0gZmFsc2U7Cgl9Cgl0LT52aXJ0dWFsX21vZGUgPSBmYWxzZTsKCXJldHVybiAwOwp9CgoKCnN0YXRpYyBpbnQgc2FhNTI0OV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQp7CglzdHJ1Y3Qgc2FhNTI0OV9kZXZpY2UgKnQgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwoKCWkyY19zZW5kZGF0YSh0LCAxLCAweDIwLCAtMSk7CQkvKiBUdXJuIG9mZiBDQ1QgKi8KCWkyY19zZW5kZGF0YSh0LCA1LCAzLCAzLCAtMSk7CQkvKiBUdXJuIG9mZiBUVi1kaXNwbGF5ICovCgljbGVhcl9iaXQoMCwgJnQtPmluX3VzZSk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc2FhX2ZvcHMgPSB7Cgkub3duZXIJCT0gVEhJU19NT0RVTEUsCgkub3BlbgkJPSBzYWE1MjQ5X29wZW4sCgkucmVsZWFzZSAgICAgICAJPSBzYWE1MjQ5X3JlbGVhc2UsCgkuaW9jdGwgICAgICAgICAgPSBzYWE1MjQ5X2lvY3RsLAojaWZkZWYgQ09ORklHX0NPTVBBVAoJLmNvbXBhdF9pb2N0bAk9IHY0bF9jb21wYXRfaW9jdGwzMiwKI2VuZGlmCgkubGxzZWVrICAgICAgICAgPSBub19sbHNlZWssCn07CgpzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSBzYWFfdGVtcGxhdGUgPQp7CgkubmFtZQkJPSAic2FhNTI0OSIsCgkuZm9wcyAgICAgICAgICAgPSAmc2FhX2ZvcHMsCgkucmVsZWFzZSAJPSB2aWRlb19kZXZpY2VfcmVsZWFzZSwKfTsKCi8qIEFkZHJlc3NlcyB0byBzY2FuICovCnN0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4MjIgPj4gMSwgSTJDX0NMSUVOVF9FTkQgfTsKCkkyQ19DTElFTlRfSU5TTU9EOwoKc3RhdGljIGludCBzYWE1MjQ5X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCgkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKewoJaW50IHBnYnVmOwoJaW50IGVycjsKCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkOwoJc3RydWN0IHNhYTUyNDlfZGV2aWNlICp0OwoKCXY0bF9pbmZvKGNsaWVudCwgImNoaXAgZm91bmQgQCAweCV4ICglcylcbiIsCgkJCWNsaWVudC0+YWRkciA8PCAxLCBjbGllbnQtPmFkYXB0ZXItPm5hbWUpOwoJdjRsX2luZm8oY2xpZW50LCAiVmlkZW9UZXh0IHZlcnNpb24gJWQuJWRcbiIsCgkJCVZUWF9WRVJfTUFKLCBWVFhfVkVSX01JTik7Cgl0ID0ga3phbGxvYyhzaXplb2YoKnQpLCBHRlBfS0VSTkVMKTsKCWlmICh0ID09IE5VTEwpCgkJcmV0dXJuIC1FTk9NRU07CgltdXRleF9pbml0KCZ0LT5sb2NrKTsKCgkvKiBOb3cgY3JlYXRlIGEgdmlkZW80bGludXggZGV2aWNlICovCgl2ZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2aWRlb19kZXZpY2UpLCBHRlBfS0VSTkVMKTsKCWlmICh2ZCA9PSBOVUxMKSB7CgkJa2ZyZWUoY2xpZW50KTsKCQlyZXR1cm4gLUVOT01FTTsKCX0KCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHZkKTsKCW1lbWNweSh2ZCwgJnNhYV90ZW1wbGF0ZSwgc2l6ZW9mKCp2ZCkpOwoKCWZvciAocGdidWYgPSAwOyBwZ2J1ZiA8IE5VTV9EQVVTOyBwZ2J1ZisrKSB7CgkJbWVtc2V0KHQtPnZkYXVbcGdidWZdLnBnYnVmLCAnICcsIHNpemVvZih0LT52ZGF1WzBdLnBnYnVmKSk7CgkJbWVtc2V0KHQtPnZkYXVbcGdidWZdLnNyZWdzLCAwLCBzaXplb2YodC0+dmRhdVswXS5zcmVncykpOwoJCW1lbXNldCh0LT52ZGF1W3BnYnVmXS5sYXN0c3RhdCwgMCwgc2l6ZW9mKHQtPnZkYXVbMF0ubGFzdHN0YXQpKTsKCQl0LT52ZGF1W3BnYnVmXS5leHBpcmUgPSAwOwoJCXQtPnZkYXVbcGdidWZdLmNscmZvdW5kID0gdHJ1ZTsKCQl0LT52ZGF1W3BnYnVmXS5zdG9wcGVkID0gdHJ1ZTsKCQl0LT5pc19zZWFyY2hpbmdbcGdidWZdID0gZmFsc2U7Cgl9Cgl2aWRlb19zZXRfZHJ2ZGF0YSh2ZCwgdCk7CgoJLyogUmVnaXN0ZXIgaXQgKi8KCWVyciA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZSh2ZCwgVkZMX1RZUEVfVlRYLCAtMSk7CglpZiAoZXJyIDwgMCkgewoJCWtmcmVlKHQpOwoJCWtmcmVlKHZkKTsKCQlyZXR1cm4gZXJyOwoJfQoJdC0+Y2xpZW50ID0gY2xpZW50OwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgc2FhNTI0OV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKewoJc3RydWN0IHZpZGVvX2RldmljZSAqdmQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKCgl2aWRlb191bnJlZ2lzdGVyX2RldmljZSh2ZCk7CglrZnJlZSh2aWRlb19nZXRfZHJ2ZGF0YSh2ZCkpOwoJa2ZyZWUodmQpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBzYWE1MjQ5X2lkW10gPSB7Cgl7ICJzYWE1MjQ5IiwgMCB9LAoJeyB9Cn07Ck1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBzYWE1MjQ5X2lkKTsKCnN0YXRpYyBzdHJ1Y3QgdjRsMl9pMmNfZHJpdmVyX2RhdGEgdjRsMl9pMmNfZGF0YSA9IHsKCS5uYW1lID0gInNhYTUyNDkiLAoJLmRyaXZlcmlkID0gSTJDX0RSSVZFUklEX1NBQTUyNDksCgkucHJvYmUgPSBzYWE1MjQ5X3Byb2JlLAoJLnJlbW92ZSA9IHNhYTUyNDlfcmVtb3ZlLAoJLmlkX3RhYmxlID0gc2FhNTI0OV9pZCwKfTsK