LyoKICogQ29weXJpZ2h0IKkgMjAwNiBJbnRlbCBDb3Jwb3JhdGlvbgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAogKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCiAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAogKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAogKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCiAqIFNvZnR3YXJlLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCiAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCiAqIFNPRlRXQVJFLgogKgogKiBBdXRob3JzOgogKiAgICBFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQubmV0PgogKgogKi8KI2luY2x1ZGUgImRybVAuaCIKI2luY2x1ZGUgImRybS5oIgojaW5jbHVkZSAiaTkxNV9kcm0uaCIKI2luY2x1ZGUgImk5MTVfZHJ2LmgiCiNpbmNsdWRlICJpbnRlbF9iaW9zLmgiCgojZGVmaW5lCVNMQVZFX0FERFIxCTB4NzAKI2RlZmluZQlTTEFWRV9BRERSMgkweDcyCgpzdGF0aWMgaW50IHBhbmVsX3R5cGU7CgpzdGF0aWMgdm9pZCAqCmZpbmRfc2VjdGlvbihzdHJ1Y3QgYmRiX2hlYWRlciAqYmRiLCBpbnQgc2VjdGlvbl9pZCkKewoJdTggKmJhc2UgPSAodTggKiliZGI7CglpbnQgaW5kZXggPSAwOwoJdTE2IHRvdGFsLCBjdXJyZW50X3NpemU7Cgl1OCBjdXJyZW50X2lkOwoKCS8qIHNraXAgdG8gZmlyc3Qgc2VjdGlvbiAqLwoJaW5kZXggKz0gYmRiLT5oZWFkZXJfc2l6ZTsKCXRvdGFsID0gYmRiLT5iZGJfc2l6ZTsKCgkvKiB3YWxrIHRoZSBzZWN0aW9ucyBsb29raW5nIGZvciBzZWN0aW9uX2lkICovCgl3aGlsZSAoaW5kZXggPCB0b3RhbCkgewoJCWN1cnJlbnRfaWQgPSAqKGJhc2UgKyBpbmRleCk7CgkJaW5kZXgrKzsKCQljdXJyZW50X3NpemUgPSAqKCh1MTYgKikoYmFzZSArIGluZGV4KSk7CgkJaW5kZXggKz0gMjsKCQlpZiAoY3VycmVudF9pZCA9PSBzZWN0aW9uX2lkKQoJCQlyZXR1cm4gYmFzZSArIGluZGV4OwoJCWluZGV4ICs9IGN1cnJlbnRfc2l6ZTsKCX0KCglyZXR1cm4gTlVMTDsKfQoKc3RhdGljIHUxNgpnZXRfYmxvY2tzaXplKHZvaWQgKnApCnsKCXUxNiAqYmxvY2tfcHRyLCBibG9ja19zaXplOwoKCWJsb2NrX3B0ciA9ICh1MTYgKikoKGNoYXIgKilwIC0gMik7CglibG9ja19zaXplID0gKmJsb2NrX3B0cjsKCXJldHVybiBibG9ja19zaXplOwp9CgpzdGF0aWMgdm9pZApmaWxsX2RldGFpbF90aW1pbmdfZGF0YShzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqcGFuZWxfZml4ZWRfbW9kZSwKCQkJc3RydWN0IGx2ZHNfZHZvX3RpbWluZyAqZHZvX3RpbWluZykKewoJcGFuZWxfZml4ZWRfbW9kZS0+aGRpc3BsYXkgPSAoZHZvX3RpbWluZy0+aGFjdGl2ZV9oaSA8PCA4KSB8CgkJZHZvX3RpbWluZy0+aGFjdGl2ZV9sbzsKCXBhbmVsX2ZpeGVkX21vZGUtPmhzeW5jX3N0YXJ0ID0gcGFuZWxfZml4ZWRfbW9kZS0+aGRpc3BsYXkgKwoJCSgoZHZvX3RpbWluZy0+aHN5bmNfb2ZmX2hpIDw8IDgpIHwgZHZvX3RpbWluZy0+aHN5bmNfb2ZmX2xvKTsKCXBhbmVsX2ZpeGVkX21vZGUtPmhzeW5jX2VuZCA9IHBhbmVsX2ZpeGVkX21vZGUtPmhzeW5jX3N0YXJ0ICsKCQlkdm9fdGltaW5nLT5oc3luY19wdWxzZV93aWR0aDsKCXBhbmVsX2ZpeGVkX21vZGUtPmh0b3RhbCA9IHBhbmVsX2ZpeGVkX21vZGUtPmhkaXNwbGF5ICsKCQkoKGR2b190aW1pbmctPmhibGFua19oaSA8PCA4KSB8IGR2b190aW1pbmctPmhibGFua19sbyk7CgoJcGFuZWxfZml4ZWRfbW9kZS0+dmRpc3BsYXkgPSAoZHZvX3RpbWluZy0+dmFjdGl2ZV9oaSA8PCA4KSB8CgkJZHZvX3RpbWluZy0+dmFjdGl2ZV9sbzsKCXBhbmVsX2ZpeGVkX21vZGUtPnZzeW5jX3N0YXJ0ID0gcGFuZWxfZml4ZWRfbW9kZS0+dmRpc3BsYXkgKwoJCWR2b190aW1pbmctPnZzeW5jX29mZjsKCXBhbmVsX2ZpeGVkX21vZGUtPnZzeW5jX2VuZCA9IHBhbmVsX2ZpeGVkX21vZGUtPnZzeW5jX3N0YXJ0ICsKCQlkdm9fdGltaW5nLT52c3luY19wdWxzZV93aWR0aDsKCXBhbmVsX2ZpeGVkX21vZGUtPnZ0b3RhbCA9IHBhbmVsX2ZpeGVkX21vZGUtPnZkaXNwbGF5ICsKCQkoKGR2b190aW1pbmctPnZibGFua19oaSA8PCA4KSB8IGR2b190aW1pbmctPnZibGFua19sbyk7CglwYW5lbF9maXhlZF9tb2RlLT5jbG9jayA9IGR2b190aW1pbmctPmNsb2NrICogMTA7CglwYW5lbF9maXhlZF9tb2RlLT50eXBlID0gRFJNX01PREVfVFlQRV9QUkVGRVJSRUQ7CgoJLyogU29tZSBWQlRzIGhhdmUgYm9ndXMgaC92dG90YWwgdmFsdWVzICovCglpZiAocGFuZWxfZml4ZWRfbW9kZS0+aHN5bmNfZW5kID4gcGFuZWxfZml4ZWRfbW9kZS0+aHRvdGFsKQoJCXBhbmVsX2ZpeGVkX21vZGUtPmh0b3RhbCA9IHBhbmVsX2ZpeGVkX21vZGUtPmhzeW5jX2VuZCArIDE7CglpZiAocGFuZWxfZml4ZWRfbW9kZS0+dnN5bmNfZW5kID4gcGFuZWxfZml4ZWRfbW9kZS0+dnRvdGFsKQoJCXBhbmVsX2ZpeGVkX21vZGUtPnZ0b3RhbCA9IHBhbmVsX2ZpeGVkX21vZGUtPnZzeW5jX2VuZCArIDE7CgoJZHJtX21vZGVfc2V0X25hbWUocGFuZWxfZml4ZWRfbW9kZSk7Cn0KCi8qIFRyeSB0byBmaW5kIGludGVncmF0ZWQgcGFuZWwgZGF0YSAqLwpzdGF0aWMgdm9pZApwYXJzZV9sZnBfcGFuZWxfZGF0YShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCgkJCSAgICBzdHJ1Y3QgYmRiX2hlYWRlciAqYmRiKQp7CglzdHJ1Y3QgYmRiX2x2ZHNfb3B0aW9ucyAqbHZkc19vcHRpb25zOwoJc3RydWN0IGJkYl9sdmRzX2xmcF9kYXRhICpsdmRzX2xmcF9kYXRhOwoJc3RydWN0IGJkYl9sdmRzX2xmcF9kYXRhX3B0cnMgKmx2ZHNfbGZwX2RhdGFfcHRyczsKCXN0cnVjdCBiZGJfbHZkc19sZnBfZGF0YV9lbnRyeSAqZW50cnk7CglzdHJ1Y3QgbHZkc19kdm9fdGltaW5nICpkdm9fdGltaW5nOwoJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKnBhbmVsX2ZpeGVkX21vZGU7CglpbnQgbGZwX2RhdGFfc2l6ZSwgZHZvX3RpbWluZ19vZmZzZXQ7CglpbnQgaSwgdGVtcF9kb3duY2xvY2s7CglzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqdGVtcF9tb2RlOwoKCS8qIERlZmF1bHRzIGlmIHdlIGNhbid0IGZpbmQgVkJUIGluZm8gKi8KCWRldl9wcml2LT5sdmRzX2RpdGhlciA9IDA7CglkZXZfcHJpdi0+bHZkc192YnQgPSAwOwoKCWx2ZHNfb3B0aW9ucyA9IGZpbmRfc2VjdGlvbihiZGIsIEJEQl9MVkRTX09QVElPTlMpOwoJaWYgKCFsdmRzX29wdGlvbnMpCgkJcmV0dXJuOwoKCWRldl9wcml2LT5sdmRzX2RpdGhlciA9IGx2ZHNfb3B0aW9ucy0+cGl4ZWxfZGl0aGVyOwoJaWYgKGx2ZHNfb3B0aW9ucy0+cGFuZWxfdHlwZSA9PSAweGZmKQoJCXJldHVybjsKCXBhbmVsX3R5cGUgPSBsdmRzX29wdGlvbnMtPnBhbmVsX3R5cGU7CgoJbHZkc19sZnBfZGF0YSA9IGZpbmRfc2VjdGlvbihiZGIsIEJEQl9MVkRTX0xGUF9EQVRBKTsKCWlmICghbHZkc19sZnBfZGF0YSkKCQlyZXR1cm47CgoJbHZkc19sZnBfZGF0YV9wdHJzID0gZmluZF9zZWN0aW9uKGJkYiwgQkRCX0xWRFNfTEZQX0RBVEFfUFRSUyk7CglpZiAoIWx2ZHNfbGZwX2RhdGFfcHRycykKCQlyZXR1cm47CgoJZGV2X3ByaXYtPmx2ZHNfdmJ0ID0gMTsKCglsZnBfZGF0YV9zaXplID0gbHZkc19sZnBfZGF0YV9wdHJzLT5wdHJbMV0uZHZvX3RpbWluZ19vZmZzZXQgLQoJCWx2ZHNfbGZwX2RhdGFfcHRycy0+cHRyWzBdLmR2b190aW1pbmdfb2Zmc2V0OwoJZW50cnkgPSAoc3RydWN0IGJkYl9sdmRzX2xmcF9kYXRhX2VudHJ5ICopCgkJKCh1aW50OF90ICopbHZkc19sZnBfZGF0YS0+ZGF0YSArIChsZnBfZGF0YV9zaXplICoKCQkJCQkJICAgbHZkc19vcHRpb25zLT5wYW5lbF90eXBlKSk7Cglkdm9fdGltaW5nX29mZnNldCA9IGx2ZHNfbGZwX2RhdGFfcHRycy0+cHRyWzBdLmR2b190aW1pbmdfb2Zmc2V0IC0KCQlsdmRzX2xmcF9kYXRhX3B0cnMtPnB0clswXS5mcF90aW1pbmdfb2Zmc2V0OwoKCS8qCgkgKiB0aGUgc2l6ZSBvZiBmcF90aW1pbmcgdmFyaWVzIG9uIHRoZSBkaWZmZXJlbnQgcGxhdGZvcm0uCgkgKiBTbyBjYWxjdWxhdGUgdGhlIERWTyB0aW1pbmcgcmVsYXRpdmUgb2Zmc2V0IGluIExWRFMgZGF0YQoJICogZW50cnkgdG8gZ2V0IHRoZSBEVk8gdGltaW5nIGVudHJ5CgkgKi8KCWR2b190aW1pbmcgPSAoc3RydWN0IGx2ZHNfZHZvX3RpbWluZyAqKQoJCQkoKHVuc2lnbmVkIGNoYXIgKillbnRyeSArIGR2b190aW1pbmdfb2Zmc2V0KTsKCglwYW5lbF9maXhlZF9tb2RlID0ga3phbGxvYyhzaXplb2YoKnBhbmVsX2ZpeGVkX21vZGUpLCBHRlBfS0VSTkVMKTsKCglmaWxsX2RldGFpbF90aW1pbmdfZGF0YShwYW5lbF9maXhlZF9tb2RlLCBkdm9fdGltaW5nKTsKCglkZXZfcHJpdi0+bGZwX2x2ZHNfdmJ0X21vZGUgPSBwYW5lbF9maXhlZF9tb2RlOwoKCURSTV9ERUJVR19LTVMoIkZvdW5kIHBhbmVsIG1vZGUgaW4gQklPUyBWQlQgdGFibGVzOlxuIik7Cglkcm1fbW9kZV9kZWJ1Z19wcmludG1vZGVsaW5lKHBhbmVsX2ZpeGVkX21vZGUpOwoKCXRlbXBfbW9kZSA9IGt6YWxsb2Moc2l6ZW9mKCp0ZW1wX21vZGUpLCBHRlBfS0VSTkVMKTsKCXRlbXBfZG93bmNsb2NrID0gcGFuZWxfZml4ZWRfbW9kZS0+Y2xvY2s7CgkvKgoJICogZW51bWVyYXRlIHRoZSBMVkRTIHBhbmVsIHRpbWluZyBpbmZvIGVudHJ5IGluIFZCVCB0byBjaGVjayB3aGV0aGVyCgkgKiB0aGUgTFZEUyBkb3duY2xvY2sgaXMgZm91bmQuCgkgKi8KCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CgkJZW50cnkgPSAoc3RydWN0IGJkYl9sdmRzX2xmcF9kYXRhX2VudHJ5ICopCgkJCSgodWludDhfdCAqKWx2ZHNfbGZwX2RhdGEtPmRhdGEgKyAobGZwX2RhdGFfc2l6ZSAqIGkpKTsKCQlkdm9fdGltaW5nID0gKHN0cnVjdCBsdmRzX2R2b190aW1pbmcgKikKCQkJKCh1bnNpZ25lZCBjaGFyICopZW50cnkgKyBkdm9fdGltaW5nX29mZnNldCk7CgoJCWZpbGxfZGV0YWlsX3RpbWluZ19kYXRhKHRlbXBfbW9kZSwgZHZvX3RpbWluZyk7CgoJCWlmICh0ZW1wX21vZGUtPmhkaXNwbGF5ID09IHBhbmVsX2ZpeGVkX21vZGUtPmhkaXNwbGF5ICYmCgkJdGVtcF9tb2RlLT5oc3luY19zdGFydCA9PSBwYW5lbF9maXhlZF9tb2RlLT5oc3luY19zdGFydCAmJgoJCXRlbXBfbW9kZS0+aHN5bmNfZW5kID09IHBhbmVsX2ZpeGVkX21vZGUtPmhzeW5jX2VuZCAmJgoJCXRlbXBfbW9kZS0+aHRvdGFsID09IHBhbmVsX2ZpeGVkX21vZGUtPmh0b3RhbCAmJgoJCXRlbXBfbW9kZS0+dmRpc3BsYXkgPT0gcGFuZWxfZml4ZWRfbW9kZS0+dmRpc3BsYXkgJiYKCQl0ZW1wX21vZGUtPnZzeW5jX3N0YXJ0ID09IHBhbmVsX2ZpeGVkX21vZGUtPnZzeW5jX3N0YXJ0ICYmCgkJdGVtcF9tb2RlLT52c3luY19lbmQgPT0gcGFuZWxfZml4ZWRfbW9kZS0+dnN5bmNfZW5kICYmCgkJdGVtcF9tb2RlLT52dG90YWwgPT0gcGFuZWxfZml4ZWRfbW9kZS0+dnRvdGFsICYmCgkJdGVtcF9tb2RlLT5jbG9jayA8IHRlbXBfZG93bmNsb2NrKSB7CgkJCS8qCgkJCSAqIGRvd25jbG9jayBpcyBhbHJlYWR5IGZvdW5kLiBCdXQgd2UgZXhwZWN0CgkJCSAqIHRvIGZpbmQgdGhlIGxvd2VyIGRvd25jbG9jay4KCQkJICovCgkJCXRlbXBfZG93bmNsb2NrID0gdGVtcF9tb2RlLT5jbG9jazsKCQl9CgkJLyogY2xlYXIgaXQgdG8gemVybyAqLwoJCW1lbXNldCh0ZW1wX21vZGUsIDAsIHNpemVvZigqdGVtcF9tb2RlKSk7Cgl9CglrZnJlZSh0ZW1wX21vZGUpOwoJaWYgKHRlbXBfZG93bmNsb2NrIDwgcGFuZWxfZml4ZWRfbW9kZS0+Y2xvY2sgJiYKCSAgICBpOTE1X2x2ZHNfZG93bmNsb2NrKSB7CgkJZGV2X3ByaXYtPmx2ZHNfZG93bmNsb2NrX2F2YWlsID0gMTsKCQlkZXZfcHJpdi0+bHZkc19kb3duY2xvY2sgPSB0ZW1wX2Rvd25jbG9jazsKCQlEUk1fREVCVUdfS01TKCJMVkRTIGRvd25jbG9jayBpcyBmb3VuZCBpbiBWQlQuICIsCgkJCQkiTm9ybWFsIENsb2NrICVkS0h6LCBkb3duY2xvY2sgJWRLSHpcbiIsCgkJCQl0ZW1wX2Rvd25jbG9jaywgcGFuZWxfZml4ZWRfbW9kZS0+Y2xvY2spOwoJfQoJcmV0dXJuOwp9CgovKiBUcnkgdG8gZmluZCBzZHZvIHBhbmVsIGRhdGEgKi8Kc3RhdGljIHZvaWQKcGFyc2Vfc2R2b19wYW5lbF9kYXRhKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKCQkgICAgICBzdHJ1Y3QgYmRiX2hlYWRlciAqYmRiKQp7CglzdHJ1Y3QgYmRiX3Nkdm9fbHZkc19vcHRpb25zICpzZHZvX2x2ZHNfb3B0aW9uczsKCXN0cnVjdCBsdmRzX2R2b190aW1pbmcgKmR2b190aW1pbmc7CglzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqcGFuZWxfZml4ZWRfbW9kZTsKCglkZXZfcHJpdi0+c2R2b19sdmRzX3ZidF9tb2RlID0gTlVMTDsKCglzZHZvX2x2ZHNfb3B0aW9ucyA9IGZpbmRfc2VjdGlvbihiZGIsIEJEQl9TRFZPX0xWRFNfT1BUSU9OUyk7CglpZiAoIXNkdm9fbHZkc19vcHRpb25zKQoJCXJldHVybjsKCglkdm9fdGltaW5nID0gZmluZF9zZWN0aW9uKGJkYiwgQkRCX1NEVk9fUEFORUxfRFREUyk7CglpZiAoIWR2b190aW1pbmcpCgkJcmV0dXJuOwoKCXBhbmVsX2ZpeGVkX21vZGUgPSBremFsbG9jKHNpemVvZigqcGFuZWxfZml4ZWRfbW9kZSksIEdGUF9LRVJORUwpOwoKCWlmICghcGFuZWxfZml4ZWRfbW9kZSkKCQlyZXR1cm47CgoJZmlsbF9kZXRhaWxfdGltaW5nX2RhdGEocGFuZWxfZml4ZWRfbW9kZSwKCQkJZHZvX3RpbWluZyArIHNkdm9fbHZkc19vcHRpb25zLT5wYW5lbF90eXBlKTsKCglkZXZfcHJpdi0+c2R2b19sdmRzX3ZidF9tb2RlID0gcGFuZWxfZml4ZWRfbW9kZTsKCglyZXR1cm47Cn0KCnN0YXRpYyB2b2lkCnBhcnNlX2dlbmVyYWxfZmVhdHVyZXMoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAoJCSAgICAgICBzdHJ1Y3QgYmRiX2hlYWRlciAqYmRiKQp7CglzdHJ1Y3QgYmRiX2dlbmVyYWxfZmVhdHVyZXMgKmdlbmVyYWw7CgoJLyogU2V0IHNlbnNpYmxlIGRlZmF1bHRzIGluIGNhc2Ugd2UgY2FuJ3QgZmluZCB0aGUgZ2VuZXJhbCBibG9jayAqLwoJZGV2X3ByaXYtPmludF90dl9zdXBwb3J0ID0gMTsKCWRldl9wcml2LT5pbnRfY3J0X3N1cHBvcnQgPSAxOwoKCWdlbmVyYWwgPSBmaW5kX3NlY3Rpb24oYmRiLCBCREJfR0VORVJBTF9GRUFUVVJFUyk7CglpZiAoZ2VuZXJhbCkgewoJCWRldl9wcml2LT5pbnRfdHZfc3VwcG9ydCA9IGdlbmVyYWwtPmludF90dl9zdXBwb3J0OwoJCWRldl9wcml2LT5pbnRfY3J0X3N1cHBvcnQgPSBnZW5lcmFsLT5pbnRfY3J0X3N1cHBvcnQ7CgkJZGV2X3ByaXYtPmx2ZHNfdXNlX3NzYyA9IGdlbmVyYWwtPmVuYWJsZV9zc2M7CgoJCWlmIChkZXZfcHJpdi0+bHZkc191c2Vfc3NjKSB7CgkJCWlmIChJU19JODVYKGRldl9wcml2LT5kZXYpKQoJCQkJZGV2X3ByaXYtPmx2ZHNfc3NjX2ZyZXEgPQoJCQkJCWdlbmVyYWwtPnNzY19mcmVxID8gNjYgOiA0ODsKCQkJZWxzZSBpZiAoSVNfSVJPTkxBS0UoZGV2X3ByaXYtPmRldikpCgkJCQlkZXZfcHJpdi0+bHZkc19zc2NfZnJlcSA9CgkJCQkJZ2VuZXJhbC0+c3NjX2ZyZXEgPyAxMDAgOiAxMjA7CgkJCWVsc2UKCQkJCWRldl9wcml2LT5sdmRzX3NzY19mcmVxID0KCQkJCQlnZW5lcmFsLT5zc2NfZnJlcSA/IDEwMCA6IDk2OwoJCX0KCX0KfQoKc3RhdGljIHZvaWQKcGFyc2VfZ2VuZXJhbF9kZWZpbml0aW9ucyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCgkJCSAgc3RydWN0IGJkYl9oZWFkZXIgKmJkYikKewoJc3RydWN0IGJkYl9nZW5lcmFsX2RlZmluaXRpb25zICpnZW5lcmFsOwoJY29uc3QgaW50IGNydF9idXNfbWFwX3RhYmxlW10gPSB7CgkJR1BJT0IsCgkJR1BJT0EsCgkJR1BJT0MsCgkJR1BJT0QsCgkJR1BJT0UsCgkJR1BJT0YsCgl9OwoKCWdlbmVyYWwgPSBmaW5kX3NlY3Rpb24oYmRiLCBCREJfR0VORVJBTF9ERUZJTklUSU9OUyk7CglpZiAoZ2VuZXJhbCkgewoJCXUxNiBibG9ja19zaXplID0gZ2V0X2Jsb2Nrc2l6ZShnZW5lcmFsKTsKCQlpZiAoYmxvY2tfc2l6ZSA+PSBzaXplb2YoKmdlbmVyYWwpKSB7CgkJCWludCBidXNfcGluID0gZ2VuZXJhbC0+Y3J0X2RkY19nbWJ1c19waW47CgkJCURSTV9ERUJVR19LTVMoImNydF9kZGNfYnVzX3BpbjogJWRcbiIsIGJ1c19waW4pOwoJCQlpZiAoKGJ1c19waW4gPj0gMSkgJiYgKGJ1c19waW4gPD0gNikpIHsKCQkJCWRldl9wcml2LT5jcnRfZGRjX2J1cyA9CgkJCQkJY3J0X2J1c19tYXBfdGFibGVbYnVzX3Bpbi0xXTsKCQkJfQoJCX0gZWxzZSB7CgkJCURSTV9ERUJVR19LTVMoIkJEQl9HRCB0b28gc21hbGwgKCVkKS4gSW52YWxpZC5cbiIsCgkJCQkgIGJsb2NrX3NpemUpOwoJCX0KCX0KfQoKc3RhdGljIHZvaWQKcGFyc2Vfc2R2b19kZXZpY2VfbWFwcGluZyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCgkJICAgICAgIHN0cnVjdCBiZGJfaGVhZGVyICpiZGIpCnsKCXN0cnVjdCBzZHZvX2RldmljZV9tYXBwaW5nICpwX21hcHBpbmc7CglzdHJ1Y3QgYmRiX2dlbmVyYWxfZGVmaW5pdGlvbnMgKnBfZGVmczsKCXN0cnVjdCBjaGlsZF9kZXZpY2VfY29uZmlnICpwX2NoaWxkOwoJaW50IGksIGNoaWxkX2RldmljZV9udW0sIGNvdW50OwoJdTE2CWJsb2NrX3NpemU7CgoJcF9kZWZzID0gZmluZF9zZWN0aW9uKGJkYiwgQkRCX0dFTkVSQUxfREVGSU5JVElPTlMpOwoJaWYgKCFwX2RlZnMpIHsKCQlEUk1fREVCVUdfS01TKCJObyBnZW5lcmFsIGRlZmluaXRpb24gYmxvY2sgaXMgZm91bmRcbiIpOwoJCXJldHVybjsKCX0KCS8qIGp1ZGdlIHdoZXRoZXIgdGhlIHNpemUgb2YgY2hpbGQgZGV2aWNlIG1lZXRzIHRoZSByZXF1aXJlbWVudHMuCgkgKiBJZiB0aGUgY2hpbGQgZGV2aWNlIHNpemUgb2J0YWluZWQgZnJvbSBnZW5lcmFsIGRlZmluaXRpb24gYmxvY2sKCSAqIGlzIGRpZmZlcmVudCB3aXRoIHNpemVvZihzdHJ1Y3QgY2hpbGRfZGV2aWNlX2NvbmZpZyksIHNraXAgdGhlCgkgKiBwYXJzaW5nIG9mIHNkdm8gZGV2aWNlIGluZm8KCSAqLwoJaWYgKHBfZGVmcy0+Y2hpbGRfZGV2X3NpemUgIT0gc2l6ZW9mKCpwX2NoaWxkKSkgewoJCS8qIGRpZmZlcmVudCBjaGlsZCBkZXYgc2l6ZSAuIElnbm9yZSBpdCAqLwoJCURSTV9ERUJVR19LTVMoImRpZmZlcmVudCBjaGlsZCBzaXplIGlzIGZvdW5kLiBJbnZhbGlkLlxuIik7CgkJcmV0dXJuOwoJfQoJLyogZ2V0IHRoZSBibG9jayBzaXplIG9mIGdlbmVyYWwgZGVmaW5pdGlvbnMgKi8KCWJsb2NrX3NpemUgPSBnZXRfYmxvY2tzaXplKHBfZGVmcyk7CgkvKiBnZXQgdGhlIG51bWJlciBvZiBjaGlsZCBkZXZpY2UgKi8KCWNoaWxkX2RldmljZV9udW0gPSAoYmxvY2tfc2l6ZSAtIHNpemVvZigqcF9kZWZzKSkgLwoJCQkJc2l6ZW9mKCpwX2NoaWxkKTsKCWNvdW50ID0gMDsKCWZvciAoaSA9IDA7IGkgPCBjaGlsZF9kZXZpY2VfbnVtOyBpKyspIHsKCQlwX2NoaWxkID0gJihwX2RlZnMtPmRldmljZXNbaV0pOwoJCWlmICghcF9jaGlsZC0+ZGV2aWNlX3R5cGUpIHsKCQkJLyogc2tpcCB0aGUgZGV2aWNlIGJsb2NrIGlmIGRldmljZSB0eXBlIGlzIGludmFsaWQgKi8KCQkJY29udGludWU7CgkJfQoJCWlmIChwX2NoaWxkLT5zbGF2ZV9hZGRyICE9IFNMQVZFX0FERFIxICYmCgkJCXBfY2hpbGQtPnNsYXZlX2FkZHIgIT0gU0xBVkVfQUREUjIpIHsKCQkJLyoKCQkJICogSWYgdGhlIHNsYXZlIGFkZHJlc3MgaXMgbmVpdGhlciAweDcwIG5vciAweDcyLAoJCQkgKiBpdCBpcyBub3QgYSBTRFZPIGRldmljZS4gU2tpcCBpdC4KCQkJICovCgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAocF9jaGlsZC0+ZHZvX3BvcnQgIT0gREVWSUNFX1BPUlRfRFZPQiAmJgoJCQlwX2NoaWxkLT5kdm9fcG9ydCAhPSBERVZJQ0VfUE9SVF9EVk9DKSB7CgkJCS8qIHNraXAgdGhlIGluY29ycmVjdCBTRFZPIHBvcnQgKi8KCQkJRFJNX0RFQlVHX0tNUygiSW5jb3JyZWN0IFNEVk8gcG9ydC4gU2tpcCBpdCBcbiIpOwoJCQljb250aW51ZTsKCQl9CgkJRFJNX0RFQlVHX0tNUygidGhlIFNEVk8gZGV2aWNlIHdpdGggc2xhdmUgYWRkciAlMnggaXMgZm91bmQgb24iCgkJCQkiICVzIHBvcnRcbiIsCgkJCQlwX2NoaWxkLT5zbGF2ZV9hZGRyLAoJCQkJKHBfY2hpbGQtPmR2b19wb3J0ID09IERFVklDRV9QT1JUX0RWT0IpID8KCQkJCQkiU0RWT0IiIDogIlNEVk9DIik7CgkJcF9tYXBwaW5nID0gJihkZXZfcHJpdi0+c2R2b19tYXBwaW5nc1twX2NoaWxkLT5kdm9fcG9ydCAtIDFdKTsKCQlpZiAoIXBfbWFwcGluZy0+aW5pdGlhbGl6ZWQpIHsKCQkJcF9tYXBwaW5nLT5kdm9fcG9ydCA9IHBfY2hpbGQtPmR2b19wb3J0OwoJCQlwX21hcHBpbmctPnNsYXZlX2FkZHIgPSBwX2NoaWxkLT5zbGF2ZV9hZGRyOwoJCQlwX21hcHBpbmctPmR2b193aXJpbmcgPSBwX2NoaWxkLT5kdm9fd2lyaW5nOwoJCQlwX21hcHBpbmctPmluaXRpYWxpemVkID0gMTsKCQl9IGVsc2UgewoJCQlEUk1fREVCVUdfS01TKCJNYXliZSBvbmUgU0RWTyBwb3J0IGlzIHNoYXJlZCBieSAiCgkJCQkJICJ0d28gU0RWTyBkZXZpY2UuXG4iKTsKCQl9CgkJaWYgKHBfY2hpbGQtPnNsYXZlMl9hZGRyKSB7CgkJCS8qIE1heWJlIHRoaXMgaXMgYSBTRFZPIGRldmljZSB3aXRoIG11bHRpcGxlIGlucHV0cyAqLwoJCQkvKiBBbmQgdGhlIG1hcHBpbmcgaW5mbyBpcyBub3QgYWRkZWQgKi8KCQkJRFJNX0RFQlVHX0tNUygidGhlcmUgZXhpc3RzIHRoZSBzbGF2ZTJfYWRkci4gTWF5YmUgdGhpcyIKCQkJCSIgaXMgYSBTRFZPIGRldmljZSB3aXRoIG11bHRpcGxlIGlucHV0cy5cbiIpOwoJCX0KCQljb3VudCsrOwoJfQoKCWlmICghY291bnQpIHsKCQkvKiBObyBTRFZPIGRldmljZSBpbmZvIGlzIGZvdW5kICovCgkJRFJNX0RFQlVHX0tNUygiTm8gU0RWTyBkZXZpY2UgaW5mbyBpcyBmb3VuZCBpbiBWQlRcbiIpOwoJfQoJcmV0dXJuOwp9CgpzdGF0aWMgdm9pZApwYXJzZV9kcml2ZXJfZmVhdHVyZXMoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAoJCSAgICAgICBzdHJ1Y3QgYmRiX2hlYWRlciAqYmRiKQp7CglzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZGV2X3ByaXYtPmRldjsKCXN0cnVjdCBiZGJfZHJpdmVyX2ZlYXR1cmVzICpkcml2ZXI7CgoJZHJpdmVyID0gZmluZF9zZWN0aW9uKGJkYiwgQkRCX0RSSVZFUl9GRUFUVVJFUyk7CglpZiAoIWRyaXZlcikKCQlyZXR1cm47CgoJaWYgKGRyaXZlciAmJiBTVVBQT1JUU19FRFAoZGV2KSAmJgoJICAgIGRyaXZlci0+bHZkc19jb25maWcgPT0gQkRCX0RSSVZFUl9GRUFUVVJFX0VEUCkgewoJCWRldl9wcml2LT5lZHBfc3VwcG9ydCA9IDE7Cgl9IGVsc2UgewoJCWRldl9wcml2LT5lZHBfc3VwcG9ydCA9IDA7Cgl9CgoJaWYgKGRyaXZlciAmJiBkcml2ZXItPmR1YWxfZnJlcXVlbmN5KQoJCWRldl9wcml2LT5yZW5kZXJfcmVjbG9ja19hdmFpbCA9IHRydWU7Cn0KCnN0YXRpYyB2b2lkCnBhcnNlX2VkcChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIHN0cnVjdCBiZGJfaGVhZGVyICpiZGIpCnsKCXN0cnVjdCBiZGJfZWRwICplZHA7CgoJZWRwID0gZmluZF9zZWN0aW9uKGJkYiwgQkRCX0VEUCk7CglpZiAoIWVkcCkgewoJCWlmIChTVVBQT1JUU19FRFAoZGV2X3ByaXYtPmRldikgJiYgZGV2X3ByaXYtPmVkcF9zdXBwb3J0KSB7CgkJCURSTV9ERUJVR19LTVMoIk5vIGVEUCBCREIgZm91bmQgYnV0IGVEUCBwYW5lbCBzdXBwb3J0ZWQsXAoJCQkJICAgICAgIGFzc3VtZSAxOGJwcCBwYW5lbCBjb2xvciBkZXB0aC5cbiIpOwoJCQlkZXZfcHJpdi0+ZWRwX2JwcCA9IDE4OwoJCX0KCQlyZXR1cm47Cgl9CgoJc3dpdGNoICgoZWRwLT5jb2xvcl9kZXB0aCA+PiAocGFuZWxfdHlwZSAqIDIpKSAmIDMpIHsKCWNhc2UgRURQXzE4QlBQOgoJCWRldl9wcml2LT5lZHBfYnBwID0gMTg7CgkJYnJlYWs7CgljYXNlIEVEUF8yNEJQUDoKCQlkZXZfcHJpdi0+ZWRwX2JwcCA9IDI0OwoJCWJyZWFrOwoJY2FzZSBFRFBfMzBCUFA6CgkJZGV2X3ByaXYtPmVkcF9icHAgPSAzMDsKCQlicmVhazsKCX0KfQoKc3RhdGljIHZvaWQKcGFyc2VfZGV2aWNlX21hcHBpbmcoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAoJCSAgICAgICBzdHJ1Y3QgYmRiX2hlYWRlciAqYmRiKQp7CglzdHJ1Y3QgYmRiX2dlbmVyYWxfZGVmaW5pdGlvbnMgKnBfZGVmczsKCXN0cnVjdCBjaGlsZF9kZXZpY2VfY29uZmlnICpwX2NoaWxkLCAqY2hpbGRfZGV2X3B0cjsKCWludCBpLCBjaGlsZF9kZXZpY2VfbnVtLCBjb3VudDsKCXUxNglibG9ja19zaXplOwoKCXBfZGVmcyA9IGZpbmRfc2VjdGlvbihiZGIsIEJEQl9HRU5FUkFMX0RFRklOSVRJT05TKTsKCWlmICghcF9kZWZzKSB7CgkJRFJNX0RFQlVHX0tNUygiTm8gZ2VuZXJhbCBkZWZpbml0aW9uIGJsb2NrIGlzIGZvdW5kXG4iKTsKCQlyZXR1cm47Cgl9CgkvKiBqdWRnZSB3aGV0aGVyIHRoZSBzaXplIG9mIGNoaWxkIGRldmljZSBtZWV0cyB0aGUgcmVxdWlyZW1lbnRzLgoJICogSWYgdGhlIGNoaWxkIGRldmljZSBzaXplIG9idGFpbmVkIGZyb20gZ2VuZXJhbCBkZWZpbml0aW9uIGJsb2NrCgkgKiBpcyBkaWZmZXJlbnQgd2l0aCBzaXplb2Yoc3RydWN0IGNoaWxkX2RldmljZV9jb25maWcpLCBza2lwIHRoZQoJICogcGFyc2luZyBvZiBzZHZvIGRldmljZSBpbmZvCgkgKi8KCWlmIChwX2RlZnMtPmNoaWxkX2Rldl9zaXplICE9IHNpemVvZigqcF9jaGlsZCkpIHsKCQkvKiBkaWZmZXJlbnQgY2hpbGQgZGV2IHNpemUgLiBJZ25vcmUgaXQgKi8KCQlEUk1fREVCVUdfS01TKCJkaWZmZXJlbnQgY2hpbGQgc2l6ZSBpcyBmb3VuZC4gSW52YWxpZC5cbiIpOwoJCXJldHVybjsKCX0KCS8qIGdldCB0aGUgYmxvY2sgc2l6ZSBvZiBnZW5lcmFsIGRlZmluaXRpb25zICovCglibG9ja19zaXplID0gZ2V0X2Jsb2Nrc2l6ZShwX2RlZnMpOwoJLyogZ2V0IHRoZSBudW1iZXIgb2YgY2hpbGQgZGV2aWNlICovCgljaGlsZF9kZXZpY2VfbnVtID0gKGJsb2NrX3NpemUgLSBzaXplb2YoKnBfZGVmcykpIC8KCQkJCXNpemVvZigqcF9jaGlsZCk7Cgljb3VudCA9IDA7CgkvKiBnZXQgdGhlIG51bWJlciBvZiBjaGlsZCBkZXZpY2UgdGhhdCBpcyBwcmVzZW50ICovCglmb3IgKGkgPSAwOyBpIDwgY2hpbGRfZGV2aWNlX251bTsgaSsrKSB7CgkJcF9jaGlsZCA9ICYocF9kZWZzLT5kZXZpY2VzW2ldKTsKCQlpZiAoIXBfY2hpbGQtPmRldmljZV90eXBlKSB7CgkJCS8qIHNraXAgdGhlIGRldmljZSBibG9jayBpZiBkZXZpY2UgdHlwZSBpcyBpbnZhbGlkICovCgkJCWNvbnRpbnVlOwoJCX0KCQljb3VudCsrOwoJfQoJaWYgKCFjb3VudCkgewoJCURSTV9ERUJVR19LTVMoIm5vIGNoaWxkIGRldiBpcyBwYXJzZWQgZnJvbSBWQlQgXG4iKTsKCQlyZXR1cm47Cgl9CglkZXZfcHJpdi0+Y2hpbGRfZGV2ID0ga3phbGxvYyhzaXplb2YoKnBfY2hpbGQpICogY291bnQsIEdGUF9LRVJORUwpOwoJaWYgKCFkZXZfcHJpdi0+Y2hpbGRfZGV2KSB7CgkJRFJNX0RFQlVHX0tNUygiTm8gbWVtb3J5IHNwYWNlIGZvciBjaGlsZCBkZXZpY2VcbiIpOwoJCXJldHVybjsKCX0KCglkZXZfcHJpdi0+Y2hpbGRfZGV2X251bSA9IGNvdW50OwoJY291bnQgPSAwOwoJZm9yIChpID0gMDsgaSA8IGNoaWxkX2RldmljZV9udW07IGkrKykgewoJCXBfY2hpbGQgPSAmKHBfZGVmcy0+ZGV2aWNlc1tpXSk7CgkJaWYgKCFwX2NoaWxkLT5kZXZpY2VfdHlwZSkgewoJCQkvKiBza2lwIHRoZSBkZXZpY2UgYmxvY2sgaWYgZGV2aWNlIHR5cGUgaXMgaW52YWxpZCAqLwoJCQljb250aW51ZTsKCQl9CgkJY2hpbGRfZGV2X3B0ciA9IGRldl9wcml2LT5jaGlsZF9kZXYgKyBjb3VudDsKCQljb3VudCsrOwoJCW1lbWNweSgodm9pZCAqKWNoaWxkX2Rldl9wdHIsICh2b2lkICopcF9jaGlsZCwKCQkJCQlzaXplb2YoKnBfY2hpbGQpKTsKCX0KCXJldHVybjsKfQovKioKICogaW50ZWxfaW5pdF9iaW9zIC0gaW5pdGlhbGl6ZSBWQklPUyBzZXR0aW5ncyAmIGZpbmQgVkJUCiAqIEBkZXY6IERSTSBkZXZpY2UKICoKICogTG9hZHMgdGhlIFZpZGVvIEJJT1MgYW5kIGNoZWNrcyB0aGF0IHRoZSBWQlQgZXhpc3RzLiAgU2V0cyBzY3JhdGNoIHJlZ2lzdGVycwogKiB0byBhcHByb3ByaWF0ZSB2YWx1ZXMuCiAqCiAqIFZCVCBleGlzdGVuY2UgaXMgYSBzYW5pdHkgY2hlY2sgdGhhdCBpcyByZWxpZWQgb24gYnkgb3RoZXIgaTgzMF9iaW9zLmMgY29kZS4KICogTm90ZSB0aGF0IGl0IHdvdWxkIGJlIGJldHRlciB0byB1c2UgYSBCSU9TIGNhbGwgdG8gZ2V0IHRoZSBWQlQsIGFzIEJJT1NlcyBtYXkKICogZmVlZCBhbiB1cGRhdGVkIFZCVCBiYWNrIHRocm91Z2ggdGhhdCwgY29tcGFyZWQgdG8gd2hhdCB3ZSdsbCBmZXRjaCB1c2luZwogKiB0aGlzIG1ldGhvZCBvZiBncm9waW5nIGFyb3VuZCBpbiB0aGUgQklPUyBkYXRhLgogKgogKiBSZXR1cm5zIDAgb24gc3VjY2Vzcywgbm9uemVybyBvbiBmYWlsdXJlLgogKi8KYm9vbAppbnRlbF9pbml0X2Jpb3Moc3RydWN0IGRybV9kZXZpY2UgKmRldikKewoJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZGV2LT5wZGV2OwoJc3RydWN0IHZidF9oZWFkZXIgKnZidCA9IE5VTEw7CglzdHJ1Y3QgYmRiX2hlYWRlciAqYmRiOwoJdTggX19pb21lbSAqYmlvczsKCXNpemVfdCBzaXplOwoJaW50IGk7CgoJYmlvcyA9IHBjaV9tYXBfcm9tKHBkZXYsICZzaXplKTsKCWlmICghYmlvcykKCQlyZXR1cm4gLTE7CgoJLyogU2NvdXIgbWVtb3J5IGxvb2tpbmcgZm9yIHRoZSBWQlQgc2lnbmF0dXJlICovCglmb3IgKGkgPSAwOyBpICsgNCA8IHNpemU7IGkrKykgewoJCWlmICghbWVtY21wKGJpb3MgKyBpLCAiJFZCVCIsIDQpKSB7CgkJCXZidCA9IChzdHJ1Y3QgdmJ0X2hlYWRlciAqKShiaW9zICsgaSk7CgkJCWJyZWFrOwoJCX0KCX0KCglpZiAoIXZidCkgewoJCURSTV9FUlJPUigiVkJUIHNpZ25hdHVyZSBtaXNzaW5nXG4iKTsKCQlwY2lfdW5tYXBfcm9tKHBkZXYsIGJpb3MpOwoJCXJldHVybiAtMTsKCX0KCgliZGIgPSAoc3RydWN0IGJkYl9oZWFkZXIgKikoYmlvcyArIGkgKyB2YnQtPmJkYl9vZmZzZXQpOwoKCS8qIEdyYWIgdXNlZnVsIGdlbmVyYWwgZGVmaW5pdGlvbnMgKi8KCXBhcnNlX2dlbmVyYWxfZmVhdHVyZXMoZGV2X3ByaXYsIGJkYik7CglwYXJzZV9nZW5lcmFsX2RlZmluaXRpb25zKGRldl9wcml2LCBiZGIpOwoJcGFyc2VfbGZwX3BhbmVsX2RhdGEoZGV2X3ByaXYsIGJkYik7CglwYXJzZV9zZHZvX3BhbmVsX2RhdGEoZGV2X3ByaXYsIGJkYik7CglwYXJzZV9zZHZvX2RldmljZV9tYXBwaW5nKGRldl9wcml2LCBiZGIpOwoJcGFyc2VfZGV2aWNlX21hcHBpbmcoZGV2X3ByaXYsIGJkYik7CglwYXJzZV9kcml2ZXJfZmVhdHVyZXMoZGV2X3ByaXYsIGJkYik7CglwYXJzZV9lZHAoZGV2X3ByaXYsIGJkYik7CgoJcGNpX3VubWFwX3JvbShwZGV2LCBiaW9zKTsKCglyZXR1cm4gMDsKfQo=